def test_process_state_events_with_pid(self): from supervisor.states import ProcessStates from supervisor import events for klass in ( events.ProcessStateRunningEvent, events.ProcessStateStoppedEvent, events.ProcessStateStoppingEvent, ): options = DummyOptions() pconfig1 = DummyPConfig(options, 'process1', 'process1', '/bin/process1') class DummyGroup: config = pconfig1 process1 = DummyProcess(pconfig1) process1.group = DummyGroup process1.pid = 1 event = klass(process1, ProcessStates.STARTING) headers, payload = self._deserialize(str(event)) self.assertEqual(len(headers), 4) self.assertEqual(headers['processname'], 'process1') self.assertEqual(headers['groupname'], 'process1') self.assertEqual(headers['from_state'], 'STARTING') self.assertEqual(headers['pid'], '1') self.assertEqual(payload, '')
def test_process_state_events_with_pid(self): from supervisor.states import ProcessStates from supervisor import events for klass in ( events.ProcessStateRunningEvent, events.ProcessStateStoppedEvent, events.ProcessStateStoppingEvent, ): options = DummyOptions() pconfig1 = DummyPConfig(options, "process1", "process1", "/bin/process1") class DummyGroup: config = pconfig1 process1 = DummyProcess(pconfig1) process1.group = DummyGroup process1.pid = 1 event = klass(process1, ProcessStates.STARTING) headers, payload = self._deserialize(str(event)) self.assertEqual(len(headers), 4) self.assertEqual(headers["processname"], "process1") self.assertEqual(headers["groupname"], "process1") self.assertEqual(headers["from_state"], "STARTING") self.assertEqual(headers["pid"], "1") self.assertEqual(payload, "")
def test_toggle_capturemode_sends_event(self): executable = '/bin/cat' options = DummyOptions() config = DummyPConfig(options, 'process1', '/bin/process1', stdout_logfile='/tmp/foo', stdout_capture_maxbytes=500) process = DummyProcess(config) process.pid = 4000 dispatcher = self._makeOne(process) dispatcher.capturemode = True dispatcher.capturelog.data = ['hallooo'] L = [] def doit(event): L.append(event) from supervisor import events events.subscribe(events.EventTypes.PROCESS_COMMUNICATION, doit) dispatcher.toggle_capturemode() self.assertEqual(len(L), 1) event = L[0] self.assertEqual(event.process, process) self.assertEqual(event.pid, 4000) self.assertEqual(event.data, 'hallooo')
def test_toggle_capturemode_sends_event(self): executable = "/bin/cat" options = DummyOptions() config = DummyPConfig( options, "process1", "/bin/process1", stdout_logfile="/tmp/foo", stdout_capture_maxbytes=500 ) process = DummyProcess(config) process.pid = 4000 dispatcher = self._makeOne(process) dispatcher.capturemode = True dispatcher.capturelog.data = ["hallooo"] L = [] def doit(event): L.append(event) from supervisor import events events.subscribe(events.EventTypes.PROCESS_COMMUNICATION, doit) dispatcher.toggle_capturemode() self.assertEqual(len(L), 1) event = L[0] self.assertEqual(event.process, process) self.assertEqual(event.pid, 4000) self.assertEqual(event.data, "hallooo")
def test_write_fails_silently_if_process_is_killing(self): options = DummyOptions() config = DummyPConfig(options, 'cat', 'bin/cat') process = DummyProcess(config) process.pid = 42 process.killing = True event = DummyEvent() event.process = process response = 'STDIN:foobar' supervisor_twiddler.resulthandler.stdin_write_handler(event, response) self.assertEqual(process.stdin_buffer, '')
def test_write_encodes_unicode_as_utf8(self): options = DummyOptions() config = DummyPConfig(options, 'cat', 'bin/cat') process = DummyProcess(config) process.pid = 42 process.killing = False event = DummyEvent() event.process = process response = _u(_b('STDIN:foobar')) supervisor_twiddler.resulthandler.stdin_write_handler(event, response) self.assertEqual(process.stdin_buffer, 'foobar')
def test_handler_writes_chars_when_response_is_STDIN(self): options = DummyOptions() config = DummyPConfig(options, 'cat', 'bin/cat') process = DummyProcess(config) process.pid = 42 process.killing = False event = DummyEvent() event.process = process response = 'STDIN:foobar' supervisor_twiddler.resulthandler.stdin_write_handler(event, response) self.assertEqual(process.stdin_buffer, 'foobar')
def test_write_fails_silently_if_process_is_killing(self): options = DummyOptions() config = DummyPConfig(options, 'cat', 'bin/cat') process = DummyProcess(config) process.pid = 42 process.killing = True event = DummyEvent() event.process = process response = 'STDIN:foobar' supervisor_twiddler.resulthandler.stdin_write_handler(event, response) self.assertEqual(process.stdin_buffer, '')
def test_write_encodes_unicode_as_utf8(self): options = DummyOptions() config = DummyPConfig(options, 'cat', 'bin/cat') process = DummyProcess(config) process.pid = 42 process.killing = False event = DummyEvent() event.process = process response = _u(_b('STDIN:foobar')) supervisor_twiddler.resulthandler.stdin_write_handler(event, response) self.assertEqual(process.stdin_buffer, 'foobar')
def test_handler_writes_chars_when_response_is_STDIN(self): options = DummyOptions() config = DummyPConfig(options, 'cat', 'bin/cat') process = DummyProcess(config) process.pid = 42 process.killing = False event = DummyEvent() event.process = process response = 'STDIN:foobar' supervisor_twiddler.resulthandler.stdin_write_handler(event, response) self.assertEqual(process.stdin_buffer, 'foobar')
def test_removeProcessFromGroup_raises_still_running_when_process_has_pid(self): pconfig = DummyPConfig(None, 'foo', '/bin/foo') process = DummyProcess(pconfig) process.pid = 42 gconfig = DummyPGroupConfig(None, pconfigs=[pconfig]) pgroup = DummyProcessGroup(gconfig) pgroup.processes = { 'process_with_pid': process } supervisord = DummySupervisor(process_groups = {'group_name': pgroup}) interface = self.makeOne(supervisord) self.assertRPCError(SupervisorFaults.STILL_RUNNING, interface.removeProcessFromGroup, 'group_name', 'process_with_pid')
def test_removeProcessFromGroup_raises_still_running_when_process_has_pid( self): pconfig = DummyPConfig(None, 'foo', '/bin/foo') process = DummyProcess(pconfig) process.pid = 42 gconfig = DummyPGroupConfig(None, pconfigs=[pconfig]) pgroup = DummyProcessGroup(gconfig) pgroup.processes = {'process_with_pid': process} supervisord = DummySupervisor(process_groups={'group_name': pgroup}) interface = self.makeOne(supervisord) self.assertRPCError(SupervisorFaults.STILL_RUNNING, interface.removeProcessFromGroup, 'group_name', 'process_with_pid')
def test_process_state_exited_event_unexpected(self): from supervisor import events from supervisor.states import ProcessStates options = DummyOptions() pconfig1 = DummyPConfig(options, 'process1', 'process1','/bin/process1') process1 = DummyProcess(pconfig1) class DummyGroup: config = pconfig1 process1.group = DummyGroup process1.pid = 1 event = events.ProcessStateExitedEvent(process1, ProcessStates.STARTING, expected=False) headers, payload = self._deserialize(str(event)) self.assertEqual(len(headers), 5) self.assertEqual(headers['processname'], 'process1') self.assertEqual(headers['groupname'], 'process1') self.assertEqual(headers['pid'], '1') self.assertEqual(headers['from_state'], 'STARTING') self.assertEqual(headers['expected'], '0') self.assertEqual(payload, '')
def test_process_state_exited_event_unexpected(self): from supervisor import events from supervisor.states import ProcessStates options = DummyOptions() pconfig1 = DummyPConfig(options, "process1", "process1", "/bin/process1") process1 = DummyProcess(pconfig1) class DummyGroup: config = pconfig1 process1.group = DummyGroup process1.pid = 1 event = events.ProcessStateExitedEvent(process1, ProcessStates.STARTING, expected=False) headers, payload = self._deserialize(str(event)) self.assertEqual(len(headers), 5) self.assertEqual(headers["processname"], "process1") self.assertEqual(headers["groupname"], "process1") self.assertEqual(headers["pid"], "1") self.assertEqual(headers["from_state"], "STARTING") self.assertEqual(headers["expected"], "0") self.assertEqual(payload, "")
def test_toggle_capturemode_sends_event(self): options = DummyOptions() config = DummyPConfig(options, 'process1', '/bin/process1', stdout_logfile=os.path.join(tempfile.gettempdir(), 'foo.txt'), stdout_capture_maxbytes=500) process = DummyProcess(config) process.pid = 4000 dispatcher = self._makeOne(process) dispatcher.capturemode = True dispatcher.capturelog.getvalue = lambda: 'hallooo' L = [] def doit(event): L.append(event) from supervisor import events events.subscribe(events.EventTypes.PROCESS_COMMUNICATION, doit) dispatcher.toggle_capturemode() self.assertEqual(len(L), 1) event = L[0] self.assertEqual(event.process, process) self.assertEqual(event.pid, 4000) self.assertEqual(event.data, 'hallooo')
def test_process_state_events_with_pid(self): from supervisor.states import ProcessStates from supervisor import events for klass in ( events.ProcessStateRunningEvent, events.ProcessStateStoppedEvent, events.ProcessStateStoppingEvent, ): options = DummyOptions() pconfig1 = DummyPConfig(options, 'process1', 'process1', '/bin/process1') class DummyGroup: config = pconfig1 process1 = DummyProcess(pconfig1) process1.group = DummyGroup process1.pid = 1 event = klass(process1, ProcessStates.STARTING) headers, payload = self._deserialize(event.payload()) self.assertEqual(len(headers), 4) self.assertEqual(headers['processname'], 'process1') self.assertEqual(headers['groupname'], 'process1') self.assertEqual(headers['from_state'], 'STARTING') self.assertEqual(headers['pid'], '1') self.assertEqual(payload, '')