| OLD | NEW | 
|    1 #!/usr/bin/python2.4 |    1 #!/usr/bin/python2.4 | 
|    2 # Copyright 2009, Google Inc. |    2 # Copyright 2009, Google Inc. | 
|    3 # All rights reserved. |    3 # All rights reserved. | 
|    4 # |    4 # | 
|    5 # Redistribution and use in source and binary forms, with or without |    5 # Redistribution and use in source and binary forms, with or without | 
|    6 # modification, are permitted provided that the following conditions are |    6 # modification, are permitted provided that the following conditions are | 
|    7 # met: |    7 # met: | 
|    8 # |    8 # | 
|    9 #     * Redistributions of source code must retain the above copyright |    9 #     * Redistributions of source code must retain the above copyright | 
|   10 # notice, this list of conditions and the following disclaimer. |   10 # notice, this list of conditions and the following disclaimer. | 
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   54  |   54  | 
|   55  |   55  | 
|   56 def IsValidSuffix(name): |   56 def IsValidSuffix(name): | 
|   57   """Returns True if name ends in a valid test type.""" |   57   """Returns True if name ends in a valid test type.""" | 
|   58   name = name.lower() |   58   name = name.lower() | 
|   59   for suffix in SUFFIXES: |   59   for suffix in SUFFIXES: | 
|   60     if name.endswith(suffix): |   60     if name.endswith(suffix): | 
|   61       return True |   61       return True | 
|   62   return False |   62   return False | 
|   63  |   63  | 
 |   64 def ScreenshotNameFromTestName(name): | 
 |   65   name = StripTestTypeSuffix(name) | 
 |   66  | 
 |   67   if name.startswith("Test"): | 
 |   68     # Make sure these are in order. | 
 |   69     prefixes = ["TestStress", "TestSample", "Test"] | 
 |   70     for prefix in prefixes: | 
 |   71       if name.startswith(prefix): | 
 |   72         name = name[len(prefix):] | 
 |   73         break | 
 |   74  | 
 |   75     # Lowercase the name only for custom test methods. | 
 |   76     name = name.lower() | 
 |   77    | 
 |   78   name = name.replace("_", "-") | 
 |   79   name = name.replace("/", "_") | 
 |   80  | 
 |   81   return name  | 
 |   82  | 
|   64  |   83  | 
|   65 def StripTestTypeSuffix(name): |   84 def StripTestTypeSuffix(name): | 
|   66   """Removes the suffix from name if it is a valid test type.""" |   85   """Removes the suffix from name if it is a valid test type.""" | 
|   67   name_lower = name.lower() |   86   name_lower = name.lower() | 
|   68   for suffix in SUFFIXES: |   87   for suffix in SUFFIXES: | 
|   69     if name_lower.endswith(suffix): |   88     if name_lower.endswith(suffix): | 
|   70       return name[:-len(suffix)] |   89       return name[:-len(suffix)] | 
|   71   return name |   90   return name | 
|   72  |   91  | 
|   73  |   92  | 
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  198   session.wait_for_condition("window.g_selenium_post_render", 20000) |  217   session.wait_for_condition("window.g_selenium_post_render", 20000) | 
|  199  |  218  | 
|  200   # Get result |  219   # Get result | 
|  201   data_url = session.get_eval("window.g_selenium_save_screen_result") |  220   data_url = session.get_eval("window.g_selenium_save_screen_result") | 
|  202   expected_header = "data:image/png;base64," |  221   expected_header = "data:image/png;base64," | 
|  203   if data_url.startswith(expected_header): |  222   if data_url.startswith(expected_header): | 
|  204     png = base64.b64decode(data_url[len(expected_header):]) |  223     png = base64.b64decode(data_url[len(expected_header):]) | 
|  205     file = open(full_path + ".png", 'wb') |  224     file = open(full_path + ".png", 'wb') | 
|  206     file.write(png) |  225     file.write(png) | 
|  207     file.close() |  226     file.close() | 
|  208     print "Saved screenshot %s." % full_path |  | 
|  209     return True |  227     return True | 
|  210  |  228  | 
|  211   return False |  229   return False | 
|  212  |  230  | 
|  213  |  231  | 
|  214 class SeleniumTestCase(unittest.TestCase): |  232 class SeleniumTestCase(unittest.TestCase): | 
|  215   """Wrapper for TestCase for selenium.""" |  233   """Wrapper for TestCase for selenium.""" | 
|  216  |  234  | 
|  217   def __init__(self, name, session, browser, path_to_html, test_type=None, |  235   def __init__(self, name, browser, path_to_html, test_type=None, | 
|  218               sample_path=None, options=None): |  236               sample_path=None, options=None): | 
|  219     """Constructor for SampleTests. |  237     """Constructor for SampleTests. | 
|  220  |  238  | 
|  221     Args: |  239     Args: | 
|  222       name: Name of unit test. |  240       name: Name of unit test. | 
|  223       session: Selenium session. |  241       session: Selenium session. | 
|  224       browser: Name of browser. |  242       browser: Name of browser. | 
|  225       path_to_html: path to html from server root |  243       path_to_html: path to html from server root | 
|  226       test_type: Type of test ("small", "medium", "large") |  244       test_type: Type of test ("small", "medium", "large") | 
|  227       sample_path: Path to test. |  245       sample_path: Path to test. | 
|  228       options: list of option strings. |  246       options: list of option strings. | 
|  229     """ |  247     """ | 
|  230  |  248  | 
|  231     unittest.TestCase.__init__(self, name) |  249     unittest.TestCase.__init__(self, name) | 
|  232     self.session = session |  250     self.name = name | 
 |  251     self.session = None | 
|  233     self.browser = browser |  252     self.browser = browser | 
|  234     self.test_type = test_type |  253     self.test_type = test_type | 
|  235     self.sample_path = sample_path |  254     self.sample_path = sample_path | 
|  236     self.options = options |  | 
|  237     self.path_to_html = path_to_html |  255     self.path_to_html = path_to_html | 
 |  256     self.screenshots = [] | 
 |  257     self.timeout = 10000 | 
 |  258     self.client = "g_client" | 
 |  259     # parse options | 
 |  260     for option in options: | 
 |  261       if option.startswith("screenshot"): | 
 |  262         clock = GetArgument(option) | 
 |  263         if clock is None: | 
 |  264           clock = "27.5" | 
 |  265         self.screenshots.append(clock) | 
 |  266       elif option.startswith("timeout"): | 
 |  267         self.timeout = int(GetArgument(option)) | 
 |  268       elif option.startswith("client"): | 
 |  269         self.client = GetArgument(option) | 
 |  270          | 
 |  271  | 
 |  272   def SetSession(self, session): | 
 |  273     self.session = session | 
 |  274  | 
 |  275   def GetTestTimeout(self): | 
 |  276     return self.timeout | 
|  238  |  277  | 
|  239   def GetURL(self, url): |  278   def GetURL(self, url): | 
|  240     """Gets a URL for the test.""" |  279     """Gets a URL for the test.""" | 
|  241     return self.session.browserURL + self.path_to_html + url |  280     return self.session.browserURL + self.path_to_html + url | 
|  242  |  281  | 
|  243   def shortDescription(self): |  282   def shortDescription(self): | 
|  244     """override unittest.TestCase shortDescription for our own descriptions.""" |  283     """override unittest.TestCase shortDescription for our own descriptions.""" | 
|  245     if self.sample_path: |  284     if self.sample_path: | 
|  246       return "Testing: " + self.sample_path + ".html" |  285       return "Testing: " + self.sample_path + ".html" | 
|  247     else: |  286     else: | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|  260  |  299  | 
|  261     If the sample is animated, it is expected to have a global variable |  300     If the sample is animated, it is expected to have a global variable | 
|  262     called g_timeMult that can be set to 0 to stop the animation.  All of its |  301     called g_timeMult that can be set to 0 to stop the animation.  All of its | 
|  263     animation must be based on a global variable called g_clock, such that |  302     animation must be based on a global variable called g_clock, such that | 
|  264     setting g_clock to the same value will always produce the same image. |  303     setting g_clock to the same value will always produce the same image. | 
|  265  |  304  | 
|  266     Finally, each sample is expected to have a global variable called |  305     Finally, each sample is expected to have a global variable called | 
|  267     g_client which is the o3d client object for that sample.  This is |  306     g_client which is the o3d client object for that sample.  This is | 
|  268     used to take a screenshot. |  307     used to take a screenshot. | 
|  269     """ |  308     """ | 
|  270     screenshots = [] |  309     self.assertTrue(not self.timeout is None) | 
|  271     timeout = 10000 |  310     self.assertTrue(not self.client is None) | 
|  272     client = "g_client" |  | 
|  273  |  | 
|  274     self.assertTrue(self.test_type in ["small", "medium", "large"]) |  311     self.assertTrue(self.test_type in ["small", "medium", "large"]) | 
|  275  |  312  | 
|  276     # parse options |  | 
|  277     for option in self.options: |  | 
|  278       if option.startswith("screenshot"): |  | 
|  279         clock = GetArgument(option) |  | 
|  280         if clock is None: |  | 
|  281           clock = "27.5" |  | 
|  282         screenshots.append(clock) |  | 
|  283       elif option.startswith("timeout"): |  | 
|  284         timeout = GetArgument(option) |  | 
|  285         self.assertTrue(not timeout is None) |  | 
|  286       elif option.startswith("client"): |  | 
|  287         client = GetArgument(option) |  | 
|  288         self.assertTrue(not client is None) |  | 
|  289  |  | 
|  290     url = self.GetURL(base_path + self.sample_path + ".html") |  313     url = self.GetURL(base_path + self.sample_path + ".html") | 
|  291  |  314  | 
|  292     # load the sample. |  315     # load the sample. | 
|  293     self.session.open(url) |  316     self.session.open(url) | 
|  294  |  317  | 
|  295     # wait for it to initialize. |  318     # wait for it to initialize. | 
|  296     self.session.wait_for_condition(ready_condition, timeout) |  319     self.session.wait_for_condition(ready_condition, self.timeout) | 
|  297  |  320  | 
|  298     self.session.run_script( |  321     self.session.run_script( | 
|  299         "if (window.o3d_prepForSelenium) { window.o3d_prepForSelenium(); }") |  322         "if (window.o3d_prepForSelenium) { window.o3d_prepForSelenium(); }") | 
|  300  |  323  | 
|  301     if assertion: |  324     if assertion: | 
|  302       self.assertEqual("true", self.session.get_eval(assertion)) |  325       self.assertEqual("true", self.session.get_eval(assertion)) | 
|  303  |  326  | 
|  304     # take a screenshot. |  327     # take a screenshot. | 
|  305     screenshot_id = 1 |  328     screenshot_id = 1 | 
|  306     for clock in screenshots: |  329     for clock in self.screenshots: | 
|  307       # if they are animated we need to stop the animation and set the clock |  330       # if they are animated we need to stop the animation and set the clock | 
|  308       # to some time so we get a known state. |  331       # to some time so we get a known state. | 
|  309       self.session.run_script("g_timeMult = 0") |  332       self.session.run_script("g_timeMult = 0") | 
|  310       self.session.run_script("g_clock = " + clock) |  333       self.session.run_script("g_clock = " + clock) | 
|  311  |  334  | 
|  312       # take a screenshot. |  335       # take a screenshot. | 
|  313       screenshot = self.sample_path.replace("/", "_") + str(screenshot_id) |  336       screenshot = self.sample_path.replace("_", "-").replace("/", "_") | 
 |  337       screenshot += str(screenshot_id) | 
|  314       self.assertTrue(TakeScreenShot(self.session, self.browser, |  338       self.assertTrue(TakeScreenShot(self.session, self.browser, | 
|  315                                      client, screenshot)) |  339                                      self.client, screenshot)) | 
|  316       screenshot_id += 1 |  340       screenshot_id += 1 | 
| OLD | NEW |