Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Side by Side Diff: infra/services/service_manager/test/service_test.py

Issue 1365583002: Have service_manager start a cloudtail attached to each service it starts. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Just use the default project ID Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698