We can now parse exception statuses as well.
BUG= TEST= Review URL: https://webrtc-codereview.appspot.com/429002 git-svn-id: http://webrtc.googlecode.com/svn/trunk@1825 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
		| @@ -19,9 +19,18 @@ class FailedToParseBuildStatus(Exception): | |||||||
|   pass |   pass | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def _map_status(status): | ||||||
|  |   if status == 'exception': | ||||||
|  |     return 'failed' | ||||||
|  |   return status | ||||||
|  |  | ||||||
|  |  | ||||||
| def _parse_builds(revision, html): | def _parse_builds(revision, html): | ||||||
|   """Parses the bot list, which is a sequence of <td></td> lines. |   """Parses the bot list, which is a sequence of <td></td> lines. | ||||||
|  |  | ||||||
|  |      See contract for parse_tgrid_page for more information on how this function | ||||||
|  |      behaves. | ||||||
|  |  | ||||||
|      Example input: |      Example input: | ||||||
|      <td class="build success"><a href="builders/Android/builds/119">OK</a></td> |      <td class="build success"><a href="builders/Android/builds/119">OK</a></td> | ||||||
|      The first regular expression group captures Android, second 119, third OK. |      The first regular expression group captures Android, second 119, third OK. | ||||||
| @@ -29,10 +38,12 @@ def _parse_builds(revision, html): | |||||||
|   result = {} |   result = {} | ||||||
|  |  | ||||||
|   for match in re.finditer('<td.*?>.*?<a href="builders/(.+?)/builds/(\d+)">' |   for match in re.finditer('<td.*?>.*?<a href="builders/(.+?)/builds/(\d+)">' | ||||||
|                            '(OK|failed|building|warnings)</a>.*?</td>', |                            '(OK|failed|building|warnings|exception)' | ||||||
|  |                            '</a>.*?</td>', | ||||||
|                            html, re.DOTALL): |                            html, re.DOTALL): | ||||||
|     revision_and_bot_name = revision + "--" + match.group(1) |     revision_and_bot_name = revision + "--" + match.group(1) | ||||||
|     build_number_and_status = match.group(2) + "--" + match.group(3) |     build_number_and_status = match.group(2) + "--" + _map_status( | ||||||
|  |                                                           match.group(3)) | ||||||
|  |  | ||||||
|     result[revision_and_bot_name] = build_number_and_status |     result[revision_and_bot_name] = build_number_and_status | ||||||
|  |  | ||||||
| @@ -56,7 +67,8 @@ def parse_tgrid_page(html): | |||||||
|  |  | ||||||
|      Returns: A dictionary with <svn revision>--<bot name> mapped to |      Returns: A dictionary with <svn revision>--<bot name> mapped to | ||||||
|          <bot build number>--<status>, where status is either OK, failed, |          <bot build number>--<status>, where status is either OK, failed, | ||||||
|          building or warnings. |          building or warnings. The status may be 'exception' in the input, but | ||||||
|  |          we simply map that to failed. | ||||||
|   """ |   """ | ||||||
|   result = {} |   result = {} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -133,6 +133,15 @@ make chrome</td> | |||||||
| </tr> | </tr> | ||||||
| """ | """ | ||||||
|  |  | ||||||
|  | MINIMAL_EXCEPTION = """ | ||||||
|  | <tr> | ||||||
|  | <td valign="bottom" class="sourcestamp">1576</td> | ||||||
|  | <td class="build exception"> | ||||||
|  | <a href="builders/Chrome/builds/109">exception</a><br /> | ||||||
|  | Sync</td> | ||||||
|  | </tr> | ||||||
|  | """ | ||||||
|  |  | ||||||
| class TGridParserTest(unittest.TestCase): | class TGridParserTest(unittest.TestCase): | ||||||
|   def test_parser_throws_exception_on_empty_html(self): |   def test_parser_throws_exception_on_empty_html(self): | ||||||
|     self.assertRaises(tgrid_parser.FailedToParseBuildStatus, |     self.assertRaises(tgrid_parser.FailedToParseBuildStatus, | ||||||
| @@ -165,7 +174,7 @@ class TGridParserTest(unittest.TestCase): | |||||||
|     self.assertEqual('1576--Win32Debug', first_mapping[0]) |     self.assertEqual('1576--Win32Debug', first_mapping[0]) | ||||||
|     self.assertEqual('434--building', first_mapping[1]) |     self.assertEqual('434--building', first_mapping[1]) | ||||||
|  |  | ||||||
|   def test_parser_finds_warned_bot(self): |   def test_parser_finds_warnings(self): | ||||||
|     result = tgrid_parser.parse_tgrid_page(MINIMAL_WARNED) |     result = tgrid_parser.parse_tgrid_page(MINIMAL_WARNED) | ||||||
|  |  | ||||||
|     self.assertEqual(1, len(result), 'There is only one bot in the sample.') |     self.assertEqual(1, len(result), 'There is only one bot in the sample.') | ||||||
| @@ -174,6 +183,16 @@ class TGridParserTest(unittest.TestCase): | |||||||
|     self.assertEqual('1576--Chrome', first_mapping[0]) |     self.assertEqual('1576--Chrome', first_mapping[0]) | ||||||
|     self.assertEqual('109--warnings', first_mapping[1]) |     self.assertEqual('109--warnings', first_mapping[1]) | ||||||
|  |  | ||||||
|  |   def test_parser_finds_exception_and_maps_to_failed(self): | ||||||
|  |     result = tgrid_parser.parse_tgrid_page(MINIMAL_EXCEPTION) | ||||||
|  |  | ||||||
|  |     self.assertEqual(1, len(result), 'There is only one bot in the sample.') | ||||||
|  |     first_mapping = result.items()[0] | ||||||
|  |  | ||||||
|  |     self.assertEqual('1576--Chrome', first_mapping[0]) | ||||||
|  |     self.assertEqual('109--failed', first_mapping[1]) | ||||||
|  |  | ||||||
|  |  | ||||||
|   def test_parser_finds_all_bots_and_revisions(self): |   def test_parser_finds_all_bots_and_revisions(self): | ||||||
|     result = tgrid_parser.parse_tgrid_page(SAMPLE_FILE) |     result = tgrid_parser.parse_tgrid_page(SAMPLE_FILE) | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 phoglund@webrtc.org
					phoglund@webrtc.org