1# Copyright 2017 The Abseil Authors. 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15"""Helper binary for absltest_test.py.""" 16 17import os 18import tempfile 19import unittest 20 21from absl import app 22from absl import flags 23from absl.testing import absltest 24 25FLAGS = flags.FLAGS 26 27_TEST_ID = flags.DEFINE_integer('test_id', 0, 'Which test to run.') 28_NAME = flags.DEFINE_multi_string('name', [], 'List of names to print.') 29 30 31@flags.validator('name') 32def validate_name(value): 33 # This validator makes sure that the second FLAGS(sys.argv) inside 34 # absltest.main() won't actually trigger side effects of the flag parsing. 35 if len(value) > 2: 36 raise flags.ValidationError( 37 f'No more than two names should be specified, found {len(value)} names') 38 return True 39 40 41class HelperTest(absltest.TestCase): 42 43 def test_flags(self): 44 if _TEST_ID.value == 1: 45 self.assertEqual(FLAGS.test_random_seed, 301) 46 if os.name == 'nt': 47 # On Windows, it's always in the temp dir, which doesn't start with '/'. 48 expected_prefix = tempfile.gettempdir() 49 else: 50 expected_prefix = '/' 51 self.assertTrue( 52 absltest.TEST_TMPDIR.value.startswith(expected_prefix), 53 '--test_tmpdir={} does not start with {}'.format( 54 absltest.TEST_TMPDIR.value, expected_prefix)) 55 self.assertTrue(os.access(absltest.TEST_TMPDIR.value, os.W_OK)) 56 elif _TEST_ID.value == 2: 57 self.assertEqual(FLAGS.test_random_seed, 321) 58 self.assertEqual( 59 absltest.TEST_SRCDIR.value, 60 os.environ['ABSLTEST_TEST_HELPER_EXPECTED_TEST_SRCDIR']) 61 self.assertEqual( 62 absltest.TEST_TMPDIR.value, 63 os.environ['ABSLTEST_TEST_HELPER_EXPECTED_TEST_TMPDIR']) 64 elif _TEST_ID.value == 3: 65 self.assertEqual(FLAGS.test_random_seed, 123) 66 self.assertEqual( 67 absltest.TEST_SRCDIR.value, 68 os.environ['ABSLTEST_TEST_HELPER_EXPECTED_TEST_SRCDIR']) 69 self.assertEqual( 70 absltest.TEST_TMPDIR.value, 71 os.environ['ABSLTEST_TEST_HELPER_EXPECTED_TEST_TMPDIR']) 72 elif _TEST_ID.value == 4: 73 self.assertEqual(FLAGS.test_random_seed, 221) 74 self.assertEqual( 75 absltest.TEST_SRCDIR.value, 76 os.environ['ABSLTEST_TEST_HELPER_EXPECTED_TEST_SRCDIR']) 77 self.assertEqual( 78 absltest.TEST_TMPDIR.value, 79 os.environ['ABSLTEST_TEST_HELPER_EXPECTED_TEST_TMPDIR']) 80 else: 81 raise unittest.SkipTest( 82 'Not asked to run: --test_id={}'.format(_TEST_ID.value)) 83 84 @unittest.expectedFailure 85 def test_expected_failure(self): 86 if _TEST_ID.value == 5: 87 self.assertEqual(1, 1) # Expected failure, got success. 88 else: 89 self.assertEqual(1, 2) # The expected failure. 90 91 def test_xml_env_vars(self): 92 if _TEST_ID.value == 6: 93 self.assertEqual( 94 FLAGS.xml_output_file, 95 os.environ['ABSLTEST_TEST_HELPER_EXPECTED_XML_OUTPUT_FILE']) 96 else: 97 raise unittest.SkipTest( 98 'Not asked to run: --test_id={}'.format(_TEST_ID.value)) 99 100 def test_name_flag(self): 101 if _TEST_ID.value == 7: 102 print('Names in test_name_flag() are:', ' '.join(_NAME.value)) 103 else: 104 raise unittest.SkipTest( 105 'Not asked to run: --test_id={}'.format(_TEST_ID.value)) 106 107 108class TempFileHelperTest(absltest.TestCase): 109 """Helper test case for tempfile cleanup tests.""" 110 111 tempfile_cleanup = absltest.TempFileCleanup[os.environ.get( 112 'ABSLTEST_TEST_HELPER_TEMPFILE_CLEANUP', 'SUCCESS')] 113 114 def test_failure(self): 115 self.create_tempfile('failure') 116 self.fail('expected failure') 117 118 def test_success(self): 119 self.create_tempfile('success') 120 121 def test_subtest_failure(self): 122 self.create_tempfile('parent') 123 with self.subTest('success'): 124 self.create_tempfile('successful_child') 125 with self.subTest('failure'): 126 self.create_tempfile('failed_child') 127 self.fail('expected failure') 128 129 def test_subtest_success(self): 130 self.create_tempfile('parent') 131 for i in range(2): 132 with self.subTest(f'success{i}'): 133 self.create_tempfile(f'child{i}') 134 135 136def main(argv): 137 del argv # Unused. 138 print('Names in main() are:', ' '.join(_NAME.value)) 139 absltest.main() 140 141 142if __name__ == '__main__': 143 if os.environ.get('ABSLTEST_TEST_HELPER_USE_APP_RUN'): 144 app.run(main) 145 else: 146 absltest.main() 147