Просмотр исходного кода

reenable send-unicode-to-process-stdin test (fix code as side effect)

Chris McDonough 11 лет назад
Родитель
Сommit
4edf8c999d

+ 2 - 1
supervisor/process.py

@@ -8,6 +8,7 @@ import signal
 from supervisor.compat import maxint
 from supervisor.compat import StringIO
 from supervisor.compat import total_ordering
+from supervisor.compat import as_bytes
 
 from supervisor.medusa import asyncore_25 as asyncore
 
@@ -818,7 +819,7 @@ class EventListenerPool(ProcessGroupBase):
                     serial = event.serial
                     envelope = self._eventEnvelope(event_type, serial,
                                                    pool_serial, payload)
-                    process.write(envelope)
+                    process.write(as_bytes(envelope))
                 except OSError as why:
                     if why.args[0] != errno.EPIPE:
                         raise

+ 4 - 4
supervisor/rpcinterface.py

@@ -5,6 +5,7 @@ import errno
 import types
 
 from supervisor.compat import as_string
+from supervisor.compat import as_bytes
 from supervisor.compat import unicode
 from supervisor.compat import basestring
 
@@ -752,12 +753,11 @@ class SupervisorNamespaceRPCInterface:
         """
         self._update('sendProcessStdin')
 
-        if isinstance(chars, unicode):
-            chars = chars.encode('utf-8')
-
-        if not isinstance(chars, basestring):
+        if not isinstance(chars, (str, bytes, unicode)):
             raise RPCError(Faults.INCORRECT_PARAMETERS, chars)
 
+        chars = as_bytes(chars)
+
         group, process = self._getGroupAndProcess(name)
 
         if process is None:

+ 6 - 5
supervisor/tests/base.py

@@ -4,6 +4,7 @@ _TIMEFORMAT = '%b %d %I:%M %p'
 from supervisor.compat import total_ordering
 from supervisor.compat import Fault
 from supervisor.compat import as_string
+from supervisor.compat import as_bytes
 
 # mock is imported here for py2/3 compat.  we only declare mock as a dependency
 # via tests_require so it is not available on all supervisor installs.  the
@@ -404,11 +405,11 @@ class DummyProcess(object):
         self.error_at_clear = False
         self.killed_with = None
         self.drained = False
-        self.stdout_buffer = ''
-        self.stderr_buffer = ''
-        self.stdout_logged = ''
-        self.stderr_logged = ''
-        self.stdin_buffer = ''
+        self.stdout_buffer = as_bytes('')
+        self.stderr_buffer = as_bytes('')
+        self.stdout_logged = as_bytes('')
+        self.stderr_logged = as_bytes('')
+        self.stdin_buffer = as_bytes('')
         self.pipes = {}
         self.rpipes = {}
         self.dispatchers = {}

+ 5 - 5
supervisor/tests/test_process.py

@@ -1751,7 +1751,7 @@ class EventListenerPoolTests(ProcessGroupBaseTests):
         pool.transition()
         self.assertEqual(process1.transitioned, True)
         self.assertEqual(pool.event_buffer, [event])
-        self.assertEqual(process1.stdin_buffer, '')
+        self.assertEqual(process1.stdin_buffer, b'')
         self.assertEqual(process1.listener_state, EventListenerStates.READY)
 
     def test_transition_event_proc_running(self):
@@ -1772,8 +1772,8 @@ class EventListenerPoolTests(ProcessGroupBaseTests):
         pool.transition()
         self.assertEqual(process1.transitioned, True)
         self.assertEqual(pool.event_buffer, [])
-        header, payload = process1.stdin_buffer.split('\n', 1)
-        self.assertEqual(payload, 'dummy event', payload)
+        header, payload = process1.stdin_buffer.split(b'\n', 1)
+        self.assertEqual(payload, b'dummy event', payload)
         self.assertEqual(process1.listener_state, EventListenerStates.BUSY)
         self.assertEqual(process1.event, event)
 
@@ -1818,8 +1818,8 @@ class EventListenerPoolTests(ProcessGroupBaseTests):
         pool.transition()
         self.assertEqual(process1.transitioned, True)
         self.assertEqual(pool.event_buffer, [])
-        header, payload = process1.stdin_buffer.split('\n', 1)
-        self.assertEqual(payload, 'dummy event', payload)
+        header, payload = process1.stdin_buffer.split(b'\n', 1)
+        self.assertEqual(payload, b'dummy event', payload)
         self.assertEqual(process1.listener_state, EventListenerStates.BUSY)
         self.assertEqual(process1.event, event)
 

+ 12 - 10
supervisor/tests/test_rpcinterfaces.py

@@ -15,6 +15,8 @@ from supervisor.tests.base import PopulatedDummySupervisor
 from supervisor.tests.base import _NOW
 from supervisor.tests.base import _TIMEFORMAT
 
+from supervisor.compat import as_string
+
 class TestBase(unittest.TestCase):
     def setUp(self):
         pass
@@ -1613,21 +1615,21 @@ class SupervisorNamespaceXMLRPCInterfaceTests(TestBase):
         supervisord = PopulatedDummySupervisor(options, 'process1', pconfig1)
         supervisord.set_procattr('process1', 'pid', 42)
         interface   = self._makeOne(supervisord)
-        chars = 'chars for stdin'
+        chars = b'chars for stdin'
         self.assertTrue(interface.sendProcessStdin('process1', chars))
         self.assertEqual('sendProcessStdin', interface.update_text)
         process1 = supervisord.process_groups['process1'].processes['process1']
         self.assertEqual(process1.stdin_buffer, chars)
 
-#    def test_sendProcessStdin_unicode_encoded_to_utf8(self):
-#        options = DummyOptions()
-#        pconfig1 = DummyPConfig(options, 'process1', 'foo')
-#        supervisord = PopulatedDummySupervisor(options, 'process1', pconfig1)
-#        supervisord.set_procattr('process1', 'pid', 42)
-#        interface   = self._makeOne(supervisord)
-#        interface.sendProcessStdin('process1', u'fi\xed')
-#        process1 = supervisord.process_groups['process1'].processes['process1']
-#        self.assertEqual(process1.stdin_buffer, 'fi\xc3\xad')
+    def test_sendProcessStdin_unicode_encoded_to_utf8(self):
+        options = DummyOptions()
+        pconfig1 = DummyPConfig(options, 'process1', 'foo')
+        supervisord = PopulatedDummySupervisor(options, 'process1', pconfig1)
+        supervisord.set_procattr('process1', 'pid', 42)
+        interface   = self._makeOne(supervisord)
+        interface.sendProcessStdin('process1', as_string(b'fi\xc3\xad'))
+        process1 = supervisord.process_groups['process1'].processes['process1']
+        self.assertEqual(process1.stdin_buffer, b'fi\xc3\xad')
 
     def test_sendRemoteCommEvent_notifies_subscribers(self):
         options = DummyOptions()