Home | History | Annotate | Download | only in functional
      1 #!/usr/bin/env python
      2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 import logging
      7 import os
      8 
      9 import pyauto_functional  # Must be imported before pyauto
     10 import pyauto
     11 
     12 
     13 class GpuTest(pyauto.PyUITest):
     14   """GPU Tests Runner."""
     15 
     16   def _GetGpuPID(self):
     17     """Fetch the pid of the GPU process."""
     18     child_processes = self.GetBrowserInfo()['child_processes']
     19     for x in child_processes:
     20        if x['type'] == 'GPU':
     21          return x['pid']
     22     return None
     23 
     24   def _IsHardwareAccelerated(self, feature):
     25     """Check if gpu is enabled in the machine before running any tests."""
     26     self.NavigateToURL('about:gpu')
     27     def IsFeatureStatusLoaded():
     28       """Returns whether the feature status UI has been loaded.
     29 
     30       The about:gpu page fetches status for features asynchronously, so use
     31       this to check if the fetch is done.
     32       """
     33       js = """
     34         var list = document.querySelector(".feature-status-list");
     35         domAutomationController.send(list.hasChildNodes() ? "done" : "");
     36       """
     37       return self.ExecuteJavascript(js)
     38     self.assertTrue(self.WaitUntil(IsFeatureStatusLoaded, 10))
     39     search = feature + ': Hardware accelerated'
     40     find_result = self.FindInPage(search)['match_count']
     41     if find_result:
     42       # about:gpu page starts a gpu process. Restart the browser to clear
     43       # the state. We could kill the gpu process, but navigating to a page
     44       # after killing the gpu can lead to flakiness.
     45       # See crbug.com/93423.
     46       self.RestartBrowser()
     47       return True
     48     else:
     49       logging.warn('Hardware acceleration not available')
     50       return False
     51 
     52   def _VerifyGPUProcessOnPage(self, url):
     53     url = self.GetFileURLForDataPath('pyauto_private', 'gpu', url)
     54     self.NavigateToURL(url)
     55     self.assertTrue(self.WaitUntil(
     56       lambda: self._GetGpuPID() is not None), msg='No process for GPU')
     57 
     58   def testSingleGpuProcess(self):
     59     """Verify there's only one gpu process shared across all uses."""
     60     self.assertTrue(self._IsHardwareAccelerated('WebGL'))
     61     url = self.GetFileURLForDataPath('pyauto_private',
     62                                      'gpu', 'WebGLField.html')
     63     self.AppendTab(pyauto.GURL(url))
     64     # Open a new window.
     65     self.OpenNewBrowserWindow(True)
     66     self.NavigateToURL(url, 1, 0)
     67     # Open a new incognito window.
     68     self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)
     69     self.NavigateToURL(url, 1, 0)
     70     # Verify there's only 1 gpu process.
     71     gpu_process_count = 0
     72     for x in self.GetBrowserInfo()['child_processes']:
     73       if x['type'] == 'GPU':
     74         gpu_process_count += 1
     75     self.assertEqual(1, gpu_process_count)
     76 
     77 
     78 if __name__ == '__main__':
     79   pyauto_functional.Main()
     80