Index: chrome/test/functional/nacl_sdk.py |
=================================================================== |
--- chrome/test/functional/nacl_sdk.py (revision 261231) |
+++ chrome/test/functional/nacl_sdk.py (working copy) |
@@ -1,796 +0,0 @@ |
-#!/usr/bin/env python |
-# 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 copy |
-import ctypes |
-from distutils import version |
-import fnmatch |
-import glob |
-import hashlib |
-import logging |
-import os |
-import platform |
-import re |
-import shutil |
-import subprocess |
-import sys |
-import tempfile |
-import urllib2 |
-import xml.dom.minidom |
-import zipfile |
- |
-import pyauto_functional # Must be imported before pyauto. |
-import pyauto |
-import pyauto_utils |
-import test_utils |
- |
- |
-class NaClSDKTest(pyauto.PyUITest): |
- """Tests for the NaCl SDK.""" |
- _isExamplesTest = False |
- _extracted_sdk_path = None |
- _temp_dir = None |
- _updated_pepper_versions = [] |
- _latest_updated_pepper_versions = [] |
- _settings = { |
- 'post_sdk_download_url': 'http://code.google.com/chrome/nativeclient/' |
- 'docs/download.html', |
- 'post_sdk_zip': 'http://storage.googleapis.com/' |
- 'nativeclient-mirror/nacl/nacl_sdk/nacl_sdk.zip', |
- 'min_required_chrome_build': 14, |
- } |
- |
- def tearDown(self): |
- pyauto.PyUITest.tearDown(self) |
- if not self._isExamplesTest: |
- self._RemoveDownloadedTestFile() |
- |
- def testNaClSDK(self): |
- """Verify that NaCl SDK is working properly.""" |
- if not self._HasAllSystemRequirements(): |
- logging.info('System does not meet the requirements.') |
- return |
- self._extracted_sdk_path = tempfile.mkdtemp() |
- self._VerifyDownloadLinks() |
- self._VerifyNaClSDKInstaller() |
- self._VerifyInstall() |
- self._VerifyUpdate() |
- self._LaunchServerAndVerifyExamplesAllPepperVersions() |
- |
- def NaClSDKExamples(self): |
- """Verify if NaCl SDK examples are working.""" |
- self._isExamplesTest = True |
- nacl_sdk_root = os.environ.get('NACL_SDK_ROOT', None) |
- pepper_version = os.environ.get('PEPPER_VER', None) |
- if nacl_sdk_root and pepper_version: |
- self._LaunchServerAndVerifyExamples('pepper_' + pepper_version, |
- nacl_sdk_root) |
- else: |
- self.fail(msg='Missing pepper version to be checked or SDK path.') |
- |
- def _VerifyDownloadLinks(self): |
- """Verify the download links. |
- |
- Simply verify that NaCl download links exist in html page. |
- """ |
- html = None |
- for i in xrange(3): |
- try: |
- html = urllib2.urlopen(self._settings['post_sdk_download_url']).read() |
- break |
- except: |
- pass |
- 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) |
- |
- def _VerifyNaClSDKInstaller(self): |
- """Verify NaCl SDK installer.""" |
- search_list = [ |
- 'sdk_cache/', |
- 'sdk_tools/', |
- ] |
- mac_lin_additional_search_items = [ |
- 'naclsdk', |
- ] |
- win_additional_search_items = [ |
- 'naclsdk.bat' |
- ] |
- self._DownloadNaClSDK() |
- self._ExtractNaClSDK() |
- if pyauto.PyUITest.IsWin(): |
- self._SearchNaClSDKFile( |
- search_list + win_additional_search_items) |
- elif pyauto.PyUITest.IsMac() or pyauto.PyUITest.IsLinux(): |
- self._SearchNaClSDKFile( |
- search_list + mac_lin_additional_search_items) |
- else: |
- self.fail(msg='NaCl SDK does not support this OS.') |
- |
- def _VerifyInstall(self): |
- """Install NACL sdk.""" |
- # Executing naclsdk(.bat) list |
- 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]) |
- else: |
- self.fail(msg='NaCl SDK does not support this OS.') |
- subprocess.Popen([source_file, 'list'], |
- stdout=subprocess.PIPE, |
- stderr=subprocess.PIPE).communicate() |
- |
- def _VerifyUpdate(self): |
- """Update NACL sdk""" |
- # Executing naclsdk(.bat) update |
- 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') |
- 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) |
- |
- def _GetURLForExampleName(self, name, toolchain): |
- return 'http://localhost:5103/%s/index_%s.html' % (name, toolchain) |
- |
- def _GetExampleNamesAndURLs(self, examples_path): |
- """Get a list of all examples as (name, url) tuples. |
- |
- Args: |
- examples_path: The path to the examples directory in the NaCl SDK. |
- """ |
- toolchains = ['newlib', 'glibc', 'pnacl'] |
- |
- examples = [] |
- for toolchain in toolchains: |
- for example in os.listdir(examples_path): |
- html_path = os.path.join(examples_path, example, |
- 'index_%s.html' % (toolchain,)) |
- if os.path.exists(html_path): |
- example_url = self._GetURLForExampleName(example, toolchain) |
- examples.append((example, example_url)) |
- return examples |
- |
- def _LaunchServerAndVerifyExamplesAllPepperVersions(self): |
- for pepper_version in self._latest_updated_pepper_versions: |
- pepper_path = os.path.join(self._extracted_sdk_path, |
- 'nacl_sdk', 'pepper_' + str(pepper_version)) |
- self._LaunchServerAndVerifyExamples(pepper_version, pepper_path) |
- |
- def _LaunchServerAndVerifyExamples(self, pepper_version, pepper_path): |
- """Start local HTTP server and verify examples.""" |
- if self._ChromeAndPepperVersionMatch(pepper_version): |
- # Close server if it's already open. |
- if self._IsURLAlive('http://localhost:5103'): |
- self._CloseHTTPServer() |
- |
- examples_path = os.path.join(pepper_path, 'examples') |
- |
- # 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) |
- |
- examples = self._GetExampleNamesAndURLs(examples_path) |
- try: |
- self._OpenExamplesAndStartTest(examples) |
- finally: |
- self._CloseHTTPServer(proc) |
- |
- else: |
- self.pprint('Pepper Version %s does not match the Chrome version %s.' |
- % (pepper_version, |
- self.GetBrowserInfo()['properties']['ChromeVersion'])) |
- |
- def _ChromeAndPepperVersionMatch(self, pepper_version='pepper_18'): |
- """Determine if chrome and pepper version match""" |
- 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]) |
- |
- def _RemoveDownloadedTestFile(self): |
- """Delete downloaded files and dirs from downloads directory.""" |
- if self._extracted_sdk_path and os.path.exists(self._extracted_sdk_path): |
- self._CloseHTTPServer() |
- |
- def _RemoveFile(): |
- 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) |
- self.assertTrue(success, |
- msg='Cannot remove %s' % self._extracted_sdk_path) |
- |
- if self._temp_dir: |
- pyauto_utils.RemovePath(self._temp_dir) |
- |
- def _OpenExamplesAndStartTest(self, examples): |
- """Open each example and verify that it's working. |
- |
- Args: |
- examples: A list of example (name, url) tuples. |
- """ |
- example_verify_funcs = { |
- 'dlopen': self._VerifyDynamicLibraryOpen, |
- 'file_io': self._VerifyFileIoExample, |
- 'geturl': self._VerifyGetURLExample, |
- 'input_events': self._VerifyInputEventsExample, |
- 'load_progress': self._VerifyLoadProgressExample, |
- 'mt_input_events': self._VerifyMultithreadedInputEventsExample, |
- 'pi_generator': self._VerifyPiGeneratorExample, |
- 'sine_synth': self._VerifySineSynthExample, |
- 'websocket': self._VerifyWebSocketExample, |
- } |
- |
- # Remove examples that we don't yet verify |
- examples = [(name, url) for name, url in examples |
- if name in example_verify_funcs] |
- |
- # Open all examples. |
- for name, url in examples: |
- self.AppendTab(pyauto.GURL(url)) |
- self._CheckForCrashes() |
- |
- # Verify all examples are working. |
- for name, url in examples: |
- self._VerifyAnExample(name, url, example_verify_funcs[name]) |
- self._CheckForCrashes() |
- |
- # Close each tab and check for crashes. |
- tab_count = self.GetTabCount() |
- for index in xrange(tab_count - 1, 0, -1): |
- self.CloseTab(tab_index=index) |
- self._CheckForCrashes() |
- |
- def _VerifyAnExample(self, name, url, verify_func): |
- """Verify NaCl example is working. |
- |
- Args: |
- name: A string name of the example. |
- url: A string url of the example. |
- verify_func: The function to verify the example. |
- Takes (tab_index, name, url) as parameters. |
- """ |
- if not verify_func: |
- 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: |
- verify_func(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. |
- |
- 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. |
- """ |
- 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) |
- |
- 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, common.naclModule |
- ); |
- common.naclModule.dispatchEvent(rightClick); |
- window.domAutomationController.send('done'); |
- """ |
- return js_code |
- |
- def _VerifyInputEventsExample(self, tab_index, name, url): |
- """Verify Input Events 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') |
- self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url)) |
- |
- def _VerifyMultithreadedInputEventsExample(self, tab_index, name, url): |
- """Verify Input Events 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)) |
- |
- 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) |
- |
- # Check if above mouse click is handled. |
- success = self._VerifyElementPresent('eventString', 'Mouse event', |
- tab_index, msg='Example %s failed. URL: %s' % (name, url)) |
- |
- # Kill worker thread and queue |
- js_code = """ |
- document.getElementsByTagName('button')[0].click(); |
- window.domAutomationController.send('done'); |
- """ |
- self.ExecuteJavascript(js_code, tab_index) |
- |
- # 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 _VerifyFileIoExample(self, tab_index, name, url): |
- """Verify File IO 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. |
- """ |
- def _CheckStatus(substring_expected, fail_msg): |
- self.assertTrue( |
- self.WaitUntil( |
- lambda: self.GetDOMValue( |
- 'document.getElementById("statusField").innerHTML', tab_index)\ |
- .find(substring_expected) != -1, expect_retval=True), |
- msg='Example %s failed. URL: %s. Reason: %s' % (name, url, fail_msg)) |
- |
- # Give permission to use file system by clicking infobar OK |
- infobar_index = test_utils.WaitForInfobarTypeAndGetIndex(self, |
- 'confirm_infobar', 0, tab_index) |
- self.PerformActionOnInfobar('accept', infobar_index, 0, tab_index) |
- _CheckStatus('Ready!', 'NaCl module load') |
- |
- # Check that deleting non-existing files gives file not found |
- js_code = """ |
- document.getElementById('file_name').value = '/abc'; |
- document.getElementById('file_editor').value = 'test'; |
- document.getElementById('delete_but').click(); |
- window.domAutomationController.send('done'); |
- """ |
- self.ExecuteJavascript(js_code, tab_index) |
- _CheckStatus('File not found', 'Delete non-existing') |
- |
- # Check that saving works |
- js_code = """ |
- document.getElementById('save_but').click(); |
- window.domAutomationController.send('done'); |
- """ |
- self.ExecuteJavascript(js_code, tab_index) |
- _CheckStatus('Save successful', 'Save test') |
- |
- # Check that we load what we saved |
- js_code = """ |
- document.getElementById('file_editor').value = 'different'; |
- document.getElementById('load_but').click(); |
- window.domAutomationController.send('done'); |
- """ |
- self.ExecuteJavascript(js_code, tab_index) |
- _CheckStatus('Load complete', 'Load test') |
- self.assertTrue( |
- self.GetDOMValue('document.getElementById("file_editor").value', |
- tab_index).find('test') != -1, msg='Loaded wrong text or failed') |
- |
- # Check that we delete files successfully |
- js_code = """ |
- document.getElementById('delete_but').click(); |
- window.domAutomationController.send('done'); |
- """ |
- self.ExecuteJavascript(js_code, tab_index) |
- _CheckStatus('File deleted', 'Delete test') |
- |
- # Check that file is deleted and load produces not found |
- js_code = """ |
- document.getElementById('load_but').click(); |
- window.domAutomationController.send('done'); |
- """ |
- self.ExecuteJavascript(js_code, tab_index) |
- _CheckStatus('File not found', 'Load deleted test') |
- |
- 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') |
- 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) |
- |
- # Check if connected |
- success = self._VerifyElementPresent('log', 'connected', tab_index, |
- msg='Example %s failed. URL: %s' % (name, url)) |
- |
- # Simulate clicking on Send button to send text message in log. |
- js_code = """ |
- document.getElementsByTagName('input')[3].click(); |
- window.domAutomationController.send('done'); |
- """ |
- self.ExecuteJavascript(js_code, tab_index) |
- success = self.WaitUntil( |
- lambda: bool(re.search('send:', self.GetDOMValue( |
- 'document.getElementById("log").textContent', tab_index)))) |
- self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url)) |
- |
- def _VerifyDynamicLibraryOpen(self, tab_index, name, url): |
- """Verify Dynamic Library 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._VerifyElementPresent('log', 'Eightball loaded!', |
- tab_index, 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'); |
- """ |
- 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("log").innerHTML', |
- tab_index))) |
- |
- success = self.WaitUntil(_CheckAnswerLog) |
- self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url)) |
- |
- def _VerifyLoadProgressExample(self, tab_index, name, url): |
- """Verify Dynamic Library 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 loads and displays loading progress. |
- success = self.WaitUntil( |
- lambda: self.GetDOMValue( |
- 'document.getElementById("statusField").innerHTML', tab_index), |
- timeout=150, expect_retval='SUCCESS') |
- self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url)) |
- |
- def _CheckLoadProgressStatus(): |
- return re.search( |
- r'(loadstart).+(progress:).+(load).+(loadend).+(lastError:)', |
- self.GetDOMValue( |
- 'document.getElementById("log").innerHTML', tab_index)) |
- success = self.WaitUntil(_CheckLoadProgressStatus) |
- self.assertTrue(success, 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.WaitUntil( |
- lambda: self.GetDOMValue('document.getElementById("pi").value', |
- tab_index)[0:3], |
- expect_retval='3.1') |
- self.assertTrue(success, 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', |
- 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) |
- |
- 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("statusField").innerHTML', |
- tab_index), timeout=150, expect_retval='SUCCESS') |
- self.assertTrue(success, msg='Example %s failed. URL: %s' % (name, url)) |
- self.ExecuteJavascript( |
- 'document.getElementById("button").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.') |
- |
- 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. |
- 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) |
- |
- # Check for any crashed tabs. |
- tabs = info['windows'][0]['tabs'] |
- for tab in tabs: |
- if tab['url'] != 'about:blank': |
- if not self.GetDOMValue('document.body.innerHTML', tab['index']): |
- self.fail(msg='Tab crashed on %s' % tab['url']) |
- |
- def _GetPlatformArchitecture(self): |
- """Get platform architecture. |
- |
- 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 _HasPathInTree(self, pattern, is_file, root=os.curdir): |
- """Recursively checks if a file/directory matching a pattern exists. |
- |
- Args: |
- pattern: Pattern of file or directory name. |
- is_file: True if looking for file, or False if looking for directory. |
- 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 is_file: |
- if len(fnmatch.filter(files, pattern)): |
- return True |
- else: |
- if len(fnmatch.filter(dirs, pattern)): |
- return True |
- return False |
- |
- def _HasAllSystemRequirements(self): |
- """Verify NaCl SDK installation system requirements. |
- |
- Returns: |
- True, if system passed requirements, or |
- False otherwise. |
- """ |
- # Check python version. |
- if sys.version_info[0:2] < (2, 6): |
- 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. |
- min_required_chrome_build = self._settings['min_required_chrome_build'] |
- browser_info = self.GetBrowserInfo() |
- chrome_version = browser_info['properties']['ChromeVersion'] |
- chrome_build = int(chrome_version.split('.')[0]) |
- return chrome_build >= min_required_chrome_build |
- |
- 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') |
- |
- try: |
- f = open(file_path, 'wb') |
- f.write(dl_file.read()) |
- except IOError: |
- self.fail(msg='Cannot open %s.' % file_path) |
- finally: |
- f.close() |
- |
- 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) |
- else: |
- self.fail(msg='%s is not a valid zip file' % source_file) |
- |
- 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. |
- proc is None when there is no pointer to HTTP server process. |
- """ |
- if not self._IsURLAlive('http://localhost:5103'): |
- return |
- response = urllib2.urlopen('http://localhost:5103') |
- html = response.read() |
- if not 'Native Client' in html: |
- self.fail(msg='Port 5103 is in use.') |
- |
- urllib2.urlopen('http://localhost:5103?quit=1') |
- success = self.WaitUntil( |
- lambda: self._IsURLAlive('http://localhost:5103'), |
- retry_sleep=1, expect_retval=False) |
- if not success: |
- if not proc: |
- self.fail(msg='Failed to close HTTP server.') |
- else: |
- if proc.poll() == None: |
- try: |
- proc.kill() |
- except: |
- self.fail(msg='Failed to close HTTP server.') |
- |
- def _SearchNaClSDKFile(self, search_list): |
- """Search NaCl SDK file for example files and directories in Windows. |
- |
- Args: |
- search_list: A list of strings, representing file and |
- directory names for which to search. |
- """ |
- missing_items = [] |
- for name in search_list: |
- is_file = name.find('/') < 0 |
- if not is_file: |
- name = name.replace('/', '') |
- if not self._HasPathInTree(name, is_file, self._extracted_sdk_path): |
- missing_items.append(name) |
- self.assertEqual(len(missing_items), 0, |
- msg='Missing files or directories: %s' % |
- ', '.join(map(str, missing_items))) |
- |
- def ExtraChromeFlags(self): |
- """Ensures Nacl is enabled. |
- |
- Returns: |
- A list of extra flags to pass to Chrome when it is launched. |
- """ |
- extra_chrome_flags = [ |
- '--enable-nacl', |
- '--enable-nacl-exception-handling', |
- '--nacl-gdb', |
- ] |
- return pyauto.PyUITest.ExtraChromeFlags(self) + extra_chrome_flags |
- |
-if __name__ == '__main__': |
- pyauto_functional.Main() |