summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/tools/blinkpy/web_tests/port/browser_test_driver.py
blob: 4cdaa786864dca3c134e0e0ccd171eb849858f9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# Copyright (C) 2014 Google Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#     * Neither the Google name nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

from blinkpy.web_tests.port.driver import Driver


class BrowserTestDriver(Driver):
    """Object for running print preview test(s) using browser_tests."""

    def __init__(self, port, worker_number, no_timeout=False):
        """Invokes the constructor of Driver."""
        super(BrowserTestDriver, self).__init__(port, worker_number, no_timeout)

    def start(self, per_test_args, deadline):
        """Same as Driver.start() however, it has an extra step. It waits for
        a path to a file to be used for stdin to be printed by the browser test.
        If a path is found by the deadline test test will open the file and
        assign it to the stdin of the process that is owned by this driver's
        server process.
        """
        # FIXME(ivandavid): Need to handle case where the web test doesn't
        # get a file name.
        new_cmd_line = self.cmd_line(per_test_args)
        if not self._server_process or new_cmd_line != self._current_cmd_line:
            self._start(per_test_args)
            self._run_post_start_tasks()
            self._open_stdin_path(deadline)

    # Gets the path of the directory that the file for stdin communication is
    # in. Since the browser test cannot clean it up, the web test framework
    # will. Everything the browser test uses is stored in the same directory as
    # the stdin file, so deleting that directory recursively will remove all the
    # other temp data, like the printed pdf. This function assumes the correct
    # file path is sent. It won't delete files with only one component to avoid
    # accidentally deleting files like /tmp.
    def _open_stdin_path(self, deadline, test=False):
        # FIXME(ivandavid): Come up with a way to test & see what happens when
        # the file can't be opened.
        path, found = self._read_stdin_path(deadline)
        if found:
            if test == False:
                self._server_process._proc.stdin = open(path, 'wb', 0)

    def _read_stdin_path(self, deadline):
        # return (stdin_path, bool)
        block = self._read_block(deadline)
        if block.stdin_path:
            return (block.stdin_path, True)
        return (None, False)

    def cmd_line(self, per_test_args):
        """Command line arguments to run the browser test."""
        cmd = self._command_wrapper(self._port.get_option('wrapper'))
        cmd.append(self._port._path_to_driver())
        cmd.append('--gtest_filter=PrintPreviewPdfGeneratedBrowserTest.MANUAL_LayoutTestDriver')
        cmd.append('--run-manual')
        cmd.append('--single_process')
        cmd.extend(per_test_args)
        cmd.extend(self._port.get_option('additional_driver_flag', []))
        return cmd

    def stop(self):
        if self._server_process:
            self._server_process.write('QUIT')
        super(BrowserTestDriver, self).stop(self._port.driver_stop_timeout())