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

Unified Diff: functional/nacl_sdk.py

Issue 7541046: Adding pyauto tests for the NaCl SDK. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/chrome/test/
Patch Set: '' Created 9 years, 4 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 | « data/nacl_sdk/nacl_sdk_setting ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: functional/nacl_sdk.py
===================================================================
--- functional/nacl_sdk.py (revision 0)
+++ functional/nacl_sdk.py (revision 0)
@@ -0,0 +1,1140 @@
+#!/usr/bin/python
+# 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.
+
+import copy
+import ctypes
+from distutils import version
+import fnmatch
+import glob
+import hashlib
+import os
+import platform
+import random
+import subprocess
+import sys
+import tarfile
+import time
+import urllib2
+
+import pyauto_functional # Must be imported before pyauto.
+import pyauto
+import pyauto_utils
+
+class NaClSDKTest(pyauto.PyUITest):
+ """Tests for the NaCl SDK."""
+ _EXTRACTED_NACL_SDK_DIR = 'extracted_nacl_sdk'
+
+ def testNaClSDK(self):
+ """Verify that NaCl SDK is working properly."""
+ if self._HasAllSystemRequirements() == False:
dennis_jeffrey 2011/08/08 18:00:53 if not self._HasAllSystemRequirements():
dennis_jeffrey 2011/08/08 18:00:53 This check is performed before all 3 of the tests
chrisphan 2011/08/08 23:14:39 As for Python 2.6, I don't see a way to skip a tes
chrisphan 2011/08/08 23:14:39 Done.
+ return
dennis_jeffrey 2011/08/08 18:00:53 Before returning, maybe we can log a message indic
chrisphan 2011/08/08 22:46:44 Done.
+
+ self._VerifyNaClPlugin()
+
+ self._VerifyDownloadLinks()
+
+ self._VerifyNaClSDKInstaller()
+
+ self._VerifyBuildStubProject()
+
+ self._LaunchServerAndVerifyExamples()
+
+ self._VerifyRebuildExamples()
+
+ self._VerifySelldrAndNcval()
+
+ self._RemoveDownloadedTestFile()
dennis_jeffrey 2011/08/08 18:00:53 I recommend removing the blank lines in-between ea
chrisphan 2011/08/08 22:46:44 Done.
+
+ def testVerifyNaClSDKChecksum(self):
+ """Verify NaCl SDK Checksum."""
+ if self._HasAllSystemRequirements() == False:
+ return
+
+ settings = self._GetTestSetting()
+
+ self._DownloadNaClSDK()
+
+ download_dir = os.path.join(self.DataDir(), 'downloads')
+
+ if pyauto.PyUITest.IsWin():
+ expected_shasum = settings['release_win_expected_shasum']
+ file_path = os.path.join(download_dir, 'naclsdk_win.exe')
+ elif pyauto.PyUITest.IsMac():
+ expected_shasum = settings['release_mac_expected_shasum']
+ file_path = os.path.join(download_dir, 'naclsdk_mac.tgz')
+ elif pyauto.PyUITest.IsLinux():
+ expected_shasum = settings['release_lin_expected_shasum']
+ file_path = os.path.join(download_dir, 'naclsdk_linux.tgz')
dennis_jeffrey 2011/08/08 18:00:53 maybe add an "else:" in which we fail (just to be
chrisphan 2011/08/08 22:46:44 Done.
+
+ sha = hashlib.sha1()
+ try:
+ f = open(file_path, 'rb')
+ sha.update(f.read())
+ shasum = sha.hexdigest()
+ self.assertEqual(expected_shasum, shasum,
+ msg='Unexpected checksum. Expected: %s, get: %s'
dennis_jeffrey 2011/08/08 18:00:53 nit: 'get' --> 'got'
chrisphan 2011/08/08 22:46:44 Done.
+ % (expected_shasum, shasum))
+ except IOError:
+ self.fail(msg='Cannot open %s.' % file_path)
+ finally:
+ f.close()
+
+ def testVerifyPrereleaseGallery(self):
+ """Verify Pre-release gallery examples."""
+ if self._HasAllSystemRequirements() == False:
+ return
+ settings = self._GetTestSetting()
+ examples = settings['prerelease_gallery']
+ self._OpenExamplesAndStartTest(examples)
dennis_jeffrey 2011/08/08 18:00:53 We could combine the above 3 lines: self._OpenExa
chrisphan 2011/08/08 22:46:44 Done.
+
+ def _VerifyNaClPlugin(self):
+ """Verify NaCl Plugin."""
+ settings = self._GetTestSetting()
+ examples = settings['gallery_examples']
+ self._OpenExamplesAndStartTest(examples)
dennis_jeffrey 2011/08/08 18:00:53 We could combine the above 3 lines like we did in
chrisphan 2011/08/08 22:46:44 Done.
+
+ def _VerifyDownloadLinks(self):
+ """Verify the download links."""
+ settings = self._GetTestSetting()
+ sdk_download_url = settings['post_sdk_download_url']
+ self.NavigateToURL(sdk_download_url)
dennis_jeffrey 2011/08/08 18:00:53 Combine the above 2 lines: self.NavigateToURL(set
chrisphan 2011/08/08 22:46:44 Done.
+ html = self.GetTabContents()
+
+ # Make sure the correct URL is under the correct label.
+ if pyauto.PyUITest.IsWin():
+ win_sdk_url = 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='Misplace download link: %s' % win_sdk_url)
dennis_jeffrey 2011/08/08 18:00:53 nit: 'Misplace' --> 'Misplaced". Same at lines 12
chrisphan 2011/08/08 22:46:44 Done.
+ elif pyauto.PyUITest.IsMac():
+ mac_sdk_url = 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='Misplace download link: %s' % mac_sdk_url)
+ elif pyauto.PyUITest.IsLinux():
+ lin_sdk_url = 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='Misplace download link: %s' % lin_sdk_url)
dennis_jeffrey 2011/08/08 18:00:53 Maybe add an "else:" case in which we fail (just t
chrisphan 2011/08/08 22:46:44 Done.
+
+ def _VerifyNaClSDKInstaller(self):
+ """Verify NaCl SDK installer."""
+ search_list = [
+ '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 = [
+ 'sel_ldr_x86_32',
+ 'sel_ldr_x86_64',
+ 'ncval_x86_32',
+ 'ncval_x86_64'
+ ]
+
+ win_additional_search_items = [
+ 'httpd.cmd',
+ 'sel_ldr_x86_32.exe',
+ 'sel_ldr_x86_64.exe',
+ 'ncval_x86_32.exe',
+ 'ncval_x86_64.exe'
+ ]
+
+ download_dir = os.path.join(self.DataDir(), 'downloads')
+
+ self._DownloadNaClSDK()
+
+ if pyauto.PyUITest.IsWin():
+ source_file = os.path.join(download_dir, 'naclsdk_win.exe')
+ self._SearchNaClSDKFileWindows(
+ search_list + win_additional_search_items, source_file)
+ elif pyauto.PyUITest.IsMac():
+ source_file = os.path.join(download_dir, 'naclsdk_mac.tgz')
+ self._SearchNaClSDKTarFile(search_list + mac_lin_additional_search_items,
+ source_file)
+ elif pyauto.PyUITest.IsLinux():
+ source_file = os.path.join(download_dir, 'naclsdk_linux.tgz')
+ self._SearchNaClSDKTarFile(search_list + mac_lin_additional_search_items,
+ source_file)
+ else:
+ self.fail(msg='NaCl SDK does not support this OS.')
+
+ self._ExtractNaClSDK()
+
+ def _VerifyBuildStubProject(self):
+ """Build stub project."""
+ stub_project_files = [
+ 'build.scons',
+ 'scons'
+ ]
+
+ download_dir = os.path.join(self.DataDir(), 'downloads')
+ sdk_path = os.path.join(download_dir, self._EXTRACTED_NACL_SDK_DIR)
+ project_template_path = self._GetDirectoryPath('project_templates',
+ sdk_path)
+ examples_path = self._GetDirectoryPath('examples', sdk_path)
+ init_project_path = os.path.join(project_template_path, 'init_project.py')
+
+ # Build a c project.
dennis_jeffrey 2011/08/08 18:00:53 nit: 'c' --> 'C'
chrisphan 2011/08/08 22:46:44 Done.
+ proc = subprocess.Popen(
+ ['python', init_project_path, '-n', 'hello_c', '-c', '-d',
+ examples_path], stdout=subprocess.PIPE)
+ proc.communicate()
+
+ 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 hello_c stub project.')
+
+ # Build a cc project.
dennis_jeffrey 2011/08/08 18:00:53 nit: 'cc' --> 'C++'
chrisphan 2011/08/08 22:46:44 Done.
+ proc = subprocess.Popen(
+ ['python', init_project_path, '-n', 'hello_cc', '-c', '-d',
+ examples_path], stdout=subprocess.PIPE)
+ proc.communicate()
+
+ 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 hello_cc stub project.')
dennis_jeffrey 2011/08/08 18:00:53 Lines 197-206 and lines 208-217 are almost identic
chrisphan 2011/08/08 22:46:44 Done.
+
+ def _LaunchServerAndVerifyExamples(self):
+ """Start local HTTP server and verify examples."""
+ download_dir = os.path.join(self.DataDir(), 'downloads')
+ sdk_path = os.path.join(download_dir, self._EXTRACTED_NACL_SDK_DIR)
+ examples_path = self._GetDirectoryPath('examples', sdk_path)
+
+ # Make sure server is not open.
+ if not self._IsURLAlive('http://localhost:5103'):
dennis_jeffrey 2011/08/08 18:00:53 Shouldn't we remove the "not" here?
chrisphan 2011/08/08 22:46:44 Done.
+ self._CloseHTTPServer()
+
+ # Start HTTP server.
+ if pyauto.PyUITest.IsWin():
+ http_path = os.path.join(examples_path, 'httpd.cmd')
+ proc = subprocess.Popen([http_path], cwd=examples_path)
+ else:
+ http_path = os.path.join(examples_path, 'httpd.py')
+ proc = subprocess.Popen(['python', http_path], cwd=examples_path)
+
+ self.NavigateToURL('http://localhost:5103')
dennis_jeffrey 2011/08/08 18:00:53 Are we sure the server has started by the time we
dennis_jeffrey 2011/08/08 18:00:53 Also, should we gracefully handle the case when po
chrisphan 2011/08/08 22:46:44 Done.
chrisphan 2011/08/08 22:46:44 Done.
+ self.assertTrue(self._IsURLAlive('http://localhost:5103'),
+ 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."""
dennis_jeffrey 2011/08/08 18:00:53 'Re-build the examples and verify they are as expe
chrisphan 2011/08/08 22:46:44 Done.
+ download_dir = os.path.join(self.DataDir(), 'downloads')
+ sdk_path = os.path.join(download_dir, self._EXTRACTED_NACL_SDK_DIR)
+ examples_path = self._GetDirectoryPath('examples', sdk_path)
+ scons_path = os.path.join(examples_path, 'scons -c')
+
+ example_dirs = [
+ 'geturl',
+ 'hello_world',
+ 'hello_world_c',
+ 'pi_generator',
+ 'sine_synth'
+ ]
+
+ proc = subprocess.Popen([scons_path], cwd=examples_path, shell=True)
+ proc.communicate()
+ for x in example_dirs:
+ ex_path = os.path.join(examples_path, x)
+ if self._HasFile('*.nmf', ex_path):
+ self.fail(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."""
+ download_dir = os.path.join(self.DataDir(), 'downloads')
+ sdk_path = os.path.join(download_dir, self._EXTRACTED_NACL_SDK_DIR)
+ examples_path = self._GetDirectoryPath('examples', sdk_path)
dennis_jeffrey 2011/08/08 18:00:53 A lot of the helper functions in this file start w
chrisphan 2011/08/08 23:14:39 Done.
+
+ architecture = self._GetPlatformArchitecture()
+ scons_arg = None
+ if pyauto.PyUITest.IsWin():
+ if architecture == '64bit':
+ scons_arg = 'test64'
+ else:
+ scons_arg = 'test32'
+ elif pyauto.PyUITest.IsMac():
+ scons_arg = 'test64'
+ elif pyauto.PyUITest.IsLinux():
+ scons_arg = 'test64'
+ 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)
+ stdout = proc.communicate()[0]
+ lines = stdout.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':
+ if not self._HasFileInTree('hello_world_x86_64.nexe', examples_path):
+ self.fail(msg='Missing file: hello_world_x86_64.nexe.')
+ else:
+ if not self._HasFileInTree('hello_world_x86_32.nexe', examples_path):
+ self.fail(msg='Missing file: hello_world_x86_32.nexe.')
+
+ # Verify that a mismatch of sel_ldr and .nexe produces an error.
+ toolchain_path = self._GetDirectoryPath('toolchain', 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')
+
+ success = False
dennis_jeffrey 2011/08/08 18:00:53 We might be able to remove this line. I think the
chrisphan 2011/08/08 22:46:44 Done.
+ 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 your platform on the matching .nexe.
dennis_jeffrey 2011/08/08 18:00:53 'your platform' --> 'the current platform'
chrisphan 2011/08/08 22:46:44 Done.
+ ncval_32_path = os.path.join(bin_path, 'ncval_x86_32')
+ ncval_64_path = os.path.join(bin_path, 'ncval_x86_64')
+ success = False
dennis_jeffrey 2011/08/08 18:00:53 Same comment as line 339 above.
chrisphan 2011/08/08 22:46:44 Done.
+ if architecture == '64bit':
+ success = self._RunProcessAndCheckOutput(
+ [ncval_64_path, nexe_64_path], 'is safe')
+ else:
+ success = self._RunProcessAndCheckOutput(
+ [ncval_32_path, nexe_32_path], 'is safe')
+ self.assertTrue(success, msg='Failed to verify ncval.')
+
+ # Verify that a mismatch of ncval and .nexe produces an error.
+ success = False
dennis_jeffrey 2011/08/08 18:00:53 Same comment as line 339 above.
chrisphan 2011/08/08 22:46:44 Done.
+ 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."""
+ download_dir = os.path.join(self.DataDir(), 'downloads')
+ extracted_sdk_path = os.path.join(download_dir, self._EXTRACTED_NACL_SDK_DIR)
dennis_jeffrey 2011/08/08 18:00:53 This line is just a little bit too long.
chrisphan 2011/08/08 22:46:44 Done.
+ pyauto_utils.RemovePath(extracted_sdk_path)
+
+ sdk_path = os.path.join(download_dir, 'naclsdk_win.exe')
+ pyauto_utils.RemovePath(sdk_path)
+ sdk_path = os.path.join(download_dir, 'naclsdk_mac.tgz')
+ pyauto_utils.RemovePath(sdk_path)
+ sdk_path = os.path.join(download_dir, 'naclsdk_linux.tgz')
+ pyauto_utils.RemovePath(sdk_path)
dennis_jeffrey 2011/08/08 18:00:53 We can shorten the above 6 lines: for sdk_path in
chrisphan 2011/08/08 22:46:44 Done.
+
+ 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_out is not in output.
dennis_jeffrey 2011/08/08 18:00:53 'look_out' --> 'look_for'
chrisphan 2011/08/08 22:46:44 Done.
+
+ Returns:
+ True, if output contains parameter look_for, or
dennis_jeffrey 2011/08/08 18:00:53 'True, if output contains parameter look_for,' -->
chrisphan 2011/08/08 22:46:44 Done.
+ False otherwise.
+ """
+ proc = subprocess.Popen(args, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ (stdout, stderr) = proc.communicate()
+ lines = stdout.splitlines()
+ for line in lines:
+ if look_for in line:
+ if is_in:
+ return True
+ else:
+ return False
dennis_jeffrey 2011/08/08 18:00:53 Change the above 4 lines to this: return is_in
chrisphan 2011/08/08 22:46:44 Done.
+
+ lines = stderr.splitlines()
+ for line in lines:
+ if look_for in line:
+ if is_in:
+ return True
+ else:
+ return False
dennis_jeffrey 2011/08/08 18:00:53 Lines 400-406 and 408-414 are also very similar.
+ if is_in:
+ return False
+ else:
+ return True
dennis_jeffrey 2011/08/08 18:00:53 Change the above 4 lines to this: return not is_i
chrisphan 2011/08/08 22:46:44 Done.
+
+ 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))
+ self._CheckForCrashes()
+
+ # Verify all examples are working.
+ for name, url in examples.items():
+ self._VerifyAnExample(name, url)
+ self._CheckForCrashes()
+
+ # Reload all examples.
+ for _ in range(1):
dennis_jeffrey 2011/08/08 18:00:53 Doesn't this just execute once? Why is this loop
chrisphan 2011/08/08 22:46:44 Done.
+ 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()
+
+ # Randomly close a tab, check for crashes and verify all open
+ # examples operate correctly.
dennis_jeffrey 2011/08/08 18:00:53 Rather than randomly closing tabs, it might be bet
chrisphan 2011/08/08 22:46:44 Done.
+ tab_count = self.GetTabCount()
+ for index in xrange(tab_count - 1, 0, -1):
+ tab_index = None
+ if index > 1:
+ tab_index = random.randint(1, index)
+ else:
+ tab_index = 1
+
+ self.GetBrowserWindow(0).GetTab(tab_index).Close(True)
+ self._CheckForCrashes()
+
+ tabs = self.GetBrowserInfo()['windows'][0]['tabs']
+ for tab in tabs:
+ if tab['index'] > 0:
+ for name, url in examples.items():
+ if url == tab['url']:
+ self._VerifyAnExample(name, url)
+ break
+
+ def _VerifyAnExample(self, name, url):
+ """Verify NaCl Example is working.
dennis_jeffrey 2011/08/08 18:00:53 nit: 'Example' --> 'example'
chrisphan 2011/08/08 22:46:44 Done.
+
+ Args:
+ name: A string name of the example.
+ url: A string url of the example.
+ """
+ available_example_tests = {
+ '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:
+ self.fail(msg='No test available for %s.' % name)
+
+ info = self.GetBrowserInfo()
+ tabs = info['windows'][0]['tabs']
+ tab_index = None
+ for tab in tabs:
+ if url == tab['url']:
+ self.ActivateTab(tab['index'])
+ tab_index = tab['index']
+ break
+
+ if tab_index != None:
dennis_jeffrey 2011/08/08 18:00:53 I think this should work too: if tab_index:
chrisphan 2011/08/08 23:14:39 Done.
+ available_example_tests[name](tab_index, name, url)
+
+ def _VerifyHelloWorldExample(self, tab_index, name, url):
+ """Verify Hello World 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.
+ """
+ wait_for = 60
dennis_jeffrey 2011/08/08 18:00:53 Maybe no need to define this as a separate variabl
chrisphan 2011/08/08 22:46:44 Done.
+ success = self.WaitUntil(
+ lambda: self.GetDOMValue(
+ 'document.getElementById("statusField").innerHTML',
+ 0, tab_index),
+ wait_for, expect_retval='SUCCESS')
dennis_jeffrey 2011/08/08 18:00:53 timeout=wait_for
chrisphan 2011/08/08 22:46:44 Done.
+ self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
+
+ js_code = """
+ window.alert = function(e) {
+ window.domAutomationController.send(String(e));
+ }
+ window.domAutomationController.send("done");
+ """
+ self.ExecuteJavascript(js_code, 0, tab_index)
+
+ result = self.ExecuteJavascript('document.helloForm.elements[1].click();',
+ 0, tab_index)
+ self.assertEqual(result, '42',
+ msg='Example %s failed. URL: %s' % (name, url))
+
+ result = self.ExecuteJavascript('document.helloForm.elements[2].click();',
+ 0, 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.
+ """
+ wait_for = 120
+ success = self.WaitUntil(
+ lambda: self.GetDOMValue('document.form.pi.value', 0, tab_index)[0:3],
+ wait_for, expect_retval='3.1')
+ self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
+
+ # Get top corner of pi image.
dennis_jeffrey 2011/08/08 18:00:53 nit: 'pi' --> 'Pi' to make it consistent with line
chrisphan 2011/08/08 22:46:44 Done.
+ 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, 0, 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: self.GetDOMValue(
+ 'document.getElementById("frequency_field").value',
+ 0, tab_index),
+ timeout=30, 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")',
+ 0, tab_index)
+
+ # TODO(chrisphan): Verify sound.
+
+ def _VerifyGetURLExample(self, tab_index, name, url):
+ """Verify GetURL 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: self.GetDOMValue(
+ 'document.getElementById("status_field").innerHTML',
+ 0, tab_index),
+ timeout=60, 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")',
+ 0, tab_index)
+
+ js_code = """
+ var output = document.getElementById("general_output").innerHTML;
+ var result;
+ if (output.indexOf("test passed") != -1)
+ result = "pass";
+ else
+ result = "fail";
+ window.domAutomationController.send(result);
+ """
+ success = self.WaitUntil(
+ lambda: self.ExecuteJavascript(js_code, 0, tab_index),
+ timeout=30, expect_retval='pass')
+ self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
+
+ 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.
+ """
+ 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():
+ wait_for = 30
dennis_jeffrey 2011/08/08 18:00:53 Similar comment as line 509 above.
chrisphan 2011/08/08 22:46:44 Done.
+ success = self.WaitUntil(
+ lambda: self._GetPixel(x + offset_pixel, y + offset_pixel),
+ wait_for, expect_retval=16777215)
dennis_jeffrey 2011/08/08 18:00:53 timeout=wait_for
chrisphan 2011/08/08 22:46:44 Done.
+ self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url))
+
+ def _IsColorChanging(self, x, y, width, height, tries=3, retry_sleep=2):
+ """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 look scan.
dennis_jeffrey 2011/08/08 18:00:53 Remove 'look'? If you do so, make the same change
chrisphan 2011/08/08 22:46:44 Done.
+ height: Height of the area to look scan.
+ tries: Number of tries.
+ retry_sleep: Sleep time in between each tries.
dennis_jeffrey 2011/08/08 18:00:53 nits: 'in between' --> 'in-between' 'tries' --> 't
chrisphan 2011/08/08 22:46:44 Done.
+
+ Returns:
+ True, if pixel color in area is changing, or
+ False otherwise.
+ """
+ color_a = self._GetAreaPixelColor(x, y, width, height)
+ for _ in xrange(tries):
+ time.sleep(retry_sleep)
+ color_b = self._GetAreaPixelColor(x, y, width, height)
+ if color_a != color_b:
+ return True
+ return False
+
+ def _IsGetPixelSupported(self):
+ """Check if get pixel is supported.
+
+ Returns:
+ True, if get pixel is supported, or
+ False otherwise.
+ """
+ if pyauto.PyUITest.IsWin():
+ return True
+ else:
+ return False
dennis_jeffrey 2011/08/08 18:00:53 Change the above 4 lines to this: return pyauto.P
chrisphan 2011/08/08 22:46:44 Done.
+
+ def _GetAreaPixelColor(self, x, y, width, height):
+ """Get an area of pixel color and return a list.
dennis_jeffrey 2011/08/08 18:00:53 'a list' --> 'a list of color code values'
chrisphan 2011/08/08 23:14:39 Done.
+
+ Args:
+ x: X coordinate on the screen.
+ y: Y coordinate on the screen.
+ width: Width of the area to look scan.
+ height: Height of the area to look scan.
+
+ Returns:
+ A list containing color codes.
+ """
+ if pyauto.PyUITest.IsMac():
+ pass # TODO(chrisphan): Do Mac.
+ elif pyauto.PyUITest.IsWin():
+ return self._GetAreaPixelColorWin(x, y, width, height)
dennis_jeffrey 2011/08/08 18:00:53 As you implement these helpers for the other platf
chrisphan 2011/08/08 22:46:44 Done.
+ elif pyauto.PyUITest.IsLinux():
+ pass # TODO(chrisphan): Do Linux.
+ return None
+
+ def _GetAreaPixelColorWin(self, x, y, width, height):
+ """Get an area of pixel color for Windows and return a list.
+
+ Args:
+ x: X coordinate on the screen.
+ y: Y coordinate on the screen.
+ width: Width of the area to look scan.
+ height: Height of the area to look 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:
+ x: X coordinate on the screen.
+ y: Y coordinate on the screen.
+
+ Returns:
+ An integer color code.
+ """
+ if pyauto.PyUITest.IsMac():
+ pass # TODO(chrisphan): Do Mac.
+ elif pyauto.PyUITest.IsWin():
+ return self._GetPixelWin(x, y)
dennis_jeffrey 2011/08/08 18:00:53 Similar comment as line 701 above.
chrisphan 2011/08/08 22:46:44 Done.
+ elif pyauto.PyUITest.IsLinux():
+ pass # TODO(chrisphan): Do Linux.
+ return None
+
+ def _GetPixelWin(self, x, y):
+ """Get pixel color at coordinate x and y for Windows
+
+ Args:
+ x: X coordinate on the screen.
+ y: Y coordinate on the screen.
+
+ Returns:
+ An integer color code.
+ """
+ hdc = ctypes.windll.user32.GetDC(0)
+ color = ctypes.windll.gdi32.GetPixel(hdc, x, y)
+ return color
+
+ def _CheckForCrashes(self, last_action=None, last_action_param=None):
+ """Check for any browser/tab crashes and hangs.
+
+ Args:
+ last_action: Specify action taken before checking for crashes.
+ last_action_param: Parameter for last action.
+ """
+ self.assertTrue(self.GetBrowserWindowCount(),
+ msg='Browser crashed, no window is open.')
+
+ info = self.GetBrowserInfo()
+ breakpad_folder = info['properties']['DIR_CRASH_DUMPS']
+ old_dmp_files = glob.glob(os.path.join(breakpad_folder, '*.dmp'))
+
+ # Verify there're no crash dump files
dennis_jeffrey 2011/08/08 18:00:53 nit: add period at end of sentence.
chrisphan 2011/08/08 22:46:44 Done.
+ for dmp_file in glob.glob(os.path.join(breakpad_folder, '*.dmp')):
+ self.assertTrue(dmp_file in old_dmp_files,
+ msg='Crash dump %s found' % dmp_file)
dennis_jeffrey 2011/08/08 18:00:53 indent this line so that the parameter lines up un
chrisphan 2011/08/08 22:46:44 Done.
+
+ # Check for any crashed tabs.
+ tabs = info['windows'][0]['tabs']
+ for tab in tabs:
+ if tab['url'] != 'about:blank':
+ if self.GetDOMValue('document.body.innerHTML', 0, tab['index']) == '':
dennis_jeffrey 2011/08/08 18:00:53 if not self.GetDOMValue('document.body.innerHTML',
chrisphan 2011/08/08 22:46:44 Done.
+ 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
dennis_jeffrey 2011/08/08 18:00:53 nit: add periods at the end of the above 2 lines.
chrisphan 2011/08/08 22:46:44 Done.
+ if last_action == 'close tab':
+ pass
+ elif last_action == 'close browser':
+ pass
dennis_jeffrey 2011/08/08 18:00:53 Maybe add an "else" case that gracefully handles a
chrisphan 2011/08/08 22:46:44 Done.
+
+ def _GetPlatformArchitecture(self):
+ """Get platform architecture.
+
+ Args:
+ last_action: Specify action taken before checking for crashes.
dennis_jeffrey 2011/08/08 18:00:53 'Specify' --> 'Last'
chrisphan 2011/08/08 22:46:44 Done.
+ last_action_param: Parameter for last action.
+
+ Returns:
+ A string representing the platform architecture.
+ """
+ if pyauto.PyUITest.IsWin():
+ if os.environ['PROGRAMFILES'] == 'C:\\Program Files (x86)':
+ return '64bit'
+ else:
+ return '32bit'
+ elif pyauto.PyUITest.IsMac() or pyauto.PyUITest.IsLinux():
+ if platform.machine() == 'x86_64':
+ return '64bit'
+ else:
+ return '32bit'
+ return '32bit'
+
+ def _HasFile(self, pattern, root=os.curdir):
+ """Check if file exist in directory.
dennis_jeffrey 2011/08/08 18:00:53 'Check if a file matching the specified pattern ex
chrisphan 2011/08/08 22:46:44 Done.
+
+ Args:
+ pattern: Pattern of file name.
+ root: Directory to start looking.
+
+ Returns:
+ True, if root contains the file name pattern, or
+ False otherwise.
+ """
+ if len(glob.glob(os.path.join(root, pattern))) > 0:
+ return True
+ return False
dennis_jeffrey 2011/08/08 18:00:53 Change the above 3 lines to this: return len(glob
chrisphan 2011/08/08 22:46:44 Done.
+
+ def _HasFileInTree(self, pattern, root=os.curdir):
+ """Check if file exist in directory.
+
+ Args:
+ pattern: Pattern of file name.
+ root: Directory to start looking.
+
+ Returns:
+ True, if root contains the file name pattern, or
+ False otherwise.
+ """
dennis_jeffrey 2011/08/08 18:00:53 This docstring looks the same as for the function
chrisphan 2011/08/08 22:46:44 Done.
+ for path, dirs, files in os.walk(os.path.abspath(root)):
+ if len(fnmatch.filter(files, pattern)) > 0:
+ return True
+ return False
+
+ def _HasDir(self, pattern, root=os.curdir):
+ """Check if directory exist in another directory.
+
+ Args:
+ pattern: Pattern of directory name.
+ root: Directory to start looking.
+
+ Returns:
+ True, if root contains the directory name pattern, or
+ False otherwise.
+ """
+ for path, dirs, files in os.walk(os.path.abspath(root)):
+ if len(fnmatch.filter(dirs, pattern)) > 0:
+ return True
+ return False
dennis_jeffrey 2011/08/08 18:00:53 This function is almost exactly the same as for th
chrisphan 2011/08/08 22:46:44 Done.
+
+ 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 len(result) > 0:
+ return os.path.join(path, result[0])
+ return None
+
+ def _HasAllSystemRequirements(self):
+ """Verify NaCl SDK Installation system requirements.
dennis_jeffrey 2011/08/08 18:00:53 nit: 'Installation' --> 'installation'
chrisphan 2011/08/08 22:46:44 Done.
+
+ Returns:
+ True, if system passed requirements, or
+ False otherwise.
+ """
+ # Check python version.
+ if sys.version_info[0:2] < (2, 5):
+ return False
+
+ # Check OS requirements.
+ if pyauto.PyUITest.IsMac():
+ mac_min_version = version.StrictVersion('10.6')
+ mac_version = version.StrictVersion(platform.mac_ver()[0])
+ if mac_version < mac_min_version:
+ return False
+ elif pyauto.PyUITest.IsWin():
+ if not (self.IsWin7() or self.IsWinVista() or self.IsWinXP()):
+ return False
+ elif pyauto.PyUITest.IsLinux():
+ pass # TODO(chrisphan): Check Lin requirements.
+ else:
+ return False
+
+ # Check for Chrome version compatibility.
+ # Nacl supports Chrome 10 and higher builds.
dennis_jeffrey 2011/08/08 18:00:53 nit: 'Nacl' --> 'NaCl'
chrisphan 2011/08/08 22:46:44 Done.
+ settings = self._GetTestSetting()
+ min_required_chrome_build = settings['min_required_chrome_build']
+ browser_info = self.GetBrowserInfo()
+ chrome_version = browser_info['properties']['ChromeVersion']
+ chrome_build = int(chrome_version.split('.')[0])
+ if chrome_build < min_required_chrome_build:
+ return False
+
+ return True
dennis_jeffrey 2011/08/08 18:00:53 Change lines 908-911 to this: return chrome_build
+
+ def _DownloadNaClSDK(self):
+ """Download NaCl SDK."""
+ settings = self._GetTestSetting()
+ win_sdk_url = settings['release_win_sdk_url']
+ mac_sdk_url = settings['release_mac_sdk_url']
+ lin_sdk_url = settings['release_lin_sdk_url']
dennis_jeffrey 2011/08/08 18:00:53 Remove the above 3 lines, and just inline the valu
chrisphan 2011/08/08 22:46:44 Done.
+
+ download_dir = os.path.join(self.DataDir(), 'downloads')
+
+ if pyauto.PyUITest.IsWin():
+ dl_file = urllib2.urlopen(win_sdk_url)
+ file_path = os.path.join(download_dir, 'naclsdk_win.exe')
+ elif pyauto.PyUITest.IsMac():
+ dl_file = urllib2.urlopen(mac_sdk_url)
+ file_path = os.path.join(download_dir, 'naclsdk_mac.tgz')
+ elif pyauto.PyUITest.IsLinux():
+ dl_file = urllib2.urlopen(lin_sdk_url)
+ file_path = os.path.join(download_dir, 'naclsdk_linux.tgz')
+ else:
+ self.fail(msg='NaCl SDK does not support this OS.')
+
+ try:
+ f = open(file_path, 'wb')
+ f.write(dl_file.read())
+ except IOError:
+ self.fail(msg='Cannot open %s.' % file_path)
+ finally:
+ f.close()
+
+
dennis_jeffrey 2011/08/08 18:00:53 Remove 1 of these blank lines.
chrisphan 2011/08/08 22:46:44 Done.
+ def _ExtractNaClSDK(self):
+ """Extract NaCl SDK."""
+ download_dir = os.path.join(self.DataDir(), 'downloads')
+ destination = os.path.join(download_dir, self._EXTRACTED_NACL_SDK_DIR)
+
+ pyauto_utils.RemovePath(destination)
+ if not os.path.exists(destination):
dennis_jeffrey 2011/08/08 18:00:53 If we remove the directory in line 948 above, why
chrisphan 2011/08/08 22:46:44 Done.
+ os.makedirs(destination)
+
+ if pyauto.PyUITest.IsWin():
+ # Requires 7-Zip to extract self-install archive.
+ seven_z_file_path = self._Get7ZipPath()
+ self.assertNotEqual(seven_z_file_path, None,
+ msg='7-Zip is required but could not be found.')
dennis_jeffrey 2011/08/08 18:00:53 indent this line by 4 more spaces
chrisphan 2011/08/08 22:46:44 Done.
+
+ source_file = os.path.join(download_dir, 'naclsdk_win.exe')
+ proc = subprocess.Popen(
+ [seven_z_file_path, 'x', source_file, '-o' + destination],
+ stdout=subprocess.PIPE)
dennis_jeffrey 2011/08/08 18:00:53 Indent these 2 lines by only 4 spaces as compared
+ proc.communicate()
+ elif pyauto.PyUITest.IsMac():
+ source_file = os.path.join(download_dir, 'naclsdk_mac.tgz')
+ tar = tarfile.open(source_file, 'r')
+ tar.extractall(destination)
+ elif pyauto.PyUITest.IsLinux():
+ source_file = os.path.join(download_dir, 'naclsdk_linux.tgz')
+ tar = tarfile.open(source_file, 'r')
+ tar.extractall(destination)
+ else:
+ self.fail(msg='NaCl SDK does not support this OS.')
+
+ def _Get7ZipPath(self):
dennis_jeffrey 2011/08/08 18:00:53 If this function only applies to Windows, maybe we
chrisphan 2011/08/08 22:46:44 Done.
+ """Check if 7-Zip is installed on Windows.
+
+ Returns:
+ String path of 7-Zip.
+ None if not exist.
dennis_jeffrey 2011/08/08 18:00:53 'String path to the 7-Zip executable, or None if i
chrisphan 2011/08/08 22:46:44 Done.
+ """
+ current_dir = os.path.dirname(__file__)
+ seven_zip_path = os.path.join(
+ current_dir, os.pardir, os.pardir,
+ os.pardir, 'third_party', '7-Zip', '7z.exe')
+
+ if os.path.isfile(seven_zip_path):
+ return seven_zip_path
+
+ # Attempt to find 7-Zip in Program Files.
+ program_files_path = os.getenv('ProgramFiles')
+ if program_files_path != None:
+ seven_zip_path = os.path.join(program_files_path, '7-Zip', '7z.exe')
+ if os.path.isfile(seven_zip_path):
+ return seven_zip_path
+ program_files_path = os.getenv('ProgramW6432')
+ if program_files_path != None:
+ seven_zip_path = os.path.join(program_files_path, '7-Zip', '7z.exe')
+ if os.path.isfile(seven_zip_path):
+ return seven_zip_path
+
+ return None
+
+ def _IsURLAlive(self, url):
+ """Test if URL is alive."""
+ try:
+ urllib2.urlopen(url)
+ except:
+ return False
+ return True
+
+ def _CloseHTTPServer(self, proc=None):
+ """Close HTTP server.
+
+ Args:
+ proc: Process that opened the HTTP server.
+ """
+ if not self._IsURLAlive('http://localhost:5103'):
+ return
+ urllib2.urlopen('http://localhost:5103?quit=1')
+ wait_for = 30
+ success = self.WaitUntil(
+ lambda: self._IsURLAlive('http://localhost:5103'),
+ timeout=wait_for, expect_retval=False)
+ if not success:
+ if proc == None:
+ self.fail(msg='Fail to close HTTP server')
+ else:
+ if proc.poll() == None:
+ try:
+ proc.kill()
+ except:
+ pass
dennis_jeffrey 2011/08/08 18:00:53 If we get to this 'except' clause, does that mean
chrisphan 2011/08/08 22:46:44 Done.
+
+ 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 len(files) == 0:
+ break
+
+ tar.close()
+
+ self.assertEqual(len(files), 0,
+ msg='Missing files or directories: %s' %
+ ', '.join(map(str, files)))
+
+ def _SearchNaClSDKFileWindows(self, search_list, source_file):
+ """Search NaCl SDK file for example files and directories.
dennis_jeffrey 2011/08/08 18:00:53 add to this docstring: 'in Windows'
chrisphan 2011/08/08 22:46:44 Done.
+
+ 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 Windows
+ self-install archive file.
+ """
+ files = []
+ for i in xrange(len(search_list)):
+ files.append(search_list[i].replace(r'/', '\\'))
+
+ # Requires 7-Zip to look at self-install archive.
+ seven_z_file_path = self._Get7ZipPath()
+ self.assertNotEqual(seven_z_file_path, None,
+ msg='7-Zip is required but could not be found.')
dennis_jeffrey 2011/08/08 18:00:53 indent this line more so that it lines up undernea
chrisphan 2011/08/08 23:14:39 Done.
+
+ proc = subprocess.Popen([seven_z_file_path, 'l', source_file],
+ stdout=subprocess.PIPE)
+ stdout = proc.communicate()[0]
+ lines = stdout.splitlines()
+ for x in lines:
+ item_name = x.split(' ')[-1]
+ for name in files:
+ if item_name.find(name) > 0:
+ files.remove(name)
+ if len(files) == 0:
+ break
+
+ self.assertEqual(len(files), 0,
+ msg='Missing files or directories: %s' %
+ ', '.join(map(str, files)))
+
+ def _EnableNaClPlugin(self):
+ """"Enable NaCl Plugin."""
dennis_jeffrey 2011/08/08 18:00:53 nit: 'Plugin' --> 'plugin'
chrisphan 2011/08/08 22:46:44 Done.
+ nacl_plugin = self.GetPluginsInfo().PluginForName('Chrome NaCl')
+ if len(nacl_plugin) == 0:
dennis_jeffrey 2011/08/08 18:00:53 if not nacl_plugin:
+ nacl_plugin = self.GetPluginsInfo().PluginForName('Native Client')
+ if len(nacl_plugin) == 0:
dennis_jeffrey 2011/08/08 18:00:53 if not nacl_plugin:
+ self.fail(msg='No NaCl Plugin found.')
dennis_jeffrey 2011/08/08 18:00:53 nit: 'Plugin' --> 'plugin'
chrisphan 2011/08/08 22:46:44 Done.
+ self.EnablePlugin(nacl_plugin[0]['path'])
+
+ self.NavigateToURL('about:flags')
+
+ js_code = """
+ chrome.send('enableFlagsExperiment', ['enable-nacl', 'true']);
+ requestFlagsExperimentsData();
+ window.domAutomationController.send('done');
+ """
+ self.ExecuteJavascript(js_code)
+ self.RestartBrowser(False)
+
+ def _GetTestSetting(self):
+ """Read the given data file and return a dictionary of items.
+
+ Returns:
+ A dict mapping of keys/values in the NaCl SDK setting file.
+ """
+ data_file = os.path.join(self.DataDir(), 'nacl_sdk', 'nacl_sdk_setting')
+
+ try:
+ f = open(data_file, 'r')
+ except IOError:
+ self.fail(msg='Cannot open %s.' % data_file)
+
+ try:
+ dictionary = eval(f.read(), {'__builtins__': None}, None)
+ except SyntaxError:
+ self.fail(msg='%s is an invalid setting file.' % data_file)
+ finally:
+ f.close()
+
+ return dictionary
+
+
+if __name__ == '__main__':
+ pyauto_functional.Main()
« no previous file with comments | « data/nacl_sdk/nacl_sdk_setting ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698