blob: 9f082019cb32337908b66d9713b7969effba1682 [file] [log] [blame]
# Copyright 2016 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 json
import logging
from blinkpy.common.host_mock import MockHost
from blinkpy.common.system.log_testing import LoggingTestCase
from blinkpy.web_tests.port.test import TestPort
from blinkpy.web_tests.servers.wptserve import WPTServe
class TestWPTServe(LoggingTestCase):
def setUp(self):
super(TestWPTServe, self).setUp()
self.host = MockHost()
self.port = TestPort(self.host)
self.host.filesystem.write_text_file(
'/mock-checkout/third_party/wpt_tools/wpt.config.json',
'{"ports": {}, "aliases": []}')
# pylint: disable=protected-access
def test_init_start_cmd_without_ws_handlers(self):
server = WPTServe(self.port, '/foo')
self.assertEqual(server._start_cmd, [
'python3',
'-u',
'/mock-checkout/third_party/wpt_tools/wpt/wpt',
'serve',
'--config',
server._config_file,
'--doc_root',
'/test.checkout/wtests/external/wpt',
])
def test_init_start_cmd_with_ws_handlers(self):
self.host.filesystem.maybe_make_directory(
'/test.checkout/wtests/external/wpt/websockets/handlers')
server = WPTServe(self.port, '/foo')
self.assertEqual(server._start_cmd, [
'python3',
'-u',
'/mock-checkout/third_party/wpt_tools/wpt/wpt',
'serve',
'--config',
server._config_file,
'--doc_root',
'/test.checkout/wtests/external/wpt',
'--ws_doc_root',
'/test.checkout/wtests/external/wpt/websockets/handlers',
])
def test_init_env(self):
server = WPTServe(self.port, '/foo')
self.assertEqual(
server._env, {
'MOCK_ENVIRON_COPY': '1',
'PATH': '/bin:/mock/bin',
'PYTHONPATH': '/mock-checkout/third_party/pywebsocket3/src'
})
def test_prepare_config(self):
server = WPTServe(self.port, '/foo')
server._prepare_config()
config = json.loads(
self.port._filesystem.read_text_file(server._config_file))
self.assertEqual(len(config['aliases']), 1)
self.assertDictEqual(config['aliases'][0], {
'url-path': '/gen/',
'local-dir': '/mock-checkout/out/Release/gen'
})
def test_start_with_stale_pid(self):
# Allow asserting about debug logs.
self.set_logging_level(logging.DEBUG)
self.host.filesystem.write_text_file('/log_file_dir/access_log', 'foo')
self.host.filesystem.write_text_file('/log_file_dir/error_log', 'foo')
self.host.filesystem.write_text_file('/tmp/pidfile', '7')
server = WPTServe(self.port, '/log_file_dir')
server._pid_file = '/tmp/pidfile'
server._check_that_all_ports_are_available = lambda: True
server._is_server_running_on_all_ports = lambda: True
server.start()
# PID file should be overwritten (MockProcess.pid == 42)
self.assertEqual(server._pid, 42)
self.assertEqual(self.host.filesystem.files[server._pid_file], '42')
# Config file should exist.
json.loads(self.port._filesystem.read_text_file(server._config_file))
logs = self.logMessages()
self.assertEqual(len(logs), 4)
self.assertEqual(logs[:2], [
'DEBUG: stale wptserve pid file, pid 7\n',
'DEBUG: pid 7 is not running\n',
])
self.assertTrue(logs[-2].startswith('DEBUG: Starting wptserve server'))
self.assertEqual(logs[-1],
'DEBUG: wptserve successfully started (pid = 42)\n')
def test_start_with_unkillable_zombie_process(self):
# Allow asserting about debug logs.
self.set_logging_level(logging.DEBUG)
self.host.filesystem.write_text_file('/log_file_dir/access_log', 'foo')
self.host.filesystem.write_text_file('/log_file_dir/error_log', 'foo')
self.host.filesystem.write_text_file('/tmp/pidfile', '7')
server = WPTServe(self.port, '/log_file_dir')
server._pid_file = '/tmp/pidfile'
server._check_that_all_ports_are_available = lambda: True
server._is_server_running_on_all_ports = lambda: True
# Simulate a process that never gets killed.
self.host.executive.check_running_pid = lambda _: True
server.start()
self.assertEqual(server._pid, 42)
self.assertEqual(self.host.filesystem.files[server._pid_file], '42')
# In this case, we'll try to kill the process repeatedly,
# then give up and just try to start a new process anyway.
logs = self.logMessages()
self.assertEqual(len(logs), 43)
self.assertEqual(logs[:2], [
'DEBUG: stale wptserve pid file, pid 7\n',
'DEBUG: pid 7 is running, killing it\n'
])
self.assertTrue(logs[-2].startswith('DEBUG: Starting wptserve server'))
self.assertEqual(logs[-1],
'DEBUG: wptserve successfully started (pid = 42)\n')
def test_stop_running_server_removes_temp_files(self):
server = WPTServe(self.port, '/foo')
server._stop_running_server()
self.assertFalse(self.host.filesystem.exists(server._pid_file))
self.assertFalse(self.host.filesystem.exists(server._config_file))