blob: b15fd9988440bd7ff1ce10871101b0b23d20d1c1 [file] [log] [blame]
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging
import os
import shutil
import tempfile
import unittest
from telemetry.core import browser_finder
from telemetry.core import extension_to_load
from telemetry.core import util
from telemetry.core.backends.chrome import extension_dict_backend
from telemetry.unittest import options_for_unittests
class ExtensionTest(unittest.TestCase):
def setUp(self):
extension_path = os.path.join(util.GetUnittestDataDir(), 'simple_extension')
options = options_for_unittests.GetCopy()
load_extension = extension_to_load.ExtensionToLoad(
extension_path, options.browser_type)
options.extensions_to_load = [load_extension]
browser_to_create = browser_finder.FindBrowser(options)
self._browser = None
self._extension = None
if not browser_to_create:
# May not find a browser that supports extensions.
return
self._browser = browser_to_create.Create()
self._browser.Start()
self._extension = self._browser.extensions[load_extension]
self.assertTrue(self._extension)
def tearDown(self):
if self._browser:
self._browser.Close()
def testExtensionBasic(self):
"""Test ExtensionPage's ExecuteJavaScript and EvaluateJavaScript."""
if not self._extension:
logging.warning('Did not find a browser that supports extensions, '
'skipping test.')
return
self._extension.ExecuteJavaScript('setTestVar("abcdef")')
self.assertEquals('abcdef',
self._extension.EvaluateJavaScript('_testVar'))
def testDisconnect(self):
"""Test that ExtensionPage.Disconnect exists by calling it.
EvaluateJavaScript should reconnect."""
if not self._extension:
logging.warning('Did not find a browser that supports extensions, '
'skipping test.')
return
self._extension.Disconnect()
self.assertEquals(2, self._extension.EvaluateJavaScript('1+1'))
class NonExistentExtensionTest(unittest.TestCase):
def testNonExistentExtensionPath(self):
"""Test that a non-existent extension path will raise an exception."""
extension_path = os.path.join(util.GetUnittestDataDir(), 'foo')
options = options_for_unittests.GetCopy()
self.assertRaises(extension_to_load.ExtensionPathNonExistentException,
lambda: extension_to_load.ExtensionToLoad(
extension_path, options.browser_type))
def testExtensionNotLoaded(self):
"""Querying an extension that was not loaded will return None"""
extension_path = os.path.join(util.GetUnittestDataDir(), 'simple_extension')
options = options_for_unittests.GetCopy()
load_extension = extension_to_load.ExtensionToLoad(
extension_path, options.browser_type)
browser_to_create = browser_finder.FindBrowser(options)
with browser_to_create.Create() as b:
b.Start()
if b.supports_extensions:
self.assertRaises(extension_dict_backend.ExtensionNotFoundException,
lambda: b.extensions[load_extension])
class MultipleExtensionTest(unittest.TestCase):
def setUp(self):
""" Copy the manifest and background.js files of simple_extension to a
number of temporary directories to load as extensions"""
self._extension_dirs = [tempfile.mkdtemp()
for i in range(3)] # pylint: disable=W0612
src_extension_dir = os.path.join(
util.GetUnittestDataDir(), 'simple_extension')
manifest_path = os.path.join(src_extension_dir, 'manifest.json')
script_path = os.path.join(src_extension_dir, 'background.js')
for d in self._extension_dirs:
shutil.copy(manifest_path, d)
shutil.copy(script_path, d)
options = options_for_unittests.GetCopy()
self._extensions_to_load = [extension_to_load.ExtensionToLoad(
d, options.browser_type)
for d in self._extension_dirs]
options.extensions_to_load = self._extensions_to_load
browser_to_create = browser_finder.FindBrowser(options)
self._browser = None
# May not find a browser that supports extensions.
if browser_to_create:
self._browser = browser_to_create.Create()
self._browser.Start()
def tearDown(self):
if self._browser:
self._browser.Close()
for d in self._extension_dirs:
shutil.rmtree(d)
def testMultipleExtensions(self):
if not self._browser:
logging.warning('Did not find a browser that supports extensions, '
'skipping test.')
return
# Test contains.
loaded_extensions = filter(lambda e: e in self._browser.extensions,
self._extensions_to_load)
self.assertEqual(len(loaded_extensions), len(self._extensions_to_load))
for load_extension in self._extensions_to_load:
extension = self._browser.extensions[load_extension]
assert extension
extension.ExecuteJavaScript('setTestVar("abcdef")')
self.assertEquals('abcdef', extension.EvaluateJavaScript('_testVar'))
class ComponentExtensionTest(unittest.TestCase):
def testComponentExtensionBasic(self):
extension_path = os.path.join(
util.GetUnittestDataDir(), 'component_extension')
options = options_for_unittests.GetCopy()
load_extension = extension_to_load.ExtensionToLoad(
extension_path, options.browser_type, is_component=True)
options.extensions_to_load = [load_extension]
browser_to_create = browser_finder.FindBrowser(options)
if not browser_to_create:
logging.warning('Did not find a browser that supports extensions, '
'skipping test.')
return
with browser_to_create.Create() as b:
b.Start()
extension = b.extensions[load_extension]
extension.ExecuteJavaScript('setTestVar("abcdef")')
self.assertEquals('abcdef', extension.EvaluateJavaScript('_testVar'))
def testComponentExtensionNoPublicKey(self):
# simple_extension does not have a public key.
extension_path = os.path.join(util.GetUnittestDataDir(), 'simple_extension')
options = options_for_unittests.GetCopy()
self.assertRaises(extension_to_load.MissingPublicKeyException,
lambda: extension_to_load.ExtensionToLoad(
extension_path,
browser_type=options.browser_type,
is_component=True))