1 #!/usr/bin/env python3.4 2 # 3 # Copyright 2016 - The Android Open Source Project 4 # 5 # Licensed under the Apache License, Version 2.0 (the "License"); 6 # you may not use this file except in compliance with the License. 7 # You may obtain a copy of the License at 8 # 9 # http://www.apache.org/licenses/LICENSE-2.0 10 # 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 # See the License for the specific language governing permissions and 15 # limitations under the License. 16 17 import unittest 18 19 from acts import records 20 from acts import signals 21 22 23 class ActsRecordsTest(unittest.TestCase): 24 """This test class tests the implementation of classes in acts.records. 25 """ 26 27 def setUp(self): 28 self.tn = "test_name" 29 self.details = "Some details about the test execution." 30 self.float_extra = 12345.56789 31 self.json_extra = {"ha": "whatever"} 32 33 def verify_record(self, record, result, details, extras): 34 # Verify each field. 35 self.assertEqual(record.test_name, self.tn) 36 self.assertEqual(record.result, result) 37 self.assertEqual(record.details, details) 38 self.assertEqual(record.extras, extras) 39 self.assertTrue(record.begin_time, "begin time should not be empty.") 40 self.assertTrue(record.end_time, "end time should not be empty.") 41 # UID is not used at the moment, should always be None. 42 self.assertIsNone(record.uid) 43 # Verify to_dict. 44 d = {} 45 d[records.TestResultEnums.RECORD_NAME] = self.tn 46 d[records.TestResultEnums.RECORD_RESULT] = result 47 d[records.TestResultEnums.RECORD_DETAILS] = details 48 d[records.TestResultEnums.RECORD_EXTRAS] = extras 49 d[records.TestResultEnums.RECORD_BEGIN_TIME] = record.begin_time 50 d[records.TestResultEnums.RECORD_END_TIME] = record.end_time 51 d[records.TestResultEnums.RECORD_UID] = None 52 d[records.TestResultEnums.RECORD_CLASS] = None 53 d[records.TestResultEnums.RECORD_EXTRA_ERRORS] = {} 54 actual_d = record.to_dict() 55 self.assertDictEqual(actual_d, d) 56 # Verify that these code paths do not cause crashes and yield non-empty 57 # results. 58 self.assertTrue(str(record), "str of the record should not be empty.") 59 self.assertTrue(repr(record), "the record's repr shouldn't be empty.") 60 self.assertTrue(record.json_str(), ("json str of the record should " 61 "not be empty.")) 62 63 """ Begin of Tests """ 64 65 def test_result_record_pass_none(self): 66 record = records.TestResultRecord(self.tn) 67 record.test_begin() 68 record.test_pass() 69 self.verify_record( 70 record=record, 71 result=records.TestResultEnums.TEST_RESULT_PASS, 72 details=None, 73 extras=None) 74 75 def test_result_record_pass_with_float_extra(self): 76 record = records.TestResultRecord(self.tn) 77 record.test_begin() 78 s = signals.TestPass(self.details, self.float_extra) 79 record.test_pass(s) 80 self.verify_record( 81 record=record, 82 result=records.TestResultEnums.TEST_RESULT_PASS, 83 details=self.details, 84 extras=self.float_extra) 85 86 def test_result_record_pass_with_json_extra(self): 87 record = records.TestResultRecord(self.tn) 88 record.test_begin() 89 s = signals.TestPass(self.details, self.json_extra) 90 record.test_pass(s) 91 self.verify_record( 92 record=record, 93 result=records.TestResultEnums.TEST_RESULT_PASS, 94 details=self.details, 95 extras=self.json_extra) 96 97 def test_result_record_fail_none(self): 98 record = records.TestResultRecord(self.tn) 99 record.test_begin() 100 record.test_fail() 101 self.verify_record( 102 record=record, 103 result=records.TestResultEnums.TEST_RESULT_FAIL, 104 details=None, 105 extras=None) 106 107 def test_result_record_fail_with_float_extra(self): 108 record = records.TestResultRecord(self.tn) 109 record.test_begin() 110 s = signals.TestFailure(self.details, self.float_extra) 111 record.test_fail(s) 112 self.verify_record( 113 record=record, 114 result=records.TestResultEnums.TEST_RESULT_FAIL, 115 details=self.details, 116 extras=self.float_extra) 117 118 def test_result_record_fail_with_json_extra(self): 119 record = records.TestResultRecord(self.tn) 120 record.test_begin() 121 s = signals.TestFailure(self.details, self.json_extra) 122 record.test_fail(s) 123 self.verify_record( 124 record=record, 125 result=records.TestResultEnums.TEST_RESULT_FAIL, 126 details=self.details, 127 extras=self.json_extra) 128 129 def test_result_record_skip_none(self): 130 record = records.TestResultRecord(self.tn) 131 record.test_begin() 132 record.test_skip() 133 self.verify_record( 134 record=record, 135 result=records.TestResultEnums.TEST_RESULT_SKIP, 136 details=None, 137 extras=None) 138 139 def test_result_record_skip_with_float_extra(self): 140 record = records.TestResultRecord(self.tn) 141 record.test_begin() 142 s = signals.TestSkip(self.details, self.float_extra) 143 record.test_skip(s) 144 self.verify_record( 145 record=record, 146 result=records.TestResultEnums.TEST_RESULT_SKIP, 147 details=self.details, 148 extras=self.float_extra) 149 150 def test_result_record_skip_with_json_extra(self): 151 record = records.TestResultRecord(self.tn) 152 record.test_begin() 153 s = signals.TestSkip(self.details, self.json_extra) 154 record.test_skip(s) 155 self.verify_record( 156 record=record, 157 result=records.TestResultEnums.TEST_RESULT_SKIP, 158 details=self.details, 159 extras=self.json_extra) 160 161 def test_result_add_operator_success(self): 162 record1 = records.TestResultRecord(self.tn) 163 record1.test_begin() 164 s = signals.TestPass(self.details, self.float_extra) 165 record1.test_pass(s) 166 tr1 = records.TestResult() 167 tr1.add_record(record1) 168 tr1.add_controller_info("MockDevice", ["magicA", "magicB"]) 169 record2 = records.TestResultRecord(self.tn) 170 record2.test_begin() 171 s = signals.TestPass(self.details, self.json_extra) 172 record2.test_pass(s) 173 tr2 = records.TestResult() 174 tr2.add_record(record2) 175 tr2.add_controller_info("MockDevice", ["magicC"]) 176 tr2 += tr1 177 self.assertTrue(tr2.passed, [tr1, tr2]) 178 self.assertTrue(tr2.controller_info, {"MockDevice": ["magicC"]}) 179 180 def test_result_add_operator_type_mismatch(self): 181 record1 = records.TestResultRecord(self.tn) 182 record1.test_begin() 183 s = signals.TestPass(self.details, self.float_extra) 184 record1.test_pass(s) 185 tr1 = records.TestResult() 186 tr1.add_record(record1) 187 expected_msg = "Operand .* of type .* is not a TestResult." 188 with self.assertRaisesRegexp(TypeError, expected_msg): 189 tr1 += "haha" 190 191 def test_is_all_pass(self): 192 s = signals.TestPass(self.details, self.float_extra) 193 record1 = records.TestResultRecord(self.tn) 194 record1.test_begin() 195 record1.test_pass(s) 196 s = signals.TestSkip(self.details, self.float_extra) 197 record2 = records.TestResultRecord(self.tn) 198 record2.test_begin() 199 record2.test_skip(s) 200 tr = records.TestResult() 201 tr.add_record(record1) 202 tr.add_record(record2) 203 tr.add_record(record1) 204 self.assertEqual(len(tr.passed), 2) 205 self.assertTrue(tr.is_all_pass) 206 207 def test_is_all_pass_negative(self): 208 s = signals.TestFailure(self.details, self.float_extra) 209 record1 = records.TestResultRecord(self.tn) 210 record1.test_begin() 211 record1.test_fail(s) 212 record2 = records.TestResultRecord(self.tn) 213 record2.test_begin() 214 record2.test_unknown(s) 215 tr = records.TestResult() 216 tr.add_record(record1) 217 tr.add_record(record2) 218 self.assertFalse(tr.is_all_pass) 219 220 221 if __name__ == "__main__": 222 unittest.main()