summaryrefslogtreecommitdiffstats
path: root/testing/talos/tests/test_browser_output.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/talos/tests/test_browser_output.py')
-rw-r--r--testing/talos/tests/test_browser_output.py190
1 files changed, 190 insertions, 0 deletions
diff --git a/testing/talos/tests/test_browser_output.py b/testing/talos/tests/test_browser_output.py
new file mode 100644
index 000000000..7b95733c0
--- /dev/null
+++ b/testing/talos/tests/test_browser_output.py
@@ -0,0 +1,190 @@
+#!/usr/bin/env python
+
+"""
+test talos browser output parsing
+"""
+
+import os
+import unittest
+
+from talos.results import BrowserLogResults
+from talos.results import PageloaderResults
+from talos.utils import TalosError
+
+here = os.path.dirname(os.path.abspath(__file__))
+
+
+class TestBrowserOutput(unittest.TestCase):
+
+ def test_ts_format(self):
+
+ # output file
+ browser_ts = os.path.join(here, 'browser_output.ts.txt')
+
+ # parse the results
+ browser_log = BrowserLogResults(browser_ts)
+
+ # ensure the results meet what we expect
+ self.assertEqual(browser_log.format, 'tsformat')
+ self.assertEqual(browser_log.browser_results.strip(), '392')
+ self.assertEqual(browser_log.startTime, 1333663595953)
+ self.assertEqual(browser_log.endTime, 1333663596551)
+
+ def test_tsvg_format(self):
+
+ # output file
+ browser_tsvg = os.path.join(here, 'browser_output.tsvg.txt')
+
+ # parse the results
+ browser_log = BrowserLogResults(browser_tsvg)
+
+ # ensure the results meet what we expect
+ self.assertEqual(browser_log.format, 'tpformat')
+ self.assertEqual(browser_log.startTime, 1333666702130)
+ self.assertEqual(browser_log.endTime, 1333666702743)
+
+ # we won't validate the exact string because it is long
+ raw_report = browser_log.browser_results.strip()
+ raw_report.startswith('_x_x_mozilla_page_load')
+ raw_report.endswith('|11;hixie-007.xml;1629;1651;1648;1652;1649')
+
+ # but we will ensure that it is parseable
+ pageloader_results = PageloaderResults(raw_report)
+ self.assertEqual(len(pageloader_results.results), 12)
+ indices = [i['index'] for i in pageloader_results.results]
+ self.assertEqual(indices, range(12))
+
+ # test hixie-001.xml just as a spot-check
+ hixie_001 = pageloader_results.results[5]
+ expected_values = [45643, 14976, 17807, 14971, 17235]
+ self.assertEqual(hixie_001['runs'], expected_values)
+ self.assertEqual(hixie_001['page'], 'hixie-001.xml')
+
+ def test_garbage(self):
+ """
+ send in garbage input and ensure the output is the
+ inability to find the report
+ """
+
+ garbage = "hjksdfhkhasdfjkhsdfkhdfjklasd"
+ self.compare_error_message(garbage, "Could not find report")
+
+ def test_missing_end_report(self):
+ """what if you're not done with a report?"""
+ garbage = "hjksdfhkhasdfjkhsdfkhdfjklasd"
+
+ input = self.start_report()
+ input += garbage
+ self.compare_error_message(input, "Could not find end token: '__end_report'")
+
+ def test_double_end_report(self):
+ """double end report tokens"""
+
+ garbage = "hjksdfhkhasdfjkhsdfkhdfjklasd"
+ input = self.start_report() + garbage + self.end_report() + self.end_report()
+ self.compare_error_message(input, "Unmatched number of tokens")
+
+ def test_end_report_before_start_report(self):
+ """the end report token occurs before the start report token"""
+
+ garbage = "hjksdfhkhasdfjkhsdfkhdfjklasd"
+ input = self.end_report() + garbage + self.start_report()
+ self.compare_error_message(input,
+ "End token '%s' occurs before start token" %
+ self.end_report())
+
+ def test_missing_timestamps(self):
+ """what if the timestamps are missing?"""
+
+ # make a bogus report but missing the timestamps
+ garbage = "hjksdfhkhasdfjkhsdfkhdfjklasd"
+ input = self.start_report() + garbage + self.end_report()
+
+ # it will fail
+ self.compare_error_message(input, "Could not find startTime in browser output")
+
+ def test_wrong_order(self):
+ """what happens if you mix up the token order?"""
+
+ # i've secretly put the AfterTerminationTimestamp before
+ # the BeforeLaunchTimestamp
+ # Let's see if the parser notices
+ bad_report = """__start_report392__end_report
+
+Failed to load native module at path '/home/jhammel/firefox/components/libmozgnome.so':
+(80004005) libnotify.so.1: cannot open shared object file: No such file or directory
+Could not read chrome manifest
+'file:///home/jhammel/firefox/extensions/%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D/chrome.manifest'.
+[JavaScript Warning: "Use of enablePrivilege is deprecated.
+Please use code that runs with the system principal (e.g. an extension) instead.
+" {file: "http://localhost:15707/startup_test/startup_test.html?begin=1333663595557" line: 0}]
+__startTimestamp1333663595953__endTimestamp
+__startAfterTerminationTimestamp1333663596551__endAfterTerminationTimestamp
+__startBeforeLaunchTimestamp1333663595557__endBeforeLaunchTimestamp
+"""
+
+ self.compare_error_message(bad_report, "] found before " +
+ "('__startBeforeLaunchTimestamp', " +
+ "'__endBeforeLaunchTimestamp') " +
+ "[character position:")
+
+ def test_multiple_reports(self):
+ """you're only allowed to have one report in a file"""
+
+ # this one works fine
+ good_report = """__start_report392__end_report
+
+Failed to load native module at path '/home/jhammel/firefox/components/libmozgnome.so':
+(80004005) libnotify.so.1: cannot open shared object file: No such file or directory
+Could not read chrome manifest
+'file:///home/jhammel/firefox/extensions/%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D/chrome.manifest'.
+[JavaScript Warning: "Use of enablePrivilege is deprecated.
+Please use code that runs with the system principal (e.g. an extension) instead.
+" {file: "http://localhost:15707/startup_test/startup_test.html?begin=1333663595557" line: 0}]
+__startTimestamp1333663595953__endTimestamp
+__startBeforeLaunchTimestamp1333663595557__endBeforeLaunchTimestamp
+__startAfterTerminationTimestamp1333663596551__endAfterTerminationTimestamp
+"""
+
+ # but there's no hope for this one
+ bad_report = good_report + good_report # interesting math
+
+ self.compare_error_message(bad_report, "Multiple matches for %s,%s" %
+ (self.start_report(), self.end_report()))
+
+ def start_report(self):
+ """return a start report token"""
+ return BrowserLogResults.report_tokens[0][1][0] # start token
+
+ def end_report(self):
+ """return a start report token"""
+ return BrowserLogResults.report_tokens[0][1][-1] # end token
+
+ def compare_error_message(self, browser_log, substr):
+ """
+ ensures that exceptions give correct error messages
+ - browser_log : a browser log file
+ - substr : substring of the error message
+ """
+
+ try:
+ BrowserLogResults(results_raw=browser_log)
+ except TalosError as e:
+ if substr not in str(e):
+ import pdb
+ pdb.set_trace()
+ self.assertTrue(substr in str(e))
+
+
+class TestTalosError(unittest.TestCase):
+ """
+ test TalosError class
+ """
+ def test_browser_log_results(self):
+ # an example that should fail
+ # passing invalid value for argument result_raw
+ with self.assertRaises(TalosError):
+ BrowserLogResults(results_raw="__FAIL<bad test>__FAIL")
+
+if __name__ == '__main__':
+ unittest.main()