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