You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

191 lines
5.5 KiB

  1. #!/usr/bin/env python
  2. # Copyright 2018, Google Inc.
  3. # All rights reserved.
  4. #
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions are
  7. # met:
  8. #
  9. # * Redistributions of source code must retain the above copyright
  10. # notice, this list of conditions and the following disclaimer.
  11. # * Redistributions in binary form must reproduce the above
  12. # copyright notice, this list of conditions and the following disclaimer
  13. # in the documentation and/or other materials provided with the
  14. # distribution.
  15. # * Neither the name of Google Inc. nor the names of its
  16. # contributors may be used to endorse or promote products derived from
  17. # this software without specific prior written permission.
  18. #
  19. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  23. # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27. # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. """Unit test for the gtest_json_output module."""
  31. import json
  32. import os
  33. import gtest_json_test_utils
  34. import gtest_test_utils
  35. GTEST_OUTPUT_SUBDIR = 'json_outfiles'
  36. GTEST_OUTPUT_1_TEST = 'gtest_xml_outfile1_test_'
  37. GTEST_OUTPUT_2_TEST = 'gtest_xml_outfile2_test_'
  38. EXPECTED_1 = {
  39. u'tests':
  40. 1,
  41. u'failures':
  42. 0,
  43. u'disabled':
  44. 0,
  45. u'errors':
  46. 0,
  47. u'time':
  48. u'*',
  49. u'timestamp':
  50. u'*',
  51. u'name':
  52. u'AllTests',
  53. u'testsuites': [{
  54. u'name':
  55. u'PropertyOne',
  56. u'tests':
  57. 1,
  58. u'failures':
  59. 0,
  60. u'disabled':
  61. 0,
  62. u'errors':
  63. 0,
  64. u'time':
  65. u'*',
  66. u'timestamp':
  67. u'*',
  68. u'testsuite': [{
  69. u'name': u'TestSomeProperties',
  70. u'status': u'RUN',
  71. u'result': u'COMPLETED',
  72. u'time': u'*',
  73. u'timestamp': u'*',
  74. u'classname': u'PropertyOne',
  75. u'SetUpProp': u'1',
  76. u'TestSomeProperty': u'1',
  77. u'TearDownProp': u'1',
  78. }],
  79. }],
  80. }
  81. EXPECTED_2 = {
  82. u'tests':
  83. 1,
  84. u'failures':
  85. 0,
  86. u'disabled':
  87. 0,
  88. u'errors':
  89. 0,
  90. u'time':
  91. u'*',
  92. u'timestamp':
  93. u'*',
  94. u'name':
  95. u'AllTests',
  96. u'testsuites': [{
  97. u'name':
  98. u'PropertyTwo',
  99. u'tests':
  100. 1,
  101. u'failures':
  102. 0,
  103. u'disabled':
  104. 0,
  105. u'errors':
  106. 0,
  107. u'time':
  108. u'*',
  109. u'timestamp':
  110. u'*',
  111. u'testsuite': [{
  112. u'name': u'TestSomeProperties',
  113. u'status': u'RUN',
  114. u'result': u'COMPLETED',
  115. u'timestamp': u'*',
  116. u'time': u'*',
  117. u'classname': u'PropertyTwo',
  118. u'SetUpProp': u'2',
  119. u'TestSomeProperty': u'2',
  120. u'TearDownProp': u'2',
  121. }],
  122. }],
  123. }
  124. class GTestJsonOutFilesTest(gtest_test_utils.TestCase):
  125. """Unit test for Google Test's JSON output functionality."""
  126. def setUp(self):
  127. # We want the trailing '/' that the last "" provides in os.path.join, for
  128. # telling Google Test to create an output directory instead of a single file
  129. # for xml output.
  130. self.output_dir_ = os.path.join(gtest_test_utils.GetTempDir(),
  131. GTEST_OUTPUT_SUBDIR, '')
  132. self.DeleteFilesAndDir()
  133. def tearDown(self):
  134. self.DeleteFilesAndDir()
  135. def DeleteFilesAndDir(self):
  136. try:
  137. os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_1_TEST + '.json'))
  138. except os.error:
  139. pass
  140. try:
  141. os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_2_TEST + '.json'))
  142. except os.error:
  143. pass
  144. try:
  145. os.rmdir(self.output_dir_)
  146. except os.error:
  147. pass
  148. def testOutfile1(self):
  149. self._TestOutFile(GTEST_OUTPUT_1_TEST, EXPECTED_1)
  150. def testOutfile2(self):
  151. self._TestOutFile(GTEST_OUTPUT_2_TEST, EXPECTED_2)
  152. def _TestOutFile(self, test_name, expected):
  153. gtest_prog_path = gtest_test_utils.GetTestExecutablePath(test_name)
  154. command = [gtest_prog_path, '--gtest_output=json:%s' % self.output_dir_]
  155. p = gtest_test_utils.Subprocess(command,
  156. working_dir=gtest_test_utils.GetTempDir())
  157. self.assert_(p.exited)
  158. self.assertEquals(0, p.exit_code)
  159. output_file_name1 = test_name + '.json'
  160. output_file1 = os.path.join(self.output_dir_, output_file_name1)
  161. output_file_name2 = 'lt-' + output_file_name1
  162. output_file2 = os.path.join(self.output_dir_, output_file_name2)
  163. self.assert_(os.path.isfile(output_file1) or os.path.isfile(output_file2),
  164. output_file1)
  165. if os.path.isfile(output_file1):
  166. with open(output_file1) as f:
  167. actual = json.load(f)
  168. else:
  169. with open(output_file2) as f:
  170. actual = json.load(f)
  171. self.assertEqual(expected, gtest_json_test_utils.normalize(actual))
  172. if __name__ == '__main__':
  173. os.environ['GTEST_STACK_TRACE_DEPTH'] = '0'
  174. gtest_test_utils.Main()