1#!/usr/bin/env vpython3 2# Copyright 2021 The Chromium Authors 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6# pylint: disable=protected-access 7 8import tempfile 9import typing 10import unittest 11 12from pyfakefs import fake_filesystem_unittest # pylint: disable=import-error 13 14from flake_suppressor_common import result_output 15 16 17class GenerateHtmlOutputFileUnittest(fake_filesystem_unittest.TestCase): 18 def setUp(self) -> None: 19 self.setUpPyfakefs() 20 self.output_file = tempfile.NamedTemporaryFile(mode='w', delete=False) 21 self.output_file_name = self.output_file.name 22 23 def testBasic(self) -> None: 24 """Basic functionality test.""" 25 result_map = { 26 'some_suite': { 27 'some_test': { 28 ('some', 'tags'): ['url1', 'url2'], 29 }, 30 }, 31 } 32 result_output.GenerateHtmlOutputFile(result_map, self.output_file) 33 expected_output = """\ 34<html> 35<body> 36<h1>Grouped By Test</h1> 37<ul> 38<li>some_suite</li> 39<ul> 40<li>some_test</li> 41<ul> 42<li>some tags</li> 43<ul> 44<li><a href="url1">url1</a></li> 45<li><a href="url2">url2</a></li> 46</ul> 47</ul> 48</ul> 49</ul> 50<h1>Grouped By Config</h1> 51<ul> 52<li>some tags</li> 53<ul> 54<li>some_suite</li> 55<ul> 56<li>some_test</li> 57<ul> 58<li><a href="url1">url1</a></li> 59<li><a href="url2">url2</a></li> 60</ul> 61</ul> 62</ul> 63</ul> 64</body> 65</html> 66""" 67 with open(self.output_file_name) as infile: 68 self.assertEqual(infile.read(), expected_output) 69 70 71class RecursiveHtmlToFileUnittest(fake_filesystem_unittest.TestCase): 72 def setUp(self) -> None: 73 self.setUpPyfakefs() 74 self.output_file = tempfile.NamedTemporaryFile(mode='w', delete=False) 75 self.output_file_name = self.output_file.name 76 77 def testBasic(self) -> None: 78 """Basic functionality test.""" 79 string_map = { 80 'some_suite': { 81 'some_test': { 82 'some tags': ['url1', 'url2'], 83 }, 84 }, 85 } 86 result_output._RecursiveHtmlToFile(string_map, self.output_file) 87 self.output_file.close() 88 expected_output = """\ 89<li>some_suite</li> 90<ul> 91<li>some_test</li> 92<ul> 93<li>some tags</li> 94<ul> 95<li><a href="url1">url1</a></li> 96<li><a href="url2">url2</a></li> 97</ul> 98</ul> 99</ul> 100""" 101 with open(self.output_file_name) as infile: 102 self.assertEqual(infile.read(), expected_output) 103 104 def testUnsupportedType(self) -> None: 105 """Tests that providing an unsupported data type fails.""" 106 fake_node = typing.cast(result_output.NodeType, 'a') 107 with self.assertRaises(RuntimeError): 108 result_output._RecursiveHtmlToFile(fake_node, self.output_file) 109 110 111class ConvertAggregatedResultsToStringMapUnittest(unittest.TestCase): 112 def testBasic(self) -> None: 113 """Basic functionality test.""" 114 result_map = { 115 'some_suite': { 116 'some_test': { 117 ('some', 'tags'): ['url1', 'url2'], 118 }, 119 }, 120 } 121 expected_map = { 122 'some_suite': { 123 'some_test': { 124 'some tags': ['url1', 'url2'], 125 }, 126 }, 127 } 128 self.assertEqual( 129 result_output._ConvertAggregatedResultsToStringMap(result_map), 130 expected_map) 131 132 133class ConvertFromTestGroupingToConfigGroupingUnittest(unittest.TestCase): 134 def testBasic(self) -> None: 135 """Basic functionality test.""" 136 string_map = { 137 'some_suite': { 138 'some_test': { 139 'some tags': ['url1', 'url2'], 140 }, 141 }, 142 } 143 config_map = result_output._ConvertFromTestGroupingToConfigGrouping( 144 string_map) 145 expected_config_map = { 146 'some tags': { 147 'some_suite': { 148 'some_test': ['url1', 'url2'], 149 }, 150 }, 151 } 152 self.assertEqual(config_map, expected_config_map) 153 154 155if __name__ == '__main__': 156 unittest.main(verbosity=2) 157