tests/test-wireproto-serverreactor.py
changeset 40126 327d40b94bed
parent 40025 b099e6032f38
child 40129 293835e0fff7
equal deleted inserted replaced
40125:e2fe1074024c 40126:327d40b94bed
     6     cbor,
     6     cbor,
     7 )
     7 )
     8 from mercurial import (
     8 from mercurial import (
     9     util,
     9     util,
    10     wireprotoframing as framing,
    10     wireprotoframing as framing,
       
    11 )
       
    12 from mercurial.utils import (
       
    13     cborutil,
    11 )
    14 )
    12 
    15 
    13 ffs = framing.makeframefromhumanstring
    16 ffs = framing.makeframefromhumanstring
    14 
    17 
    15 OK = cbor.dumps({b'status': b'ok'})
    18 OK = cbor.dumps({b'status': b'ok'})
   191         """Command data frame when not running a command is an error."""
   194         """Command data frame when not running a command is an error."""
   192         result = self._sendsingleframe(makereactor(),
   195         result = self._sendsingleframe(makereactor(),
   193             ffs(b'1 1 stream-begin command-data 0 ignored'))
   196             ffs(b'1 1 stream-begin command-data 0 ignored'))
   194         self.assertaction(result, b'error')
   197         self.assertaction(result, b'error')
   195         self.assertEqual(result[1], {
   198         self.assertEqual(result[1], {
   196             b'message': b'expected command request frame; got 2',
   199             b'message': b'expected sender protocol settings or command request '
       
   200                         b'frame; got 2',
   197         })
   201         })
   198 
   202 
   199     def testunexpectedcommanddatareceiving(self):
   203     def testunexpectedcommanddatareceiving(self):
   200         """Same as above except the command is receiving."""
   204         """Same as above except the command is receiving."""
   201         results = list(sendframes(makereactor(), [
   205         results = list(sendframes(makereactor(), [
   492         list(res[1][b'framegen'])
   496         list(res[1][b'framegen'])
   493 
   497 
   494         results = list(sendcommandframes(reactor, instream, 1, b'command1', {}))
   498         results = list(sendcommandframes(reactor, instream, 1, b'command1', {}))
   495         self.assertaction(results[0], b'runcommand')
   499         self.assertaction(results[0], b'runcommand')
   496 
   500 
       
   501     def testprotocolsettingsnoflags(self):
       
   502         result = self._sendsingleframe(
       
   503             makereactor(),
       
   504             ffs(b'0 1 stream-begin sender-protocol-settings 0 '))
       
   505         self.assertaction(result, b'error')
       
   506         self.assertEqual(result[1], {
       
   507             b'message': b'sender protocol settings frame must have '
       
   508                         b'continuation or end of stream flag set',
       
   509         })
       
   510 
       
   511     def testprotocolsettingsconflictflags(self):
       
   512         result = self._sendsingleframe(
       
   513             makereactor(),
       
   514             ffs(b'0 1 stream-begin sender-protocol-settings continuation|eos '))
       
   515         self.assertaction(result, b'error')
       
   516         self.assertEqual(result[1], {
       
   517             b'message': b'sender protocol settings frame cannot have both '
       
   518                         b'continuation and end of stream flags set',
       
   519         })
       
   520 
       
   521     def testprotocolsettingsemptypayload(self):
       
   522         result = self._sendsingleframe(
       
   523             makereactor(),
       
   524             ffs(b'0 1 stream-begin sender-protocol-settings eos '))
       
   525         self.assertaction(result, b'error')
       
   526         self.assertEqual(result[1], {
       
   527             b'message': b'sender protocol settings frame did not contain CBOR '
       
   528                         b'data',
       
   529         })
       
   530 
       
   531     def testprotocolsettingsmultipleobjects(self):
       
   532         result = self._sendsingleframe(
       
   533             makereactor(),
       
   534             ffs(b'0 1 stream-begin sender-protocol-settings eos '
       
   535                 b'\x46foobar\x43foo'))
       
   536         self.assertaction(result, b'error')
       
   537         self.assertEqual(result[1], {
       
   538             b'message': b'sender protocol settings frame contained multiple '
       
   539                         b'CBOR values',
       
   540         })
       
   541 
       
   542     def testprotocolsettingscontentencodings(self):
       
   543         reactor = makereactor()
       
   544 
       
   545         result = self._sendsingleframe(
       
   546             reactor,
       
   547             ffs(b'0 1 stream-begin sender-protocol-settings eos '
       
   548                 b'cbor:{b"contentencodings": [b"a", b"b"]}'))
       
   549         self.assertaction(result, b'wantframe')
       
   550 
       
   551         self.assertEqual(reactor._state, b'idle')
       
   552         self.assertEqual(reactor._sendersettings[b'contentencodings'],
       
   553                          [b'a', b'b'])
       
   554 
       
   555     def testprotocolsettingsmultipleframes(self):
       
   556         reactor = makereactor()
       
   557 
       
   558         data = b''.join(cborutil.streamencode({
       
   559             b'contentencodings': [b'value1', b'value2'],
       
   560         }))
       
   561 
       
   562         results = list(sendframes(reactor, [
       
   563             ffs(b'0 1 stream-begin sender-protocol-settings continuation %s' %
       
   564                 data[0:5]),
       
   565             ffs(b'0 1 0 sender-protocol-settings eos %s' % data[5:]),
       
   566         ]))
       
   567 
       
   568         self.assertEqual(len(results), 2)
       
   569 
       
   570         self.assertaction(results[0], b'wantframe')
       
   571         self.assertaction(results[1], b'wantframe')
       
   572 
       
   573         self.assertEqual(reactor._state, b'idle')
       
   574         self.assertEqual(reactor._sendersettings[b'contentencodings'],
       
   575                          [b'value1', b'value2'])
       
   576 
       
   577     def testprotocolsettingsbadcbor(self):
       
   578         result = self._sendsingleframe(
       
   579             makereactor(),
       
   580             ffs(b'0 1 stream-begin sender-protocol-settings eos badvalue'))
       
   581         self.assertaction(result, b'error')
       
   582 
       
   583     def testprotocolsettingsnoninitial(self):
       
   584         # Cannot have protocol settings frames as non-initial frames.
       
   585         reactor = makereactor()
       
   586 
       
   587         stream = framing.stream(1)
       
   588         results = list(sendcommandframes(reactor, stream, 1, b'mycommand', {}))
       
   589         self.assertEqual(len(results), 1)
       
   590         self.assertaction(results[0], b'runcommand')
       
   591 
       
   592         result = self._sendsingleframe(
       
   593             reactor,
       
   594             ffs(b'0 1 0 sender-protocol-settings eos '))
       
   595         self.assertaction(result, b'error')
       
   596         self.assertEqual(result[1], {
       
   597             b'message': b'expected command request frame; got 8',
       
   598         })
       
   599 
   497 if __name__ == '__main__':
   600 if __name__ == '__main__':
   498     import silenttestrunner
   601     import silenttestrunner
   499     silenttestrunner.main(__name__)
   602     silenttestrunner.main(__name__)