| OLD | NEW |
| 1 # Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import errno | 5 import errno |
| 6 import json | 6 import json |
| 7 import os | 7 import os |
| 8 import shutil | 8 import shutil |
| 9 import signal | 9 import signal |
| 10 import tempfile | 10 import tempfile |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 | 106 |
| 107 self.s = service.Service( | 107 self.s = service.Service( |
| 108 self.state_directory, | 108 self.state_directory, |
| 109 { | 109 { |
| 110 'name': 'foo', | 110 'name': 'foo', |
| 111 'root_directory': '/rootdir', | 111 'root_directory': '/rootdir', |
| 112 'tool': 'bar', | 112 'tool': 'bar', |
| 113 'args': ['one', 'two'], | 113 'args': ['one', 'two'], |
| 114 'stop_time': '86', | 114 'stop_time': '86', |
| 115 }, | 115 }, |
| 116 None, |
| 116 time_fn=self.mock_time, | 117 time_fn=self.mock_time, |
| 117 sleep_fn=self.mock_sleep) | 118 sleep_fn=self.mock_sleep) |
| 118 | 119 |
| 119 self.mock_pipe = mock.patch('os.pipe').start() | 120 self.mock_pipe = mock.patch('os.pipe').start() |
| 120 self.mock_fork = mock.patch('os.fork').start() | 121 self.mock_fork = mock.patch('os.fork').start() |
| 121 self.mock_close = mock.patch('os.close').start() | 122 self.mock_close = mock.patch('os.close').start() |
| 122 self.mock_exit = mock.patch('os._exit').start() | 123 self.mock_exit = mock.patch('os._exit').start() |
| 123 self.mock_fdopen = mock.patch('os.fdopen').start() | 124 self.mock_fdopen = mock.patch('os.fdopen').start() |
| 124 self.mock_waitpid = mock.patch('os.waitpid').start() | 125 self.mock_waitpid = mock.patch('os.waitpid').start() |
| 125 self.mock_execv = mock.patch('os.execv').start() | 126 self.mock_execv = mock.patch('os.execv').start() |
| 126 self.mock_kill = mock.patch('os.kill').start() | 127 self.mock_kill = mock.patch('os.kill').start() |
| 127 self.mock_become_daemon = mock.patch( | 128 self.mock_become_daemon = mock.patch( |
| 128 'infra.libs.service_utils.daemon.become_daemon').start() | 129 'infra.libs.service_utils.daemon.become_daemon').start() |
| 130 self.mock_close_all_fds = mock.patch( |
| 131 'infra.libs.service_utils.daemon.close_all_fds').start() |
| 129 | 132 |
| 130 def test_start_already_running(self): | 133 def test_start_already_running(self): |
| 131 self._write_state('foo', '{"pid": 1234, "starttime": 5678}') | 134 self._write_state('foo', '{"pid": 1234, "starttime": 5678}') |
| 132 self.mock_read_starttime.return_value = 5678 | 135 self.mock_read_starttime.return_value = 5678 |
| 133 | 136 |
| 134 self.s.start() | 137 self.s.start() |
| 135 | 138 |
| 136 self.assertFalse(self.mock_fork.called) | 139 self.assertFalse(self.mock_fork.called) |
| 137 | 140 |
| 138 def test_start_parent(self): | 141 def test_start_parent(self): |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 | 221 |
| 219 # Skip the end of Process.start that assumes it's still the parent process. | 222 # Skip the end of Process.start that assumes it's still the parent process. |
| 220 self.mock_exit.side_effect = SystemExit | 223 self.mock_exit.side_effect = SystemExit |
| 221 with self.assertRaises(SystemExit): | 224 with self.assertRaises(SystemExit): |
| 222 self.s.start() | 225 self.s.start() |
| 223 | 226 |
| 224 self.assertTrue(self.mock_fork.called) | 227 self.assertTrue(self.mock_fork.called) |
| 225 self.assertTrue(self.mock_pipe.called) | 228 self.assertTrue(self.mock_pipe.called) |
| 226 self.assertEqual(mock.call(42), self.mock_close.call_args_list[0]) | 229 self.assertEqual(mock.call(42), self.mock_close.call_args_list[0]) |
| 227 self.mock_fdopen.assert_called_once_with(43, 'w') | 230 self.mock_fdopen.assert_called_once_with(43, 'w') |
| 228 self.mock_become_daemon.assert_called_once_with(keep_fds={43}) | 231 self.mock_become_daemon.assert_called_once_with(keep_fds=True) |
| 232 self.mock_close_all_fds.assert_called_once_with(keep_fds=None) |
| 229 self.assertEqual('{"pid": 555}', self._all_writes(mock_pipe_object)) | 233 self.assertEqual('{"pid": 555}', self._all_writes(mock_pipe_object)) |
| 230 mock_pipe_object.close.assert_called_once_with() | 234 mock_pipe_object.close.assert_called_once_with() |
| 231 self.mock_execv.assert_called_once_with('/rootdir/run.py', [ | 235 self.mock_execv.assert_called_once_with('/rootdir/run.py', [ |
| 232 '/rootdir/run.py', | 236 '/rootdir/run.py', |
| 233 'bar', | 237 'bar', |
| 234 'one', | 238 'one', |
| 235 'two', | 239 'two', |
| 236 ]) | 240 ]) |
| 237 | 241 |
| 238 def test_stop_not_running(self): | 242 def test_stop_not_running(self): |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 | 345 |
| 342 def test_has_args_changed_yes(self): | 346 def test_has_args_changed_yes(self): |
| 343 state = service.ProcessState( | 347 state = service.ProcessState( |
| 344 pid=1234, starttime=5678, version=1, args=['one']) | 348 pid=1234, starttime=5678, version=1, args=['one']) |
| 345 self.assertTrue(self.s.has_args_changed(state)) | 349 self.assertTrue(self.s.has_args_changed(state)) |
| 346 | 350 |
| 347 def test_has_args_changed_not_written(self): | 351 def test_has_args_changed_not_written(self): |
| 348 state = service.ProcessState(pid=1234, starttime=5678, version=1) | 352 state = service.ProcessState(pid=1234, starttime=5678, version=1) |
| 349 self.assertFalse(self.s.has_args_changed(state)) | 353 self.assertFalse(self.s.has_args_changed(state)) |
| 350 | 354 |
| 355 def test_cloudtail_args(self): |
| 356 self.assertIsNone(self.s.cloudtail_args) |
| 357 |
| 358 self.s = service.Service( |
| 359 self.state_directory, |
| 360 { |
| 361 'name': 'foo', |
| 362 'root_directory': '/rootdir', |
| 363 'tool': 'bar', |
| 364 'args': ['one', 'two'], |
| 365 'stop_time': '86', |
| 366 }, |
| 367 '/cloudtail', |
| 368 time_fn=self.mock_time, |
| 369 sleep_fn=self.mock_sleep) |
| 370 |
| 371 self.assertIn('/cloudtail', self.s.cloudtail_args) |
| 372 self.assertIn('foo', self.s.cloudtail_args) |
| 373 |
| 351 | 374 |
| 352 class OwnServiceTest(TestBase): | 375 class OwnServiceTest(TestBase): |
| 353 def setUp(self): | 376 def setUp(self): |
| 354 super(OwnServiceTest, self).setUp() | 377 super(OwnServiceTest, self).setUp() |
| 355 | 378 |
| 356 self.root_directory = tempfile.mkdtemp() | 379 self.root_directory = tempfile.mkdtemp() |
| 357 | 380 |
| 358 self.s = service.OwnService( | 381 self.s = service.OwnService( |
| 359 self.state_directory, | 382 self.state_directory, |
| 360 self.root_directory) | 383 self.root_directory) |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 | 416 |
| 394 state = self.s.get_running_process_state() | 417 state = self.s.get_running_process_state() |
| 395 self.assertEqual(1234, state.pid) | 418 self.assertEqual(1234, state.pid) |
| 396 self.assertEqual(5678, state.starttime) | 419 self.assertEqual(5678, state.starttime) |
| 397 self.assertEqual(42, state.version) | 420 self.assertEqual(42, state.version) |
| 398 self.assertEqual([], state.args) | 421 self.assertEqual([], state.args) |
| 399 | 422 |
| 400 def test_stop(self): | 423 def test_stop(self): |
| 401 with self.assertRaises(NotImplementedError): | 424 with self.assertRaises(NotImplementedError): |
| 402 self.s.stop() | 425 self.s.stop() |
| OLD | NEW |