Index: chrome/test/functional/chromeos_security.py |
diff --git a/chrome/test/functional/chromeos_security.py b/chrome/test/functional/chromeos_security.py |
index d9cc3729fc4bda94f1b55420bf5dfdc3cc7b2a73..073cb9cff1c31120259bc271300311d3797f91de 100644 |
--- a/chrome/test/functional/chromeos_security.py |
+++ b/chrome/test/functional/chromeos_security.py |
@@ -14,9 +14,24 @@ class ChromeosSecurity(pyauto.PyUITest): |
Requires ChromeOS to be logged in. |
""" |
+ def setUp(self): |
+ pyauto.PyUITest.setUp(self) |
+ baseline_file = os.path.abspath(os.path.join( |
+ pyauto.PyUITest.DataDir(), 'pyauto_private', 'chromeos', |
+ 'security', 'extension_permission_baseline.txt')) |
+ self.assertTrue(os.path.exists(baseline_file), |
+ msg='Baseline info file does not exist.') |
+ baseline_info = self.EvalDataFrom(baseline_file) |
+ self._bundled_crx_directory = baseline_info['BUNDLED_CRX_DIRECTORY'] |
+ self._bundled_crx_baseline = baseline_info['BUNDLED_CRX_BASELINE'] |
+ self._component_extension_baseline = ( |
+ baseline_info['COMPONENT_EXTENSION_BASELINE']) |
+ if self.GetBrowserInfo()['properties']['is_official']: |
+ self._component_extension_baseline.extend( |
+ baseline_info['OFFICIAL_COMPONENT_EXTENSIONS']) |
def ExtraChromeFlagsOnChromeOS(self): |
- """Override default list of extra flags typicall used with automation. |
+ """Override default list of extra flags typically used with automation. |
See the default flags used with automation in pyauto.py. |
Chrome flags for this test should be as close to reality as possible. |
@@ -37,6 +52,85 @@ class ChromeosSecurity(pyauto.PyUITest): |
self.assertNotEqual(title, self.GetActiveTabTitle(), |
msg='Could access local file %s.' % url) |
+ def _VerifyExtensionPermissions(self, baseline): |
+ """Ensures extension permissions in the baseline match actual info. |
+ |
+ This function will fail the current test if either (1) an extension named |
+ in the baseline is not currently installed in Chrome; or (2) the api |
+ permissions or effective host permissions of an extension in the baseline |
+ do not match the actual permissions associated with the extension in Chrome. |
+ |
+ Args: |
+ baseline: A dictionary of expected extension information, containing |
+ extension names and api/effective host permission info. |
+ """ |
+ full_ext_actual_info = self.GetExtensionsInfo() |
+ for ext_expected_info in baseline: |
+ located_ext_info = [info for info in full_ext_actual_info if |
+ info['name'] == ext_expected_info['name']] |
+ self.assertTrue( |
+ located_ext_info, |
+ msg='Cannot locate extension info: ' + ext_expected_info['name']) |
+ ext_actual_info = located_ext_info[0] |
+ self.assertEqual(set(ext_expected_info['effective_host_permissions']), |
+ set(ext_actual_info['effective_host_permissions']), |
+ msg='Effective host permission info does not match for ' |
+ 'extension: ' + ext_expected_info['name']) |
+ self.assertEqual(set(ext_expected_info['api_permissions']), |
+ set(ext_actual_info['api_permissions']), |
+ msg='API permission info does not match for ' |
+ 'extension: ' + ext_expected_info['name']) |
+ |
+ def testComponentExtensionPermissions(self): |
+ """Ensures component extension permissions are as expected.""" |
+ expected_names = [ext['name'] for ext in self._component_extension_baseline] |
+ actual_names = [ext['name'] for ext in self.GetExtensionsInfo() if |
+ ext['is_component_extension']] |
+ self.assertEqual(set(expected_names), set(actual_names), |
+ msg='Component extension names do not match baseline:\n' |
+ 'Installed extensions: %s\n' |
+ 'Expected extensions: %s' % (actual_names, |
+ expected_names)) |
+ self._VerifyExtensionPermissions(self._component_extension_baseline) |
+ |
+ def testBundledCrxPermissions(self): |
+ """Ensures bundled CRX permissions are as expected.""" |
+ # Verify that each bundled CRX on the device is expected, then install it. |
+ for file_name in os.listdir(self._bundled_crx_directory): |
+ if file_name.endswith('.crx'): |
+ self.assertTrue( |
+ file_name in [x['crx_file'] for x in self._bundled_crx_baseline], |
+ msg='Unexpected CRX file: ' + file_name) |
+ crx_file = pyauto.FilePath( |
+ os.path.join(self._bundled_crx_directory, file_name)) |
+ self.assertTrue(self.InstallExtension(crx_file, False), |
+ msg='Extension install failed: %s' % crx_file.value()) |
+ |
+ # Verify that the permissions information in the baseline matches the |
+ # permissions associated with the installed bundled CRX extensions. |
+ self._VerifyExtensionPermissions(self._bundled_crx_baseline) |
+ |
+ def testNoUnexpectedExtensions(self): |
+ """Ensures there are no unexpected bundled or component extensions.""" |
+ # Install all bundled extensions on the device. |
+ for file_name in os.listdir(self._bundled_crx_directory): |
+ if file_name.endswith('.crx'): |
+ crx_file = pyauto.FilePath( |
+ os.path.join(self._bundled_crx_directory, file_name)) |
+ self.assertTrue(self.InstallExtension(crx_file, False), |
+ msg='Extension install failed: %s' % crx_file.value()) |
+ |
+ # Ensure that the set of installed extension names precisely matches the |
+ # baseline. |
+ expected_names = [ext['name'] for ext in self._component_extension_baseline] |
+ expected_names.extend([ext['name'] for ext in self._bundled_crx_baseline]) |
+ ext_actual_info = self.GetExtensionsInfo() |
+ installed_names = [ext['name'] for ext in ext_actual_info] |
+ self.assertEqual(set(expected_names), set(installed_names), |
+ msg='Installed extension names do not match baseline:\n' |
+ 'Installed extensions: %s\n' |
+ 'Expected extensions: %s' % (installed_names, |
+ expected_names)) |
if __name__ == '__main__': |
pyauto_functional.Main() |