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