1#!/usr/bin/env python 2# Copyright 2016 the V8 project authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6import unittest 7 8import statusfile 9from utils import Freeze 10 11 12TEST_VARIABLES = { 13 'system': 'linux', 14 'mode': 'release', 15} 16 17 18TEST_STATUS_FILE = """ 19[ 20[ALWAYS, { 21 'foo/bar': [PASS, SKIP], 22 'baz/bar': [PASS, FAIL], 23 'foo/*': [PASS, SLOW], 24}], # ALWAYS 25 26['%s', { 27 'baz/bar': [PASS, SLOW], 28 'foo/*': [FAIL], 29}], 30] 31""" 32 33 34def make_variables(): 35 variables = {} 36 variables.update(TEST_VARIABLES) 37 return variables 38 39 40class UtilsTest(unittest.TestCase): 41 def test_freeze(self): 42 self.assertEqual(2, Freeze({1: [2]})[1][0]) 43 self.assertEqual(set([3]), Freeze({1: [2], 2: set([3])})[2]) 44 45 with self.assertRaises(Exception): 46 Freeze({1: [], 2: set([3])})[2] = 4 47 with self.assertRaises(Exception): 48 Freeze({1: [], 2: set([3])}).update({3: 4}) 49 with self.assertRaises(Exception): 50 Freeze({1: [], 2: set([3])})[1].append(2) 51 with self.assertRaises(Exception): 52 Freeze({1: [], 2: set([3])})[2] |= set([3]) 53 54 # Sanity check that we can do the same calls on a non-frozen object. 55 {1: [], 2: set([3])}[2] = 4 56 {1: [], 2: set([3])}.update({3: 4}) 57 {1: [], 2: set([3])}[1].append(2) 58 {1: [], 2: set([3])}[2] |= set([3]) 59 60 61class StatusFileTest(unittest.TestCase): 62 def test_eval_expression(self): 63 variables = make_variables() 64 variables.update(statusfile.VARIABLES) 65 66 self.assertTrue( 67 statusfile._EvalExpression( 68 'system==linux and mode==release', variables)) 69 self.assertTrue( 70 statusfile._EvalExpression( 71 'system==linux or variant==default', variables)) 72 self.assertFalse( 73 statusfile._EvalExpression( 74 'system==linux and mode==debug', variables)) 75 self.assertRaises( 76 AssertionError, 77 lambda: statusfile._EvalExpression( 78 'system==linux and mode==foo', variables)) 79 self.assertRaises( 80 SyntaxError, 81 lambda: statusfile._EvalExpression( 82 'system==linux and mode=release', variables)) 83 self.assertEquals( 84 statusfile.VARIANT_EXPRESSION, 85 statusfile._EvalExpression( 86 'system==linux and variant==default', variables) 87 ) 88 89 def test_read_statusfile_section_true(self): 90 rules, prefix_rules = statusfile.ReadStatusFile( 91 TEST_STATUS_FILE % 'system==linux', make_variables()) 92 93 self.assertEquals( 94 { 95 'foo/bar': set(['PASS', 'SKIP']), 96 'baz/bar': set(['PASS', 'FAIL', 'SLOW']), 97 }, 98 rules[''], 99 ) 100 self.assertEquals( 101 { 102 'foo/': set(['SLOW', 'FAIL']), 103 }, 104 prefix_rules[''], 105 ) 106 self.assertEquals({}, rules['default']) 107 self.assertEquals({}, prefix_rules['default']) 108 109 def test_read_statusfile_section_false(self): 110 rules, prefix_rules = statusfile.ReadStatusFile( 111 TEST_STATUS_FILE % 'system==windows', make_variables()) 112 113 self.assertEquals( 114 { 115 'foo/bar': set(['PASS', 'SKIP']), 116 'baz/bar': set(['PASS', 'FAIL']), 117 }, 118 rules[''], 119 ) 120 self.assertEquals( 121 { 122 'foo/': set(['PASS', 'SLOW']), 123 }, 124 prefix_rules[''], 125 ) 126 self.assertEquals({}, rules['default']) 127 self.assertEquals({}, prefix_rules['default']) 128 129 def test_read_statusfile_section_variant(self): 130 rules, prefix_rules = statusfile.ReadStatusFile( 131 TEST_STATUS_FILE % 'system==linux and variant==default', 132 make_variables(), 133 ) 134 135 self.assertEquals( 136 { 137 'foo/bar': set(['PASS', 'SKIP']), 138 'baz/bar': set(['PASS', 'FAIL']), 139 }, 140 rules[''], 141 ) 142 self.assertEquals( 143 { 144 'foo/': set(['PASS', 'SLOW']), 145 }, 146 prefix_rules[''], 147 ) 148 self.assertEquals( 149 { 150 'baz/bar': set(['PASS', 'SLOW']), 151 }, 152 rules['default'], 153 ) 154 self.assertEquals( 155 { 156 'foo/': set(['FAIL']), 157 }, 158 prefix_rules['default'], 159 ) 160 161 162if __name__ == '__main__': 163 unittest.main() 164