| Index: Tools/Scripts/webkitpy/tool/bot/queueengine_unittest.py
|
| diff --git a/Tools/Scripts/webkitpy/tool/bot/queueengine_unittest.py b/Tools/Scripts/webkitpy/tool/bot/queueengine_unittest.py
|
| deleted file mode 100644
|
| index de9fa23982e3c97b43bc932e2afabd1161bdae13..0000000000000000000000000000000000000000
|
| --- a/Tools/Scripts/webkitpy/tool/bot/queueengine_unittest.py
|
| +++ /dev/null
|
| @@ -1,183 +0,0 @@
|
| -# Copyright (c) 2009 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 name of Google Inc. 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.
|
| -
|
| -import datetime
|
| -import os
|
| -import shutil
|
| -import tempfile
|
| -import threading
|
| -import unittest2 as unittest
|
| -
|
| -from webkitpy.common.system.executive import ScriptError
|
| -from webkitpy.common.system.outputcapture import OutputCapture
|
| -from webkitpy.tool.bot.queueengine import QueueEngine, QueueEngineDelegate, TerminateQueue
|
| -
|
| -
|
| -class LoggingDelegate(QueueEngineDelegate):
|
| - def __init__(self, test):
|
| - self._test = test
|
| - self._callbacks = []
|
| - self._run_before = False
|
| - self.stop_message = None
|
| -
|
| - expected_callbacks = [
|
| - 'queue_log_path',
|
| - 'begin_work_queue',
|
| - 'should_continue_work_queue',
|
| - 'next_work_item',
|
| - 'work_item_log_path',
|
| - 'process_work_item',
|
| - 'should_continue_work_queue',
|
| - 'stop_work_queue',
|
| - ]
|
| -
|
| - def record(self, method_name):
|
| - self._callbacks.append(method_name)
|
| -
|
| - def queue_log_path(self):
|
| - self.record("queue_log_path")
|
| - return os.path.join(self._test.temp_dir, "queue_log_path")
|
| -
|
| - def work_item_log_path(self, work_item):
|
| - self.record("work_item_log_path")
|
| - return os.path.join(self._test.temp_dir, "work_log_path", "%s.log" % work_item)
|
| -
|
| - def begin_work_queue(self):
|
| - self.record("begin_work_queue")
|
| -
|
| - def should_continue_work_queue(self):
|
| - self.record("should_continue_work_queue")
|
| - if not self._run_before:
|
| - self._run_before = True
|
| - return True
|
| - return False
|
| -
|
| - def next_work_item(self):
|
| - self.record("next_work_item")
|
| - return "work_item"
|
| -
|
| - def process_work_item(self, work_item):
|
| - self.record("process_work_item")
|
| - self._test.assertEqual(work_item, "work_item")
|
| - return True
|
| -
|
| - def handle_unexpected_error(self, work_item, message):
|
| - self.record("handle_unexpected_error")
|
| - self._test.assertEqual(work_item, "work_item")
|
| -
|
| - def stop_work_queue(self, message):
|
| - self.record("stop_work_queue")
|
| - self.stop_message = message
|
| -
|
| -
|
| -class RaisingDelegate(LoggingDelegate):
|
| - def __init__(self, test, exception):
|
| - LoggingDelegate.__init__(self, test)
|
| - self._exception = exception
|
| -
|
| - def process_work_item(self, work_item):
|
| - self.record("process_work_item")
|
| - raise self._exception
|
| -
|
| -
|
| -class FastQueueEngine(QueueEngine):
|
| - def __init__(self, delegate):
|
| - QueueEngine.__init__(self, "fast-queue", delegate, threading.Event())
|
| -
|
| - # No sleep for the wicked.
|
| - seconds_to_sleep = 0
|
| -
|
| - def _sleep(self, message):
|
| - pass
|
| -
|
| -
|
| -class QueueEngineTest(unittest.TestCase):
|
| - def test_trivial(self):
|
| - delegate = LoggingDelegate(self)
|
| - self._run_engine(delegate)
|
| - self.assertEqual(delegate.stop_message, "Delegate terminated queue.")
|
| - self.assertEqual(delegate._callbacks, LoggingDelegate.expected_callbacks)
|
| - self.assertTrue(os.path.exists(os.path.join(self.temp_dir, "queue_log_path")))
|
| - self.assertTrue(os.path.exists(os.path.join(self.temp_dir, "work_log_path", "work_item.log")))
|
| -
|
| - def test_unexpected_error(self):
|
| - delegate = RaisingDelegate(self, ScriptError(exit_code=3))
|
| - self._run_engine(delegate)
|
| - expected_callbacks = LoggingDelegate.expected_callbacks[:]
|
| - work_item_index = expected_callbacks.index('process_work_item')
|
| - # The unexpected error should be handled right after process_work_item starts
|
| - # but before any other callback. Otherwise callbacks should be normal.
|
| - expected_callbacks.insert(work_item_index + 1, 'handle_unexpected_error')
|
| - self.assertEqual(delegate._callbacks, expected_callbacks)
|
| -
|
| - def test_handled_error(self):
|
| - delegate = RaisingDelegate(self, ScriptError(exit_code=QueueEngine.handled_error_code))
|
| - self._run_engine(delegate)
|
| - self.assertEqual(delegate._callbacks, LoggingDelegate.expected_callbacks)
|
| -
|
| - def _run_engine(self, delegate, engine=None, termination_message=None):
|
| - if not engine:
|
| - engine = QueueEngine("test-queue", delegate, threading.Event())
|
| - if not termination_message:
|
| - termination_message = "Delegate terminated queue."
|
| - expected_logs = "\n%s\n" % termination_message
|
| - OutputCapture().assert_outputs(self, engine.run, expected_logs=expected_logs)
|
| -
|
| - def _test_terminating_queue(self, exception, termination_message):
|
| - work_item_index = LoggingDelegate.expected_callbacks.index('process_work_item')
|
| - # The terminating error should be handled right after process_work_item.
|
| - # There should be no other callbacks after stop_work_queue.
|
| - expected_callbacks = LoggingDelegate.expected_callbacks[:work_item_index + 1]
|
| - expected_callbacks.append("stop_work_queue")
|
| -
|
| - delegate = RaisingDelegate(self, exception)
|
| - self._run_engine(delegate, termination_message=termination_message)
|
| -
|
| - self.assertEqual(delegate._callbacks, expected_callbacks)
|
| - self.assertEqual(delegate.stop_message, termination_message)
|
| -
|
| - def test_terminating_error(self):
|
| - self._test_terminating_queue(KeyboardInterrupt(), "User terminated queue.")
|
| - self._test_terminating_queue(TerminateQueue(), "TerminateQueue exception received.")
|
| -
|
| - def test_now(self):
|
| - """Make sure there are no typos in the QueueEngine.now() method."""
|
| - engine = QueueEngine("test", None, None)
|
| - self.assertIsInstance(engine._now(), datetime.datetime)
|
| -
|
| - def test_sleep_message(self):
|
| - engine = QueueEngine("test", None, None)
|
| - engine._now = lambda: datetime.datetime(2010, 1, 1)
|
| - expected_sleep_message = "MESSAGE Sleeping until 2010-01-01 00:02:00 (120 seconds)."
|
| - self.assertEqual(engine._sleep_message("MESSAGE"), expected_sleep_message)
|
| -
|
| - def setUp(self):
|
| - self.temp_dir = tempfile.mkdtemp(suffix="work_queue_test_logs")
|
| -
|
| - def tearDown(self):
|
| - shutil.rmtree(self.temp_dir)
|
|
|