12fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# Copyright (C) 2011 Google Inc. All rights reserved.
22fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#
32fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# Redistribution and use in source and binary forms, with or without
42fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# modification, are permitted provided that the following conditions are
52fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# met:
62fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#
72fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#    * Redistributions of source code must retain the above copyright
82fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# notice, this list of conditions and the following disclaimer.
92fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#    * Redistributions in binary form must reproduce the above
102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# copyright notice, this list of conditions and the following disclaimer
112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# in the documentation and/or other materials provided with the
122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# distribution.
132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#    * Neither the name of Google Inc. nor the names of its
142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# contributors may be used to endorse or promote products derived from
152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# this software without specific prior written permission.
162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#
172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockimport unittest
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
312fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockfrom webkitpy.layout_tests.port import server_process
322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
342fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass MockFile(object):
352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def __init__(self, server_process):
362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self._server_process = server_process
372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def fileno(self):
392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return 1
402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def write(self, line):
422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self._server_process.broken_pipes.append(self)
432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        raise IOError
442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def close(self):
462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        pass
472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
492fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass MockProc(object):
502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def __init__(self, server_process):
512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.stdin = MockFile(server_process)
522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.stdout = MockFile(server_process)
532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.stderr = MockFile(server_process)
542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.pid = 1
552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def poll(self):
572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return 1
582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
602fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass FakeServerProcess(server_process.ServerProcess):
612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def _start(self):
622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self._proc = MockProc(self)
632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.stdin = self._proc.stdin
642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.broken_pipes = []
652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
672fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass TestServerProcess(unittest.TestCase):
682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def test_broken_pipe(self):
692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        server_process = FakeServerProcess(port_obj=None, name="test", cmd=["test"])
702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        server_process.write("should break")
712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.assertTrue(server_process.crashed)
722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.assertEquals(server_process._proc, None)
732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.assertEquals(server_process.broken_pipes, [server_process.stdin])
742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
762fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockif __name__ == '__main__':
772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unittest.main()
78