blob: 4a40e49075be0d0dd5ac753cf92d8c9ac0183fd8 [file] [log] [blame]
# Copyright 2017 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 hashlib
import os
import shutil
import tempfile
import unittest
import StringIO
import mock
from telemetry.internal import snap_page_util
from telemetry.testing import options_for_unittests
from telemetry.testing import tab_test_case
from telemetry.internal.browser import browser_finder
from telemetry.internal.util import path
class FakeResponse(object):
def __init__(self):
self.content = None
def read(self):
return self.content
class SnapPageTest(unittest.TestCase):
def setUp(self):
self.finder_options = options_for_unittests.GetCopy()
browser_to_create = browser_finder.FindBrowser(self.finder_options)
self.platform = browser_to_create.platform
self.platform.network_controller.Open()
def tearDown(self):
self.platform.network_controller.Close()
def _SnapWithDummyValuesExceptPath(self, snapshot_path):
snap_page_util.SnapPage(self.finder_options, 'url', interactive=False,
snapshot_path=snapshot_path,
enable_browser_log=False)
def testSnappingToInvalidSnapshotPath(self):
with self.assertRaises(ValueError):
self._SnapWithDummyValuesExceptPath('nosuffix')
with self.assertRaises(ValueError):
self._SnapWithDummyValuesExceptPath('')
with self.assertRaises(ValueError):
self._SnapWithDummyValuesExceptPath('foohtml')
with self.assertRaises(ValueError):
self._SnapWithDummyValuesExceptPath('foo.svg')
with self.assertRaises(ValueError):
self._SnapWithDummyValuesExceptPath('foo.xhtml')
def testSnappingSimplePage(self):
self.platform.SetHTTPServerDirectories(path.GetUnittestDataDir())
html_file_path = os.path.join(path.GetUnittestDataDir(), 'green_rect.html')
url = self.platform.http_server.UrlOf(html_file_path)
outfile = StringIO.StringIO()
test_dir = tempfile.mkdtemp()
try:
snap_page_util._SnapPageToFile(
self.finder_options, url, interactive=False,
snapshot_path=os.path.join(test_dir, 'page.html'),
snapshot_file=outfile, enable_browser_log=False)
self.assertIn('id="green"', outfile.getvalue())
finally:
shutil.rmtree(test_dir)
@mock.patch('urllib2.urlopen')
def testSnappingPageWithImage(self, mock_urlopen):
test_dir = tempfile.mkdtemp()
try:
src_html_filename = 'image.html'
dest_html_path = os.path.join(test_dir, src_html_filename)
shutil.copyfile(os.path.join(path.GetUnittestDataDir(),
src_html_filename),
dest_html_path)
self.platform.SetHTTPServerDirectories(path.GetUnittestDataDir())
url = self.platform.http_server.UrlOf(
os.path.join(path.GetUnittestDataDir(), src_html_filename))
outfile = StringIO.StringIO()
# Load the test image file's content so that we can return it
# from the mocked url request as if we'd actually fetched the
# image from an external source.
request_response = FakeResponse()
expected_image_path = os.path.join(path.GetUnittestDataDir(), 'image.png')
with open(expected_image_path, 'rb') as image_file:
request_response.content = image_file.read()
# Mock out the external image url fetch to return the loaded
# test image content.
mock_urlopen.return_value = request_response
snap_page_util._SnapPageToFile(
self.finder_options, url, interactive=False,
snapshot_path=os.path.join(test_dir, src_html_filename),
snapshot_file=outfile, enable_browser_log=False)
self.assertIn('id="target"', outfile.getvalue())
# Validate that the 'fetched' image was written to the
# destination local image path.
expected_fetched_md5 = hashlib.md5(request_response.content).hexdigest()
actual_fetched_md5 = None
with open(os.path.join(test_dir, 'image', '0-target.png'), 'rb') as f:
actual_fetched_md5 = hashlib.md5(f.read()).hexdigest()
self.assertEqual(expected_fetched_md5, actual_fetched_md5)
finally:
shutil.rmtree(test_dir)
class JSONTransmissionTest(tab_test_case.TabTestCase):
def testTransmittingLargeObject(self):
# Create a large array of 1 million elements
json_obj = [1] * 1000000
snap_page_util._TransmitLargeJSONToTab(
self._tab, json_obj, 'big_array')
self.assertEquals(self._tab.EvaluateJavaScript('big_array.length'), 1000000)