Upstream version 7.35.139.0
[platform/framework/web/crosswalk.git] / src / third_party / trace-viewer / third_party / tvcm / tvcm / module_test_case.py
1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4 import unittest
5 import sys
6 import os
7 import json
8
9
10 from tvcm import dev_server
11 from tvcm import browser_controller
12 from tvcm import test_runner
13 from tvcm import resource_loader
14
15
16 _currently_active_module_test_suite = None
17
18
19 def _NavigateToTestCaseRunner(bc):
20   bc.NavigateToPath('/tvcm/unittest/module_test_case_runner.html')
21   bc.WaitForJavaScriptExpression('window.__readyToRun == true')
22   bc.WaitForJavaScriptExpression('window.tvcm !== undefined')
23   bc.WaitForJavaScriptExpression('window.tvcm.hasPanic !== undefined')
24   bc.WaitForJavaScriptExpression('window.discoverTestsInModules !== undefined')
25   bc.WaitForJavaScriptExpression('window.runTestNamed !== undefined')
26
27
28 class ModuleTestSuite(unittest.TestSuite):
29   def __init__(self, project):
30     super(ModuleTestSuite, self).__init__()
31     self._project = project
32     self._bc = None
33
34   @property
35   def __class__(self):
36     def RecreateFunc():
37       return self.recreateEmptyVersion()
38     return RecreateFunc
39   def recreateEmptyVersion(self):
40     return ModuleTestSuite(self._project)
41
42   def __call__(self, *args):
43     return self.run(*args)
44
45   def run(self, result):
46     self.setUp()
47     try:
48       return super(ModuleTestSuite, self).run(result)
49     finally:
50       self.tearDown()
51
52   @property
53   def bc(self):
54     return self._bc
55
56   def setUp(self):
57     try:
58       self._bc = browser_controller.BrowserController(self._project)
59       _NavigateToTestCaseRunner(self._bc)
60     except:
61       self._bc.Close()
62       self._bc = None
63       return
64
65     global _currently_active_module_test_suite
66     assert _currently_active_module_test_suite == None
67     _currently_active_module_test_suite = self
68     self._bc.stdout_enabled = True
69
70   def tearDown(self):
71     if self._bc:
72       self._bc.stdout_enabled = False
73       self._bc.Close()
74       self._bc = None
75
76     global _currently_active_module_test_suite
77     _currently_active_module_test_suite = None
78
79 def DiscoverTestsInModule(project, start_path):
80   try:
81     return _DiscoverTestsInModuleImpl(project, start_path)
82   except:
83     import traceback
84     sys.stderr.write("While discovering tests:\n")
85     sys.stderr.write(sys.exc_info()[1].message)
86     sys.stderr.write("\n\n")
87     raise
88
89 def _DiscoverTestsInModuleImpl(project, start_path):
90   if test_runner.PY_ONLY_TESTS:
91     return unittest.TestSuite()
92
93   if not browser_controller.IsSupported():
94     raise Exception('Cannot run all tests: telemetry could not be found')
95   rl = resource_loader.ResourceLoader(project)
96
97   test_modules = [x.name for x in
98                   project.FindAllTestModuleResources(start_path=start_path)]
99
100   bc = browser_controller.BrowserController(project)
101   try:
102     _NavigateToTestCaseRunner(bc)
103     if bc.EvaluateJavaScript('tvcm.hasPanic()'):
104       raise Exception('Runner failure: %s' % bc.EvaluateJavaScript('tvcm.getPanicText()'))
105
106     tests = bc.EvaluateThennableAndWait(
107       'discoverTestsInModules(%s)' % json.dumps(test_modules))
108
109     if bc.EvaluateJavaScript('tvcm.hasPanic()'):
110       raise Exception('Test loading failure: %s' % bc.EvaluateJavaScript('tvcm.getPanicText()'))
111
112     suite = ModuleTestSuite(project)
113     for fully_qualified_test_name in tests:
114       suite.addTest(ModuleTestCase(fully_qualified_test_name))
115     return suite
116   finally:
117     bc.Close()
118
119
120
121 class ModuleTestCase(unittest.TestCase):
122   def __init__(self, fully_qualified_test_name):
123     super(ModuleTestCase, self).__init__(methodName='runTest')
124     self.fully_qualified_test_name = fully_qualified_test_name
125
126   def id(self):
127     return self.fully_qualified_test_name
128
129   def shortDescription(self):
130     return None
131
132   def __str__(self):
133     i = self.fully_qualified_test_name.rfind('.')
134     modname = self.fully_qualified_test_name[0:i]
135     testname = self.fully_qualified_test_name[i+1:]
136     return '%s (%s)' % (testname, modname)
137
138   def runTest(self):
139     global _currently_active_module_test_suite
140     mts = _currently_active_module_test_suite
141     assert mts, 'Something is wrong: ModuleTestCase can only be run inside a ModuleTestSuite.run()'
142
143     bc = mts.bc
144     res = bc.EvaluateThennableAndWait(
145       'runTestNamed(%s)' % json.dumps(self.fully_qualified_test_name))