Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2598)

Unified Diff: chrome/test/functional/nacl_sdk.py

Issue 10389188: Revert 137538 - Nacl sdk Nacl sdk automated test(method-testNaClSDK) of new installation process of… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/test/functional/PYAUTO_TESTS ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/test/functional/nacl_sdk.py
===================================================================
--- chrome/test/functional/nacl_sdk.py (revision 137639)
+++ chrome/test/functional/nacl_sdk.py (working copy)
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Copyright (c) 2011 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.
@@ -12,14 +12,13 @@
import logging
import os
import platform
-import re
import shutil
import subprocess
import sys
+import tarfile
import tempfile
import urllib2
import xml.dom.minidom
-import zipfile
import pyauto_functional # Must be imported before pyauto.
import pyauto
@@ -30,15 +29,49 @@
"""Tests for the NaCl SDK."""
_extracted_sdk_path = None
_temp_dir = None
- _pepper_versions = []
- _updated_pepper_versions = []
- _latest_updated_pepper_versions = []
_settings = {
+ 'release_win_sdk_url': 'http://commondatastorage.googleapis.com/'
+ 'nativeclient-mirror/nacl/nacl_sdk/staging/naclsdk_win.exe',
+ 'release_mac_sdk_url': 'http://commondatastorage.googleapis.com/'
+ 'nativeclient-mirror/nacl/nacl_sdk/staging/naclsdk_mac.tgz',
+ 'release_lin_sdk_url': 'http://commondatastorage.googleapis.com/'
+ 'nativeclient-mirror/nacl/nacl_sdk/staging/naclsdk_linux.tgz',
+ 'expected_md5_url': 'http://commondatastorage.googleapis.com/'
+ 'nativeclient-mirror',
+ 'release_win_expected_md5_key': 'nacl/nacl_sdk/staging/naclsdk_win.exe',
+ 'release_mac_expected_md5_key': 'nacl/nacl_sdk/staging/naclsdk_mac.tgz',
+ 'release_lin_expected_md5_key': 'nacl/nacl_sdk/staging/'
+ 'naclsdk_linux.tgz',
'post_sdk_download_url': 'http://code.google.com/chrome/nativeclient/'
- 'docs/download.html',
- 'post_sdk_zip': 'http://commondatastorage.googleapis.com/'
- 'nativeclient-mirror/nacl/nacl_sdk/nacl_sdk.zip',
+ 'docs/download.html',
+ 'post_win_sdk_url': 'http://commondatastorage.googleapis.com/'
+ 'nativeclient-mirror/nacl/nacl_sdk/naclsdk_win.exe',
+ 'post_mac_sdk_url': 'http://commondatastorage.googleapis.com/'
+ 'nativeclient-mirror/nacl/nacl_sdk/naclsdk_mac.tgz',
+ 'post_lin_sdk_url': 'http://commondatastorage.googleapis.com/'
+ 'nativeclient-mirror/nacl/nacl_sdk/naclsdk_linux.tgz',
'min_required_chrome_build': 14,
+ 'gallery_examples': {
+ 'life': 'http://nacl-gallery.appspot.com/life/life.html',
+ 'hello_world': 'http://nacl-gallery.appspot.com/hello_world/'
+ 'hello_world.html',
+ 'pi_generator': 'http://nacl-gallery.appspot.com/pi_generator/'
+ 'pi_generator.html',
+ 'sine_synth': 'http://nacl-gallery.appspot.com/sine_synth/'
+ 'sine_synth.html'
+ },
+ 'prerelease_gallery': {
+ 'hello_world': 'http://4.nacl-gallery.appspot.com/hello_world/'
+ 'hello_world.html',
+ 'hello_world_c': 'http://4.nacl-gallery.appspot.com/hello_world_c/'
+ 'hello_world.html',
+ 'life': 'http://4.nacl-gallery.appspot.com/life/life.html',
+ 'pi_generator': 'http://4.nacl-gallery.appspot.com/pi_generator/'
+ 'pi_generator.html',
+ 'sine_synth': 'http://4.nacl-gallery.appspot.com/sine_synth/'
+ 'sine_synth.html',
+ 'geturl': 'http://4.nacl-gallery.appspot.com/geturl/geturl.html'
+ }
}
def tearDown(self):
@@ -51,17 +84,73 @@
logging.info('System does not meet the requirements.')
return
self._extracted_sdk_path = tempfile.mkdtemp()
+
self._VerifyDownloadLinks()
self._VerifyNaClSDKInstaller()
- self._VerifyInstall()
- self._VerifyUpdate()
+ self._VerifyBuildStubProject()
self._LaunchServerAndVerifyExamples()
+ self._VerifyRebuildExamples()
+ self._VerifySelldrAndNcval()
+ def testVerifyNaClSDKChecksum(self):
+ """Verify NaCl SDK Checksum."""
+ if not self._HasAllSystemRequirements():
+ logging.info('System does not meet the requirements.')
+ return
+
+ self._DownloadNaClSDK()
+
+ if pyauto.PyUITest.IsWin():
+ expected_md5_key = self._settings['release_win_expected_md5_key']
+ file_path = os.path.join(self._temp_dir, 'naclsdk_win.exe')
+ elif pyauto.PyUITest.IsMac():
+ expected_md5_key = self._settings['release_mac_expected_md5_key']
+ file_path = os.path.join(self._temp_dir, 'naclsdk_mac.tgz')
+ elif pyauto.PyUITest.IsLinux():
+ expected_md5_key = self._settings['release_lin_expected_md5_key']
+ file_path = os.path.join(self._temp_dir, 'naclsdk_linux.tgz')
+ else:
+ self.fail(msg='NaCl SDK does not support this OS.')
+
+ # Get expected MD5.
+ expected_md5_url = self._settings['expected_md5_url']
+ response = urllib2.urlopen(expected_md5_url)
+ dom = xml.dom.minidom.parseString(response.read())
+ dom_content = dom.getElementsByTagName('Contents')
+ expected_md5 = None
+ for con in dom_content:
+ if (self._GetXMLNodeData(con.getElementsByTagName('Key')[0].childNodes)
+ == expected_md5_key):
+ node = con.getElementsByTagName('ETag')[0].childNodes
+ expected_md5 = self._GetXMLNodeData(node).strip('"')
+ self.assertTrue(expected_md5,
+ msg='Cannot get expected MD5 from %s.' % expected_md5_url)
+
+ md5 = hashlib.md5()
+ md5.update(open(file_path).read())
+ md5_sum = md5.hexdigest()
+ self.assertEqual(expected_md5, md5_sum,
+ msg='Unexpected checksum. Expected: %s, got: %s'
+ % (expected_md5, md5_sum))
+
+ def testVerifyNaClPlugin(self):
+ """Verify NaCl plugin."""
+ if not self._HasAllSystemRequirements():
+ logging.info('System does not meet the requirements.')
+ return
+ self._OpenExamplesAndStartTest(
+ self._settings['gallery_examples'])
+
+ def testVerifyPrereleaseGallery(self):
+ """Verify Pre-release gallery examples."""
+ if not self._HasAllSystemRequirements():
+ logging.info('System does not meet the requirements.')
+ return
+ self._OpenExamplesAndStartTest(
+ self._settings['prerelease_gallery'])
+
def _VerifyDownloadLinks(self):
- """Verify the download links.
-
- Simply verify that NaCl download links exist in html page.
- """
+ """Verify the download links."""
html = None
for i in xrange(3):
try:
@@ -72,119 +161,267 @@
self.assertTrue(html,
msg='Cannot open URL: %s' %
self._settings['post_sdk_download_url'])
- sdk_url = self._settings['post_sdk_zip']
- self.assertTrue(sdk_url in html,
- msg='Missing SDK download URL: %s' % sdk_url)
+ # Make sure the correct URL is under the correct label.
+ if pyauto.PyUITest.IsWin():
+ win_sdk_url = self._settings['post_win_sdk_url']
+ win_url_index = html.find(win_sdk_url)
+ self.assertTrue(win_url_index > -1,
+ msg='Missing SDK download URL: %s' % win_sdk_url)
+ win_keyword_index = html.rfind('Windows', 0, win_url_index)
+ self.assertTrue(win_keyword_index > -1,
+ msg='Misplaced download link: %s' % win_sdk_url)
+ elif pyauto.PyUITest.IsMac():
+ mac_sdk_url = self._settings['post_mac_sdk_url']
+ mac_url_index = html.find(mac_sdk_url)
+ self.assertTrue(mac_url_index > -1,
+ msg='Missing SDK download URL: %s' % mac_sdk_url)
+ mac_keyword_index = html.rfind('Macintosh', 0, mac_url_index)
+ self.assertTrue(mac_keyword_index > -1,
+ msg='Misplaced download link: %s' % mac_sdk_url)
+ elif pyauto.PyUITest.IsLinux():
+ lin_sdk_url = self._settings['post_lin_sdk_url']
+ lin_url_index = html.find(lin_sdk_url)
+ self.assertTrue(lin_url_index > -1,
+ msg='Missing SDK download URL: %s' % lin_sdk_url)
+ lin_keyword_index = html.rfind('Linux', 0, lin_url_index)
+ self.assertTrue(lin_keyword_index > -1,
+ msg='Misplaced download link: %s' % lin_sdk_url)
+ else:
+ self.fail(msg='NaCl SDK does not support this OS.')
+
def _VerifyNaClSDKInstaller(self):
"""Verify NaCl SDK installer."""
search_list = [
- 'sdk_cache/',
- 'sdk_tools/',
+ 'build.scons',
+ 'favicon.ico',
+ 'geturl/',
+ 'hello_world/',
+ 'hello_world_c/',
+ 'httpd.py',
+ 'index.html',
+ 'nacl_sdk_scons/',
+ 'pi_generator/',
+ 'scons',
+ 'sine_synth/'
]
+
mac_lin_additional_search_items = [
- 'naclsdk',
+ 'sel_ldr_x86_32',
+ 'sel_ldr_x86_64',
+ 'ncval_x86_32',
+ 'ncval_x86_64'
]
+
win_additional_search_items = [
- 'naclsdk.bat'
+ 'httpd.cmd',
+ 'sel_ldr_x86_32.exe',
+ 'sel_ldr_x86_64.exe',
+ 'ncval_x86_32.exe',
+ 'ncval_x86_64.exe'
]
+
self._DownloadNaClSDK()
- self._ExtractNaClSDK()
+
if pyauto.PyUITest.IsWin():
- self._SearchNaClSDKFile(
+ self._ExtractNaClSDK()
+ self._SearchNaClSDKFileWindows(
search_list + win_additional_search_items)
- elif pyauto.PyUITest.IsMac() or pyauto.PyUITest.IsLinux():
- self._SearchNaClSDKFile(
- search_list + mac_lin_additional_search_items)
+ elif pyauto.PyUITest.IsMac():
+ source_file = os.path.join(self._temp_dir, 'naclsdk_mac.tgz')
+ self._SearchNaClSDKTarFile(search_list + mac_lin_additional_search_items,
+ source_file)
+ self._ExtractNaClSDK()
+ elif pyauto.PyUITest.IsLinux():
+ source_file = os.path.join(self._temp_dir, 'naclsdk_linux.tgz')
+ self._SearchNaClSDKTarFile(search_list + mac_lin_additional_search_items,
+ source_file)
+ self._ExtractNaClSDK()
else:
self.fail(msg='NaCl SDK does not support this OS.')
- def _VerifyInstall(self):
- """Install NACL sdk."""
- # Executing naclsdk(.bat) list
+ def _VerifyBuildStubProject(self):
+ """Build stub project."""
+ stub_project_files = [
+ 'build.scons',
+ 'scons'
+ ]
+ project_template_path = self._GetDirectoryPath('project_templates',
+ self._extracted_sdk_path)
+ examples_path = self._GetDirectoryPath('examples',
+ self._extracted_sdk_path)
+ init_project_path = os.path.join(project_template_path, 'init_project.py')
+
+ # Build a C project.
+ subprocess.call(
+ ['python', init_project_path, '-n', 'hello_c', '-c', '-d',
+ examples_path], stdout=subprocess.PIPE)
+
+ hello_c_path = os.path.join(examples_path, 'hello_c')
+ for file in stub_project_files:
+ self.assertTrue(self._HasFile(file, hello_c_path),
+ msg='Cannot build C stub project.')
+
+ # Build a C++ project.
+ subprocess.call(
+ ['python', init_project_path, '-n', 'hello_cc', '-d',
+ examples_path], stdout=subprocess.PIPE)
+
+ hello_cc_path = os.path.join(examples_path, 'hello_cc')
+ for file in stub_project_files:
+ self.assertTrue(self._HasFile(file, hello_cc_path),
+ msg='Cannot build C++ stub project.')
+
+ def _LaunchServerAndVerifyExamples(self):
+ """Start local HTTP server and verify examples."""
+ # Make sure server is not open.
+ if self._IsURLAlive('http://localhost:5103'):
+ self._CloseHTTPServer()
+
+ # Start HTTP server.
+ examples_path = self._GetDirectoryPath('examples',
+ self._extracted_sdk_path)
if pyauto.PyUITest.IsWin():
- source_file = os.path.join(
- self._extracted_sdk_path, 'nacl_sdk', 'naclsdk.bat')
- elif pyauto.PyUITest.IsMac() or pyauto.PyUITest.IsLinux():
- source_file = os.path.join(
- self._extracted_sdk_path, 'nacl_sdk', 'naclsdk')
- subprocess.call(['chmod', '-R', '755', self._extracted_sdk_path])
+ http_path = os.path.join(examples_path, 'httpd.cmd')
+ proc = subprocess.Popen([http_path], cwd=examples_path)
else:
- self.fail(msg='NaCl SDK does not support this OS.')
- subprocess.Popen([source_file, 'list'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE).communicate()
+ http_path = os.path.join(examples_path, 'httpd.py')
+ proc = subprocess.Popen(['python', http_path], cwd=examples_path)
- def _VerifyUpdate(self):
- """Update NACL sdk"""
- # Executing naclsdk(.bat) update
+ success = self.WaitUntil(
+ lambda: self._IsURLAlive('http://localhost:5103'),
+ timeout=30, retry_sleep=1, expect_retval=True)
+ self.assertTrue(success,
+ msg='Cannot open HTTP server. %s' %
+ self.GetActiveTabTitle())
+
+ examples = {
+ 'hello_world_c': 'http://localhost:5103/hello_world_c/'
+ 'hello_world.html',
+ 'hello_world': 'http://localhost:5103/hello_world/hello_world.html',
+ 'geturl': 'http://localhost:5103/geturl/geturl.html',
+ 'pi_generator': 'http://localhost:5103/pi_generator/pi_generator.html',
+ 'sine_synth': 'http://localhost:5103/sine_synth/sine_synth.html',
+ }
+ try:
+ self._OpenExamplesAndStartTest(examples)
+ finally:
+ self._CloseHTTPServer(proc)
+
+ def _VerifyRebuildExamples(self):
+ """Re-build the examples and verify they are as expected."""
+ example_dirs = [
+ 'geturl',
+ 'hello_world',
+ 'hello_world_c',
+ 'pi_generator',
+ 'sine_synth'
+ ]
+ examples_path = self._GetDirectoryPath('examples',
+ self._extracted_sdk_path)
+
+ scons_path = os.path.join(examples_path, 'scons -c')
+ subprocess.call([scons_path], cwd=examples_path, shell=True)
+ for x in example_dirs:
+ ex_path = os.path.join(examples_path, x)
+ self.assertFalse(self._HasFile('*.nmf', ex_path),
+ msg='Failed running scons -c.')
+
+ scons_path = os.path.join(examples_path, 'scons')
+ proc = subprocess.Popen([scons_path], cwd=examples_path,
+ stdout=subprocess.PIPE, shell=True)
+ proc.communicate()
+
+ # Verify each example directory contains .nmf file.
+ for dir in example_dirs:
+ dir = os.path.join(examples_path, dir)
+ if not self._HasFile('*.nmf', dir):
+ self.fail(msg='Failed running scons.')
+
+ self._LaunchServerAndVerifyExamples()
+
+ def _VerifySelldrAndNcval(self):
+ """Verify sel_ldr and ncval."""
+ architecture = self._GetPlatformArchitecture()
+ scons_arg = None
if pyauto.PyUITest.IsWin():
- source_file = os.path.join(self._extracted_sdk_path, 'nacl_sdk',
- 'naclsdk.bat')
- elif pyauto.PyUITest.IsMac() or pyauto.PyUITest.IsLinux():
- source_file = os.path.join(self._extracted_sdk_path, 'nacl_sdk',
- 'naclsdk')
+ if architecture == '64bit':
+ scons_arg = 'test64'
+ else:
+ scons_arg = 'test32'
+ elif pyauto.PyUITest.IsMac():
+ scons_arg = 'test64'
+ elif pyauto.PyUITest.IsLinux():
+ scons_arg = 'test64'
+
+ examples_path = self._GetDirectoryPath('examples',
+ self._extracted_sdk_path)
+ scons_path = os.path.join(examples_path, 'scons ' + scons_arg)
+
+ # Build and run the unit test.
+ proc = subprocess.Popen([scons_path], stdout=subprocess.PIPE,
+ shell=True, cwd=examples_path)
+ lines = proc.communicate()[0].splitlines()
+ test_ran = False
+
+ for line in lines:
+ if 'Check:' in line:
+ self.assertTrue('passed' in line,
+ msg='Nacl-sel_ldr unit test failed.')
+ test_ran = True
+ self.assertTrue(test_ran,
+ msg='Failed to build and run nacl-sel_ldr unit test.')
+
+ if architecture == '64bit':
+ self.assertTrue(
+ self._HasPathInTree('hello_world_x86_64.nexe',
+ True, root=examples_path),
+ msg='Missing file: hello_world_x86_64.nexe.')
else:
- self.fail(msg='NaCl SDK does not support this OS.')
- # Executing nacl_sdk(.bat) update to get the latest version.
- updated_output = subprocess.Popen([source_file, 'update'],
- stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
- self._updated_pepper_versions.extend(
- re.findall('Updating bundle (pepper_[0-9]{2})', updated_output))
- self._updated_pepper_versions = list(set(self._updated_pepper_versions))
- self._updated_pepper_versions.sort(key=str.lower)
- updated_pepper_versions_len = len(self._updated_pepper_versions)
- self._latest_updated_pepper_versions = filter(
- lambda x: x >= 'pepper_18', self._updated_pepper_versions)
+ self.assertTrue(
+ self._HasPathInTree('hello_world_x86_32.nexe',
+ True, root=examples_path),
+ msg='Missing file: hello_world_x86_32.nexe.')
- def _LaunchServerAndVerifyExamples(self):
- """Start local HTTP server and verify examples."""
- if self._ChromeAndPepperVersion(self._latest_updated_pepper_versions[0]):
- examples_path = os.path.join(self._extracted_sdk_path, 'nacl_sdk',
- self._latest_updated_pepper_versions[0],
- 'examples')
- # Close server if it's already open.
- if self._IsURLAlive('http://localhost:5103'):
- self._CloseHTTPServer()
- # Launch local http server.
- proc = subprocess.Popen(['make RUN'], shell=True, cwd=examples_path)
- self.WaitUntil(
- lambda: self._IsURLAlive('http://localhost:5103'),
- timeout=150, retry_sleep=1)
+ # Verify that a mismatch of sel_ldr and .nexe produces an error.
+ toolchain_path = self._GetDirectoryPath('toolchain',
+ self._extracted_sdk_path)
+ bin_path = self._GetDirectoryPath('bin', toolchain_path)
+ hello_world_path = self._GetDirectoryPath('hello_world', examples_path)
+ sel_32_path = os.path.join(bin_path, 'sel_ldr_x86_32')
+ sel_64_path = os.path.join(bin_path, 'sel_ldr_x86_64')
+ nexe_32_path = os.path.join(hello_world_path, 'hello_world_x86_32.nexe')
+ nexe_64_path = os.path.join(hello_world_path, 'hello_world_x86_64.nexe')
- examples = {
- 'dynamic_library_open': 'http://localhost:5103/dlopen/dlopen.html',
- 'geturl': 'http://localhost:5103/geturl/geturl.html',
- 'input_events': 'http://localhost:5103/input_events'
- '/input_events.html',
- 'load_progress':
- 'http://localhost:5103/load_progress/load_progress.html',
- 'multithreaded_input_events':
- 'http://localhost:5103/multithreaded_input_events'
- '/mt_input_events.html',
- 'pi_generator':
- 'http://localhost:5103/pi_generator/pi_generator.html',
- 'sine_synth': 'http://localhost:5103/sine_synth/sine_synth.html',
- 'web_socket':
- 'http://localhost:5103/websocket/websocket.html',
- }
- try:
- self._OpenExamplesAndStartTest(examples)
- finally:
- self._CloseHTTPServer(proc)
+ if architecture == '64bit':
+ success = self._RunProcessAndCheckOutput(
+ [sel_64_path, nexe_32_path], 'Error while loading')
+ else:
+ success = self._RunProcessAndCheckOutput(
+ [sel_32_path, nexe_64_path], 'Error while loading')
+ self.assertTrue(success,
+ msg='Failed to verify sel_ldr and .nexe mismatch.')
+ # Run the appropriate ncval for the platform on the matching .nexe.
+ ncval_32_path = os.path.join(bin_path, 'ncval_x86_32')
+ ncval_64_path = os.path.join(bin_path, 'ncval_x86_64')
+
+ if architecture == '64bit':
+ success = self._RunProcessAndCheckOutput(
+ [ncval_64_path, nexe_64_path], 'is safe')
else:
- self.fail(msg='Pepper Version %s doesnot match the Chrome version %s.'
- % (self._latest_updated_pepper_versions[0],
- self.GetBrowserInfo()['properties']['ChromeVersion']))
+ success = self._RunProcessAndCheckOutput(
+ [ncval_32_path, nexe_32_path], 'is safe')
+ self.assertTrue(success, msg='Failed to verify ncval.')
- def _ChromeAndPepperVersion(self, pepper_version='pepper_18'):
- """Determine if chrome and pepper version matach"""
- version_number = re.findall('pepper_([0-9]{2})', pepper_version)
- browser_info = self.GetBrowserInfo()
- chrome_version = browser_info['properties']['ChromeVersion']
- chrome_build = int(chrome_version.split('.')[0])
- return int(chrome_build) == int(version_number[0])
+ # Verify that a mismatch of ncval and .nexe produces an error.
+ if architecture == '64bit':
+ success = self._RunProcessAndCheckOutput(
+ [ncval_64_path, nexe_32_path], 'is safe', is_in=False)
+ else:
+ success = self._RunProcessAndCheckOutput(
+ [ncval_32_path, nexe_64_path], 'is safe', is_in=False)
+ self.assertTrue(success, msg='Failed to verify ncval and .nexe mismatch.')
def _RemoveDownloadedTestFile(self):
"""Delete downloaded files and dirs from downloads directory."""
@@ -195,20 +432,43 @@
shutil.rmtree(self._extracted_sdk_path, ignore_errors=True)
return os.path.exists(self._extracted_sdk_path)
- success = self.WaitUntil(_RemoveFile, retry_sleep=2,
- expect_retval=False)
+ success = self.WaitUntil(_RemoveFile, retry_sleep=2, expect_retval=False)
self.assertTrue(success,
msg='Cannot remove %s' % self._extracted_sdk_path)
if self._temp_dir:
pyauto_utils.RemovePath(self._temp_dir)
+ def _RunProcessAndCheckOutput(self, args, look_for, is_in=True):
+ """Run process and look for string in output.
+
+ Args:
+ args: Argument strings to pass to subprocess.
+ look_for: The string to search in output.
+ is_in: True if checking if param look_for is in output.
+ False if checking if param look_for is not in output.
+
+ Returns:
+ True, if output contains parameter |look_for| and |is_in| is True, or
+ False otherwise.
+ """
+ proc = subprocess.Popen(args, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ (stdout, stderr) = proc.communicate()
+ lines = (stdout + stderr).splitlines()
+ for line in lines:
+ if look_for in line:
+ return is_in
+ return not is_in
+
def _OpenExamplesAndStartTest(self, examples):
"""Open each example and verify that it's working.
Args:
examples: A dict of name to url of examples.
"""
+ self._EnableNaClPlugin()
+
# Open all examples.
for name, url in examples.items():
self.AppendTab(pyauto.GURL(url))
@@ -219,6 +479,17 @@
self._VerifyAnExample(name, url)
self._CheckForCrashes()
+ # Reload all examples.
+ for _ in range(2):
+ for tab_index in range(self.GetTabCount()):
+ self.GetBrowserWindow(0).GetTab(tab_index).Reload()
+ self._CheckForCrashes()
+
+ # Verify all examples are working.
+ for name, url in examples.items():
+ self._VerifyAnExample(name, url)
+ self._CheckForCrashes()
+
# Close each tab, check for crashes and verify all open
# examples operate correctly.
tab_count = self.GetTabCount()
@@ -242,15 +513,12 @@
url: A string url of the example.
"""
available_example_tests = {
- 'dynamic_library_open': self._VerifyDynamicLibraryOpen,
- 'geturl': self._VerifyGetURLExample,
- 'input_events': self._VerifyInputEventsExample,
- 'load_progress': self._VerifyLoadProgressExample,
- 'multithreaded_input_events':
- self._VerifyMultithreadedInputEventsExample,
- 'pi_generator': self._VerifyPiGeneratorExample,
- 'sine_synth': self._VerifySineSynthExample,
- 'web_socket':self._VerifyWebSocketExample,
+ 'hello_world_c': self._VerifyHelloWorldExample,
+ 'hello_world': self._VerifyHelloWorldExample,
+ 'pi_generator': self._VerifyPiGeneratorExample,
+ 'sine_synth': self._VerifySineSynthExample,
+ 'geturl': self._VerifyGetURLExample,
+ 'life': self._VerifyConwaysLifeExample
}
if not name in available_example_tests:
@@ -268,258 +536,269 @@
if tab_index:
available_example_tests[name](tab_index, name, url)
- def _VerifyElementPresent(self, element_id, expected_value, tab_index, msg,
- attribute='innerHTML', timeout=150):
- """Determine if dom element has the expected value.
+ def _VerifyHelloWorldExample(self, tab_index, name, url):
+ """Verify Hello World Example.
Args:
- element_id: Dom element's id.
- expected_value: String to be matched against the Dom element.
- tab_index: Tab index to work on.
- attribute: Attribute to match |expected_value| against, if
- given. Defaults to 'innerHTML'.
- timeout: The max timeout (in secs) for which to wait.
+ tab_index: Tab index integer that the example is on.
+ name: A string name of the example.
+ url: A string url of the example.
"""
- js_code = """
- var output = document.getElementById('%s').%s;
- var result;
- if (output.indexOf('%s') != -1)
- result = 'pass';
- else
- result = 'fail';
- window.domAutomationController.send(result);
- """ % (element_id, attribute, expected_value)
success = self.WaitUntil(
- lambda: self.ExecuteJavascript(js_code, tab_index),
- timeout=timeout, expect_retval='pass')
- self.assertTrue(success, msg=msg)
+ lambda: self.GetDOMValue(
+ 'document.getElementById("statusField").innerHTML',
+ tab_index),
+ timeout=60, expect_retval='SUCCESS')
+ self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
- def _CreateJSToSimulateMouseclick(self):
- """Create javascript to simulate mouse click event."""
js_code = """
- var rightClick = document.createEvent('MouseEvents');
- rightClick.initMouseEvent(
- 'mousedown', true, true, document,
- 1, 32, 121, 10, 100,
- false, false, false, false,
- 2, document.getElementById('event_module')
- );
- document.getElementById('event_module').dispatchEvent(rightClick);
- window.domAutomationController.send('done');
+ window.alert = function(e) {
+ window.domAutomationController.send(String(e));
+ }
+ window.domAutomationController.send("done");
"""
- return js_code
+ self.ExecuteJavascript(js_code, tab_index)
- def _VerifyInputEventsExample(self, tab_index, name, url):
- """Verify Input Events Example.
+ result = self.ExecuteJavascript('document.helloForm.elements[1].click();',
+ tab_index)
+ self.assertEqual(result, '42',
+ msg='Example %s failed. URL: %s' % (name, url))
+ result = self.ExecuteJavascript('document.helloForm.elements[2].click();',
+ tab_index)
+ self.assertEqual(result, 'dlrow olleH',
+ msg='Example %s failed. URL: %s' % (name, url))
+
+ def _VerifyPiGeneratorExample(self, tab_index, name, url):
+ """Verify Pi Generator Example.
+
Args:
tab_index: Tab index integer that the example is on.
name: A string name of the example.
url: A string url of the example.
"""
- success = self._VerifyElementPresent('eventString', 'DidChangeView',
- tab_index, msg='Example %s failed. URL: %s' % (name, url))
-
- # Simulate mouse click on event module.
- js_code = self._CreateJSToSimulateMouseclick()
- self.ExecuteJavascript(js_code, tab_index)
-
- # Check if 'eventString' has handled above mouse click.
success = self.WaitUntil(
- lambda: re.search('DidHandleInputEvent', self.GetDOMValue(
- 'document.getElementById("eventString").innerHTML',
- tab_index)).group(), expect_retval='DidHandleInputEvent')
+ lambda: self.GetDOMValue('document.form.pi.value', 0, tab_index)[0:3],
+ timeout=120, expect_retval='3.1')
self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
- def _VerifyMultithreadedInputEventsExample(self, tab_index, name, url):
- """Verify Input Events Example.
+ # Get top corner of Pi image.
+ js_code = """
+ var obj = document.getElementById('piGenerator');
+ var curleft = curtop = 0;
+ do {
+ curleft += obj.offsetLeft;
+ curtop += obj.offsetTop;
+ } while (obj = obj.offsetParent);
+ window.domAutomationController.send(curleft + ", " + curtop);
+ """
+ result = self.ExecuteJavascript(js_code, tab_index)
+ result_split = result.split(', ')
+ x = int(result_split[0])
+ y = int(result_split[1])
+ window = self.GetBrowserInfo()['windows'][0]
+ window_to_content_x = 2
+ window_to_content_y = 80
+ pi_image_x = x + window['x'] + window_to_content_x
+ pi_image_y = y + window['y'] + window_to_content_y
+ if self._IsGetPixelSupported():
+ is_animating = self._IsColorChanging(pi_image_x, pi_image_y, 50, 50)
+ self.assertTrue(is_animating,
+ msg='Example %s failed. URL: %s' % (name, url))
+
+ def _VerifySineSynthExample(self, tab_index, name, url):
+ """Verify Sine Wave Synthesizer Example.
+
Args:
tab_index: Tab index integer that the example is on.
name: A string name of the example.
url: A string url of the example.
"""
success = self.WaitUntil(
- lambda: bool(self.GetDOMValue(
- 'document.getElementById("eventString").innerHTML',
- tab_index).find('DidChangeView') + 1))
-
+ lambda: self.GetDOMValue(
+ 'document.getElementById("frequency_field").value',
+ tab_index),
+ timeout=30, expect_retval='440')
self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
- # Simulate mouse click on event module.
- js_code = self._CreateJSToSimulateMouseclick()
- self.ExecuteJavascript(js_code, tab_index)
+ self.ExecuteJavascript(
+ 'document.body.getElementsByTagName("button")[0].click();'
+ 'window.domAutomationController.send("done")',
+ tab_index)
- # Check if above mouse click is handled.
- success = self._VerifyElementPresent('eventString', 'Mouse event',
- tab_index, msg='Example %s failed. URL: %s' % (name, url))
+ # TODO(chrisphan): Verify sound.
- # Kill worker thread and queue
- js_code = """
- document.getElementsByTagName('button')[0].click();
- window.domAutomationController.send('done');
- """
- self.ExecuteJavascript(js_code, tab_index)
+ def _VerifyGetURLExample(self, tab_index, name, url):
+ """Verify GetURL Example.
- # Check if main thread has cancelled queue.
- success = self._VerifyElementPresent('eventString', 'Received cancel',
- tab_index, msg='Example %s failed. URL: %s' % (name, url))
-
- # Simulate mouse click on event module.
- js_code = self._CreateJSToSimulateMouseclick()
- self.ExecuteJavascript(js_code, tab_index)
-
- # Check if above mouse click is not handled after killing worker thread.
- def _CheckMouseClickEventStatus():
- return self.GetDOMValue(
- 'document.getElementById("eventString").innerHTML',
- tab_index).find('Mouse event', self.GetDOMValue(
- 'document.getElementById("eventString").innerHTML', tab_index).find(
- 'Received cancel'))
-
- success = self.WaitUntil(_CheckMouseClickEventStatus, expect_retval=-1)
- self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
-
- def _VerifyWebSocketExample(self, tab_index, name, url):
- """Verify Web Socket Open Example.
-
Args:
tab_index: Tab index integer that the example is on.
name: A string name of the example.
url: A string url of the example.
"""
- # Check if example is loaded.
success = self.WaitUntil(
lambda: self.GetDOMValue(
- 'document.getElementById("statusField").innerHTML', tab_index),
- expect_retval='SUCCESS')
+ 'document.getElementById("status_field").innerHTML',
+ tab_index),
+ timeout=60, expect_retval='SUCCESS')
self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
- # Simulate clicking on Connect button to establish a connection.
- js_code = """
- document.getElementsByTagName('input')[1].click();
- window.domAutomationController.send('done');
- """
- self.ExecuteJavascript(js_code, tab_index)
+ self.ExecuteJavascript(
+ 'document.geturl_form.elements[0].click();'
+ 'window.domAutomationController.send("done")',
+ tab_index)
- # Check if connected
- success = self._VerifyElementPresent('log', 'connected', tab_index,
- msg='Example %s failed. URL: %s' %(name, url), attribute='value')
-
- # Simulate clicking on Send button to send text message in log.
js_code = """
- document.getElementsByTagName('input')[3].click();
- window.domAutomationController.send('done');
+ var output = document.getElementById("general_output").innerHTML;
+ var result;
+ if (output.indexOf("test passed") != -1)
+ result = "pass";
+ else
+ result = "fail";
+ window.domAutomationController.send(result);
"""
- self.ExecuteJavascript(js_code, tab_index)
success = self.WaitUntil(
- lambda: bool(re.search('send:', self.GetDOMValue(
- 'document.getElementById("log").value', tab_index))))
+ lambda: self.ExecuteJavascript(js_code, tab_index),
+ timeout=30, expect_retval='pass')
self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
- def _VerifyDynamicLibraryOpen(self, tab_index, name, url):
- """Verify Dynamic Library Open Example.
+ def _VerifyConwaysLifeExample(self, tab_index, name, url):
+ """Verify Conway's Life Example.
Args:
tab_index: Tab index integer that the example is on.
name: A string name of the example.
url: A string url of the example.
"""
- # Check if example is loaded.
- success = self._VerifyElementPresent('consolec', 'Eightball loaded',
- tab_index, msg='Example %s failed. URL: %s' % (name, url))
+ window = self.GetBrowserInfo()['windows'][0]
+ window_to_content_x = 2
+ window_to_content_y = 80
+ x = window['x'] + window_to_content_x
+ y = window['y'] + window_to_content_y
+ offset_pixel = 100
+ if self._IsGetPixelSupported():
+ success = self.WaitUntil(
+ lambda: self._GetPixel(x + offset_pixel, y + offset_pixel),
+ timeout=30, expect_retval=16777215)
+ self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
- # Simulate clicking on ASK button and check answer log for desired answer.
- js_code = """
- document.getElementsByTagName('input')[1].click();
- window.domAutomationController.send('done');
+ def _GetXMLNodeData(self, nodelist):
+ rc = []
+ for node in nodelist:
+ if node.nodeType == node.TEXT_NODE:
+ rc.append(node.data)
+ return ''.join(rc)
+
+ def _IsColorChanging(self, x, y, width, height):
+ """Check screen for anything that is moving.
+
+ Args:
+ x: X coordinate on the screen.
+ y: Y coordinate on the screen.
+ width: Width of the area to scan.
+ height: Height of the area to scan.
+
+ Returns:
+ True, if pixel color in area is changing, or
+ False otherwise.
"""
- self.ExecuteJavascript(js_code, tab_index)
- def _CheckAnswerLog():
- return bool(re.search(r'NO|YES|42|MAYBE NOT|DEFINITELY|'
- 'ASK ME TOMORROW|MAYBE|PARTLY CLOUDY',
- self.GetDOMValue('document.getElementById("answerlog").innerHTML',
- tab_index)))
+ color_a = self._GetAreaPixelColor(x, y, width, height)
+ def _HasColorChanged():
+ color_b = self._GetAreaPixelColor(x, y, width, height)
+ return color_a != color_b
- success = self.WaitUntil(_CheckAnswerLog)
- self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
+ return self.WaitUntil(_HasColorChanged, timeout=6,
+ retry_sleep=2, expect_retval=True)
- def _VerifyLoadProgressExample(self, tab_index, name, url):
- """Verify Dynamic Library Open Example.
+ def _IsGetPixelSupported(self):
+ """Check if get pixel is supported.
+ Returns:
+ True, if get pixel is supported, or
+ False otherwise.
+ """
+ return pyauto.PyUITest.IsWin()
+
+ def _GetAreaPixelColor(self, x, y, width, height):
+ """Get an area of pixel color and return a list of color code values.
+
Args:
- tab_index: Tab index integer that the example is on.
- name: A string name of the example.
- url: A string url of the example.
+ x: X coordinate on the screen.
+ y: Y coordinate on the screen.
+ width: Width of the area to scan.
+ height: Height of the area to scan.
+
+ Returns:
+ A list containing color codes.
"""
- # Check if example loads and displays loading progress.
- success = self.WaitUntil(
- lambda: self.GetDOMValue(
- 'document.getElementById("status_field").innerHTML', tab_index),
- timeout=150, expect_retval='SUCCESS')
- self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
+ if pyauto.PyUITest.IsMac():
+ pass # TODO(chrisphan): Do Mac.
+ elif pyauto.PyUITest.IsWin():
+ return self._GetAreaPixelColorWin(x, y, width, height)
+ elif pyauto.PyUITest.IsLinux():
+ pass # TODO(chrisphan): Do Linux.
+ return None
- def _CheckLoadProgressStatus():
- return re.search(
- r'(loadstart).+(progress:).+(load).+(loadend).+(lastError:)',
- self.GetDOMValue(
- 'document.getElementById("event_log_field").innerHTML', tab_index))
- success = self.WaitUntil(_CheckLoadProgressStatus)
- self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
+ def _GetAreaPixelColorWin(self, x, y, width, height):
+ """Get an area of pixel color for Windows and return a list.
- def _VerifyPiGeneratorExample(self, tab_index, name, url):
- """Verify Pi Generator Example.
+ Args:
+ x: X coordinate on the screen.
+ y: Y coordinate on the screen.
+ width: Width of the area to scan.
+ height: Height of the area to scan.
+ Returns:
+ A list containing color codes.
+ """
+ colors = []
+ hdc = ctypes.windll.user32.GetDC(0)
+ for x_pos in xrange(x, x + width, 1):
+ for y_pos in xrange(y, y + height, 1):
+ color = ctypes.windll.gdi32.GetPixel(hdc, x_pos, y_pos)
+ colors.append(color)
+ return colors
+
+ def _GetPixel(self, x, y):
+ """Get pixel color at coordinate x and y.
+
Args:
- tab_index: Tab index integer that the example is on.
- name: A string name of the example.
- url: A string url of the example.
+ x: X coordinate on the screen.
+ y: Y coordinate on the screen.
+
+ Returns:
+ An integer color code.
"""
- success = self.WaitUntil(
- lambda: self.GetDOMValue('document.form.pi.value', tab_index)[0:3],
- expect_retval='3.1')
- self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
+ if pyauto.PyUITest.IsMac():
+ pass # TODO(chrisphan): Do Mac.
+ elif pyauto.PyUITest.IsWin():
+ return self._GetPixelWin(x, y)
+ elif pyauto.PyUITest.IsLinux():
+ pass # TODO(chrisphan): Do Linux.
+ return None
- def _VerifySineSynthExample(self, tab_index, name, url):
- """Verify Sine Wave Synthesizer Example.
+ def _GetPixelWin(self, x, y):
+ """Get pixel color at coordinate x and y for Windows
Args:
- tab_index: Tab index integer that the example is on.
- name: A string name of the example.
- url: A string url of the example.
+ x: X coordinate on the screen.
+ y: Y coordinate on the screen.
+
+ Returns:
+ An integer color code.
"""
- success = self.WaitUntil(
- lambda: self.GetDOMValue(
- 'document.getElementById("frequency_field").value',
- tab_index),timeout=150, expect_retval='440')
- self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
- self.ExecuteJavascript(
- 'document.body.getElementsByTagName("button")[0].click();'
- 'window.domAutomationController.send("done")',
- tab_index)
+ hdc = ctypes.windll.user32.GetDC(0)
+ color = ctypes.windll.gdi32.GetPixel(hdc, x, y)
+ return color
- def _VerifyGetURLExample(self, tab_index, name, url):
- """Verify GetURL Example.
+ def _CheckForCrashes(self, last_action=None, last_action_param=None):
+ """Check for any browser/tab crashes and hangs.
Args:
- tab_index: Tab index integer that the example is on.
- name: A string name of the example.
- url: A string url of the example.
+ last_action: Specify action taken before checking for crashes.
+ last_action_param: Parameter for last action.
"""
- success = self.WaitUntil(
- lambda: self.GetDOMValue(
- 'document.getElementById("status_field").innerHTML',
- tab_index), timeout=150, expect_retval='SUCCESS')
- self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
- self.ExecuteJavascript(
- 'document.geturl_form.elements[0].click();'
- 'window.domAutomationController.send("done")',
- tab_index)
- success = self._VerifyElementPresent('general_output', 'test passed',
- tab_index, msg='Example %s failed. URL: %s' % (name, url))
-
- def _CheckForCrashes(self):
- """Check for any browser/tab crashes and hangs."""
self.assertTrue(self.GetBrowserWindowCount(),
msg='Browser crashed, no window is open.')
@@ -539,9 +818,22 @@
if not self.GetDOMValue('document.body.innerHTML', tab['index']):
self.fail(msg='Tab crashed on %s' % tab['url'])
+ # TODO(chrisphan): Check for tab hangs and browser hangs.
+ # TODO(chrisphan): Handle specific action: close browser, close tab.
+ if last_action == 'close tab':
+ pass
+ elif last_action == 'close browser':
+ pass
+ else:
+ pass
+
def _GetPlatformArchitecture(self):
"""Get platform architecture.
+ Args:
+ last_action: Last action taken before checking for crashes.
+ last_action_param: Parameter for last action.
+
Returns:
A string representing the platform architecture.
"""
@@ -557,6 +849,19 @@
return '32bit'
return '32bit'
+ def _HasFile(self, pattern, root=os.curdir):
+ """Check if a file matching the specified pattern exists in a directory.
+
+ Args:
+ pattern: Pattern of file name.
+ root: Directory to start looking.
+
+ Returns:
+ True, if root contains the file name pattern, or
+ False otherwise.
+ """
+ return len(glob.glob(os.path.join(root, pattern)))
+
def _HasPathInTree(self, pattern, is_file, root=os.curdir):
"""Recursively checks if a file/directory matching a pattern exists.
@@ -578,6 +883,22 @@
return True
return False
+ def _GetDirectoryPath(self, pattern, root=os.curdir):
+ """Get the path of a directory in another directory.
+
+ Args:
+ pattern: Pattern of directory name.
+ root: Directory to start looking.
+
+ Returns:
+ A string of the path.
+ """
+ for path, dirs, files in os.walk(os.path.abspath(root)):
+ result = fnmatch.filter(dirs, pattern)
+ if result:
+ return os.path.join(path, result[0])
+ return None
+
def _HasAllSystemRequirements(self):
"""Verify NaCl SDK installation system requirements.
@@ -614,8 +935,17 @@
def _DownloadNaClSDK(self):
"""Download NaCl SDK."""
self._temp_dir = tempfile.mkdtemp()
- dl_file = urllib2.urlopen(self._settings['post_sdk_zip'])
- file_path = os.path.join(self._temp_dir, 'nacl_sdk.zip')
+ if pyauto.PyUITest.IsWin():
+ dl_file = urllib2.urlopen(self._settings['release_win_sdk_url'])
+ file_path = os.path.join(self._temp_dir, 'naclsdk_win.exe')
+ elif pyauto.PyUITest.IsMac():
+ dl_file = urllib2.urlopen(self._settings['release_mac_sdk_url'])
+ file_path = os.path.join(self._temp_dir, 'naclsdk_mac.tgz')
+ elif pyauto.PyUITest.IsLinux():
+ dl_file = urllib2.urlopen(self._settings['release_lin_sdk_url'])
+ file_path = os.path.join(self._temp_dir, 'naclsdk_linux.tgz')
+ else:
+ self.fail(msg='NaCl SDK does not support this OS.')
try:
f = open(file_path, 'wb')
@@ -627,12 +957,24 @@
def _ExtractNaClSDK(self):
"""Extract NaCl SDK."""
- source_file = os.path.join(self._temp_dir, 'nacl_sdk.zip')
- if zipfile.is_zipfile(source_file):
- zip = zipfile.ZipFile(source_file, 'r')
- zip.extractall(self._extracted_sdk_path)
+ if pyauto.PyUITest.IsWin():
+ source_file = os.path.join(self._temp_dir, 'naclsdk_win.exe')
+ proc = subprocess.Popen([source_file, '/S', '/D=' +
+ self._extracted_sdk_path],
+ stdout=subprocess.PIPE)
+ proc.communicate()
+ if not os.listdir(self._extracted_sdk_path):
+ self.fail(msg='Failed to extract NaCl SDK.')
+ elif pyauto.PyUITest.IsMac():
+ source_file = os.path.join(self._temp_dir, 'naclsdk_mac.tgz')
+ tar = tarfile.open(source_file, 'r')
+ tar.extractall(self._extracted_sdk_path)
+ elif pyauto.PyUITest.IsLinux():
+ source_file = os.path.join(self._temp_dir, 'naclsdk_linux.tgz')
+ tar = tarfile.open(source_file, 'r')
+ tar.extractall(self._extracted_sdk_path)
else:
- self.fail(msg='%s is not a valid zip file' % source_file)
+ self.fail(msg='NaCl SDK does not support this OS.')
def _IsURLAlive(self, url):
"""Test if URL is alive."""
@@ -659,7 +1001,7 @@
urllib2.urlopen('http://localhost:5103?quit=1')
success = self.WaitUntil(
lambda: self._IsURLAlive('http://localhost:5103'),
- retry_sleep=1, expect_retval=False)
+ timeout=30, retry_sleep=1, expect_retval=False)
if not success:
if not proc:
self.fail(msg='Failed to close HTTP server.')
@@ -668,9 +1010,38 @@
try:
proc.kill()
except:
- self.fail(msg='Failed to close HTTP server.')
+ self.fail(msg='Failed to close HTTP server')
- def _SearchNaClSDKFile(self, search_list):
+ def _SearchNaClSDKTarFile(self, search_list, source_file):
+ """Search NaCl SDK tar file for example files and directories.
+
+ Args:
+ search_list: A list of strings, representing file and
+ directory names for which to search.
+ source_file: The string name of an NaCl SDK tar file.
+ """
+ tar = tarfile.open(source_file, 'r')
+
+ # Look for files and directories in examples.
+ files = copy.deepcopy(search_list)
+ for tar_info in tar:
+ file_name = tar_info.name
+ if tar_info.isdir() and not file_name.endswith('/'):
+ file_name = file_name + '/'
+
+ for name in files:
+ if file_name.find('examples/' + name):
+ files.remove(name)
+ if not files:
+ break
+
+ tar.close()
+
+ self.assertEqual(len(files), 0,
+ msg='Missing files or directories: %s' %
+ ', '.join(map(str, files)))
+
+ def _SearchNaClSDKFileWindows(self, search_list):
"""Search NaCl SDK file for example files and directories in Windows.
Args:
@@ -688,18 +1059,28 @@
msg='Missing files or directories: %s' %
', '.join(map(str, missing_items)))
- def ExtraChromeFlags(self):
- """Ensures Nacl is enabled.
+ def _EnableNaClPlugin(self):
+ """Enable NaCl plugin."""
+ nacl_plugin = (self.GetPluginsInfo().PluginForName('Chrome NaCl') or
+ self.GetPluginsInfo().PluginForName('Native Client'))
+ if not nacl_plugin:
+ self.fail(msg='No NaCl plugin found.')
+ self.EnablePlugin(nacl_plugin[0]['path'])
- Returns:
- A list of extra flags to pass to Chrome when it is launched.
+ self.NavigateToURL('about:flags')
+
+ js_code = """
+ chrome.send('enableFlagsExperiment', ['enable-nacl', 'true']);
+ requestFlagsExperimentsData();
+ window.domAutomationController.send('done');
"""
- extra_chrome_flags = [
- '--enable-nacl',
- '--enable-nacl-exception-handling',
- '--nacl-gdb',
- ]
- return pyauto.PyUITest.ExtraChromeFlags(self) + extra_chrome_flags
+ self.ExecuteJavascript(js_code)
+ self.RestartBrowser(False)
+ self.NavigateToURL('about://version')
+ self.assertEqual(self.FindInPage('--enable-nacl')['match_count'], 1,
+ msg='Missing expected Chrome flag --enable-nacl.')
+
+
if __name__ == '__main__':
pyauto_functional.Main()
« no previous file with comments | « chrome/test/functional/PYAUTO_TESTS ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698