Пример #1
0
    def test_duplicates(self):
        definition = """
        (foo, 1):
         - i: int

        (foo, 1):
         - i: int
        """
        self.assertRaises(sendlib.ParseError, sendlib.parse, definition)

        definition = """
        (foo, 1):
         - i: int

        (foo, 2):
         - i: int
        """
        # should not raise
        sendlib.parse(definition)

        definition = """
        (foo, 1):
         - a: int
         - b: str
         - a: int
        """
        self.assertRaises(sendlib.ParseError, sendlib.parse, definition)
Пример #2
0
    def test_parse_comments(self):
        definition = """
        (foo, 1): # comment after the message declaration
         - username: str#immediate comment
        # line comment
        """

        sendlib.parse(definition)
Пример #3
0
    def test_field_types(self):
        definition = """
        (foo, 1):
          - i: int
          - in: int or nil
          - s: str
          - sn: str or nil
          - f: float
          - fn: float or nil
          - b: bool
          - bn: bool or nil
          - d: data
          - dn: data or nil
          - n: nil
          - sifbdn: str or int or float or bool or data or nil
        """

        msgs = sendlib.parse(definition)
        msg = msgs[('foo', 1)]

        # spot-check fields
        self.assertEqual(msg.fields[0].types, ('int', ))
        self.assertEqual(msg.fields[3].types, ('str', 'nil'))
        self.assertEqual(msg.fields[-1].types, ('str', 'int', 'float', 'bool', 'data', 'nil'))

        definition = """
        (foo, 1):
         - broken: not_a_type
        """
        self.assertRaises(sendlib.ParseError, sendlib.parse, definition)
Пример #4
0
    def test_many(self):
        definition = """
        (foo, 1):
         - a: many str
         - b: str
        """

        msgs = sendlib.parse(definition)
        foo = msgs[('foo', 1)]

        buf = StringIO()
        writer = foo.writer(buf)
        writer.write('a', ['hello', 'world'])
        writer.write('b', 'goodbye')

        expected = 'MS\x00\x00\x00\x03fooI\x00\x00\x00\x01L\x00\x00\x00\x02S\x00\x00\x00\x05helloS\x00\x00\x00\x05worldS\x00\x00\x00\x07goodbye'
        self.assertEqual(expected, buf.getvalue())


        buf = StringIO()
        writer = foo.writer(buf)
        writer.write('a', [])
        writer.write('b', 'goodbye')

        expected = 'MS\x00\x00\x00\x03fooI\x00\x00\x00\x01L\x00\x00\x00\x00S\x00\x00\x00\x07goodbye'
        self.assertEqual(expected, buf.getvalue())


        buf = StringIO()
        writer = foo.writer(buf)
        self.assertRaises(sendlib.SendlibError, writer.write, 'a', ['hello', 1])
Пример #5
0
    def test_many_nested_message(self):
        definition = """
        (file, 1):
         - filename: str
         - data: data

        (files, 1):
         - files: many msg (file, 1)
        """

        msgs = sendlib.parse(definition)
        files = msgs[('files', 1)]

        buf = StringIO()
        writer = files.writer(buf)

        sub_files = [msgs.get_message('file')] * 2

        for i, filewriter in enumerate(writer.write('files', sub_files)):
            data = StringIO(str(i))
            filename = 'f%d' % i
            filewriter.write('filename', filename)
            filewriter.write('data', data)

        expected = 'MS\x00\x00\x00\x05filesI\x00\x00\x00\x01L\x00\x00\x00\x02'
        expected += 'MS\x00\x00\x00\x04fileI\x00\x00\x00\x01S\x00\x00\x00\x02f0D\x00\x00\x00\x010'
        expected += 'MS\x00\x00\x00\x04fileI\x00\x00\x00\x01S\x00\x00\x00\x02f1D\x00\x00\x00\x011'

        self.assertEqual(expected, buf.getvalue())
Пример #6
0
    def test_nested_message_or_nil(self):
        definition = """
        (foo, 1):
         - a: str
         - b: str

        (bar, 1):
         - m: msg(foo, 1) or nil
        """
        registry = sendlib.parse(definition)

        bar = registry.get_message('bar')
        buf = StringIO()
        writer = bar.writer(buf)
        foowriter = writer.write('m', registry.get_message('foo'))
        foowriter.write('a', 'hello')
        foowriter.write('b', 'world')

        expected = 'MS\x00\x00\x00\x03barI\x00\x00\x00\x01MS\x00\x00\x00\x03fooI\x00\x00\x00\x01S\x00\x00\x00\x05helloS\x00\x00\x00\x05world'
        self.assertEqual(expected, buf.getvalue())


        buf = StringIO()
        writer = bar.writer(buf)
        foowriter = writer.write('m', None)

        expected = 'MS\x00\x00\x00\x03barI\x00\x00\x00\x01N'
        self.assertEqual(expected, buf.getvalue())
Пример #7
0
    def test_data_readline(self):
        msgs = sendlib.parse(self.definition)
        msg = msgs[('msg', 1)]

        din = StringIO('this is some data')
        buf = StringIO()
        writer = msg.writer(buf)
        writer.write('data', din)

        buf.seek(0, 0)
        reader = msg.reader(buf)
        dout = reader.read('data')
        self.assertEqual(dout.readline(), 'this is some data')
        self.assertEqual(dout.readline(), '')

        din = StringIO('this is some data\nthis is another line')
        buf = StringIO()
        writer = msg.writer(buf)
        writer.write('data', din)

        buf.seek(0, 0)
        reader = msg.reader(buf)
        dout = reader.read('data')
        self.assertEqual(dout.readline(), 'this is some data\n')
        self.assertEqual(dout.readline(), 'this is another line')
        self.assertEqual(dout.readline(), '')

        buf.seek(0, 0)
        reader = msg.reader(buf)
        dout = reader.read('data')
        self.assertEqual(dout.readline(18), 'this is some data\n')
        self.assertEqual(dout.readline(18), 'this is another li')
        self.assertEqual(dout.readline(), 'ne')
Пример #8
0
    def test_many(self):
        definition = """
        (foo, 1):
         - a: many str
         - b: str
        """

        msgs = sendlib.parse(definition)
        foo = msgs[('foo', 1)]
Пример #9
0
    def test_registry(self):
        definition = """
        (foo, 1):
         - a: str
        """

        registry = sendlib.parse(definition)
        self.assertTrue(bool(registry[('foo', 1)]))
        self.assertRaises(KeyError, lambda: registry[('FOO', 1)])
Пример #10
0
    def test_nested_message_or_nil(self):
        definition = """
        (foo, 1):
         - a: str
         - b: str

        (bar, 1):
         - m: msg(foo, 1) or nil
        """
        registry = sendlib.parse(definition)
Пример #11
0
    def test_nested_message(self):
        definition = """
        (foo, 1):
         - bar: str
         - baz: str

        (baz, 1):
         - foo: msg (foo, 1)
        """
        registry = sendlib.parse(definition)
Пример #12
0
    def test_fails_on_invalid_prefix(self):
        definition = """
        (foo, 1):
         - a: int
        """
        msgs = sendlib.parse(definition)
        foo = msgs[('foo', 1)]

        serialized = 'MS\x00\x00\x00\x03fooI\x00\x00\x00\x01QI\x00\x00\x00\x01'
        reader = foo.reader(StringIO(serialized))
        self.assertRaises(sendlib.SendlibError, reader.read, 'a')
Пример #13
0
    def test_wrong_type(self):
        definition = """
        (foo, 1):
         - a: str
        """
        msgs = sendlib.parse(definition)
        foo = msgs[('foo', 1)]

        serialized = 'MS\x00\x00\x00\x03fooI\x00\x00\x00\x01I\x00\x00\x00\x01'
        reader = foo.reader(StringIO(serialized))
        self.assertRaises(sendlib.SendlibError, reader.read, 'a')
Пример #14
0
    def test_parse_spaces(self):
        definition = """
        (f o o, 1):
         - ba r: str
        """

        msgs = sendlib.parse(definition)
        self.assertNotEqual(None, msgs.get_message('f o o'))

        foo = msgs.get_message('f o o')
        self.assertEqual('ba r', foo.fields[0].name)
Пример #15
0
    def test_write_past_end(self):
        definition = """
        (foo, 1):
          - bar: str
        """

        msgs = sendlib.parse(definition)
        foo = msgs[('foo', 1)]

        writer = foo.writer(StringIO())
        writer.write('bar', '')
        self.assertRaises(sendlib.SendlibError, writer.write, 'baz', '')
Пример #16
0
    def test_no_fields(self):
        definition = """
        (foo, 1):
        """

        registry = sendlib.parse(definition)
        self.assertEqual(1, len(registry.messages))

        expected = sendlib.Message(registry, 'foo', 1, ())
        actual = registry[('foo', 1)]
        self.assertEqual(expected.name, actual.name)
        self.assertEqual(expected.version, actual.version)
        self.assertEqual(expected.fields, actual.fields)
Пример #17
0
    def test_nil(self):
        description = """
        (foo, 1):
          - bar: nil
        """

        msgs = sendlib.parse(description)
        msg = msgs[('foo', 1)]

        buf = StringIO()
        msg.writer(buf).write('bar', None)

        buf.seek(0, 0)
        self.assertEqual(None, msg.reader(buf).read('bar'))
Пример #18
0
    def test_fields_write_in_order(self):
        definition = """
        (foo, 1):
          - bar: str
          - baz: str
          - qux: str
        """

        msgs = sendlib.parse(definition)
        foo = msgs[('foo', 1)]

        writer = foo.writer(StringIO())
        writer.write('bar', '')
        self.assertRaises(sendlib.SendlibError, writer.write, 'qux', '')
Пример #19
0
    def test_float(self):
        description = """
        (foo, 1):
          - bar: float
        """

        msgs = sendlib.parse(description)
        msg = msgs[('foo', 1)]

        buf = StringIO()
        msg.writer(buf).write('bar', 1.5)

        buf.seek(0, 0)
        self.assertAlmostEqual(1.5, msg.reader(buf).read('bar'))
Пример #20
0
    def test_nested_message_with_or(self):
        definition = """
        (foo, 1):
         - a: str
         - b: str

        (bar, 1):
         - c: int
         - d: int

        (baz, 1):
         - m: msg(foo, 1) or msg(bar, 1)
        """
        registry = sendlib.parse(definition)
Пример #21
0
    def test_invalid_instream(self):
        class NoR(object):
            def seek(self): pass
            def tell(self): pass
        class NoS(object):
            def read(self): pass
            def tell(self): pass
        class NoT(object):
            def read(self): pass
            def seek(self): pass

        msgs = sendlib.parse(self.definition)
        msg = msgs[('msg', 1)]

        writer = msg.writer(StringIO())
        self.assertRaises(sendlib.SendlibError, writer.write, 'data', NoR())
Пример #22
0
    def test_read_wrong_field(self):
        definition = """
        (foo, 1):
          - bar: str
          - baz: str
        """
        msgs = sendlib.parse(definition)
        foo = msgs[('foo', 1)]

        input = 'MS\x00\x00\x00\x03fooI\x00\x00\x00\x01S\x00\x00\x00\x03BARS\x00\x00\x00\x03BAZ'
        reader = foo.reader(StringIO(input))

        self.assertRaises(sendlib.SendlibError, reader.read, 'baz')
        self.assertEqual('BAR', reader.read('bar'))
        self.assertRaises(sendlib.SendlibError, reader.read, 'bar')
        self.assertEqual('BAZ', reader.read('baz'))
Пример #23
0
    def test_skip(self):
        msgs = sendlib.parse(self.definition)
        msg = msgs[('msg', 2)]

        din = StringIO('this is some data')
        buf = StringIO()
        writer = msg.writer(buf)
        writer.write('data', din)
        writer.write('after', 'foo')

        buf.seek(0, 0)
        reader = msg.reader(buf)
        dout = reader.read('data')
        self.assertEqual(17, dout.bytes_remaining())
        dout.skip()
        self.assertEqual(0, dout.bytes_remaining())
        self.assertEqual('foo', reader.read('after'))
Пример #24
0
    def test_write_data(self):
        msgs = sendlib.parse(self.definition)
        msg = msgs[('msg', 1)]

        # about a megabyte of data
        mydata = StringIO()
        for i in xrange(16900):
            mydata.write(string.letters + string.digits + '\n')
        mydata.seek(0, 0)

        buf = StringIO()
        writer = msg.writer(buf)
        writer.write('data', mydata)

        buf.seek(0, 0)
        reader = msg.reader(buf)
        data_fp = reader.read('data')

        read_data = []
        sofar = 0
        while True:
            out = data_fp.read(256 * 1024)
            if out == '':
                break
            sofar += len(out)
            read_data.append(out)

        mydata.seek(0, 0)
        self.assertEqual(len(mydata.getvalue()), len(''.join(read_data)))
        self.assertEqual(mydata.getvalue(), ''.join(read_data))

        msg = msgs[('msg', 2)]
        buf = StringIO()
        writer = msg.writer(buf)
        mydata.seek(0, 0)
        writer.write('data', mydata)
        writer.write('after', 'hello, world')

        buf.seek(0, 0)
        reader = msg.reader(buf)
        data_fp = reader.read('data')
        data_fp.read(1024)

        self.assertRaises(Exception, reader.read, 'after')
        data_fp.skip()
        self.assertEqual('hello, world', reader.read('after'))
Пример #25
0
    def test_many_nil(self):
        definition = """
        (foo, 1):
         - a: many nil
         - b: str
        """

        msgs = sendlib.parse(definition)
        foo = msgs[('foo', 1)]

        buf = StringIO()
        writer = foo.writer(buf)
        writer.write('a', [None, None])
        writer.write('b', 'goodbye')

        expected = 'MS\x00\x00\x00\x03fooI\x00\x00\x00\x01L\x00\x00\x00\x02NNS\x00\x00\x00\x07goodbye'
        self.assertEqual(expected, buf.getvalue())
Пример #26
0
    def test_write_then_read(self):
        definition = """
        (auth, 1):
          - username: str
          - password: str
        """
        msgs = sendlib.parse(definition)

        buf = StringIO()
        auth = msgs[('auth', 1)].writer(buf)
        auth.write('username', 'dcrosta')
        auth.write('password', 'abc123')

        buf.seek(0, 0)
        reader = msgs[('auth', 1)].reader(buf)
        self.assertEqual('dcrosta', reader.read('username'))
        self.assertEqual('abc123', reader.read('password'))
Пример #27
0
    def test_unicode(self):
        description = """
        (foo, 1):
          - bar: str
        """

        msgs = sendlib.parse(description)
        msg = msgs[('foo', 1)]

        buf = StringIO()
        msg.writer(buf).write('bar', u'åéîøü')

        buf.seek(0, 0)
        actual = msg.reader(buf).read('bar')

        self.assertEqual(unicode, type(actual))
        self.assertEqual(u'åéîøü', actual)
Пример #28
0
    def test_write(self):
        definition = """
        (foo, 1):
          - bar: str
          - baz: str or nil
          - qux: str or nil
        """

        msgs = sendlib.parse(definition)
        msg = msgs[('foo', 1)]

        buf = StringIO()
        writer = msg.writer(buf)
        writer.write('bar', 'BAR')
        writer.write('baz', 'BAZ')
        writer.write('qux', 'QUX')

        expected = 'MS\x00\x00\x00\x03fooI\x00\x00\x00\x01S\x00\x00\x00\x03BARS\x00\x00\x00\x03BAZS\x00\x00\x00\x03QUX'
        self.assertEqual(expected, buf.getvalue())

        buf = StringIO()
        writer = msg.writer(buf)
        writer.write('bar', 'BAR')
        writer.write('baz', 'BAZ')
        writer.write('qux', None)

        expected = 'MS\x00\x00\x00\x03fooI\x00\x00\x00\x01S\x00\x00\x00\x03BARS\x00\x00\x00\x03BAZN'
        self.assertEqual(expected, buf.getvalue())

        buf = StringIO()
        writer = msg.writer(buf)
        writer.write('bar', 'BAR')
        writer.write('baz', None)
        writer.write('qux', 'QUX')

        expected = 'MS\x00\x00\x00\x03fooI\x00\x00\x00\x01S\x00\x00\x00\x03BARNS\x00\x00\x00\x03QUX'
        self.assertEqual(expected, buf.getvalue())

        buf = StringIO()
        writer = msg.writer(buf)
        writer.write('bar', 'BAR')
        writer.write('qux', 'QUX')

        expected = 'MS\x00\x00\x00\x03fooI\x00\x00\x00\x01S\x00\x00\x00\x03BARNS\x00\x00\x00\x03QUX'
        self.assertEqual(expected, buf.getvalue())
Пример #29
0
    def test_bool(self):
        description = """
        (foo, 1):
          - bar: bool
        """

        msgs = sendlib.parse(description)
        msg = msgs[('foo', 1)]

        buf = StringIO()
        msg.writer(buf).write('bar', True)

        buf.seek(0, 0)
        self.assertTrue(msg.reader(buf).read('bar'))

        buf = StringIO()
        msg.writer(buf).write('bar', False)

        buf.seek(0, 0)
        self.assertFalse(msg.reader(buf).read('bar'))
Пример #30
0
    def test_nested_message(self):
        definition = """
        (foo, 1):
         - bar: str
         - baz: str

        (baz, 1):
         - foo: msg (foo, 1)
        """
        registry = sendlib.parse(definition)

        baz = registry.get_message('baz')
        buf = StringIO()
        writer = baz.writer(buf)
        foowriter = writer.write('foo')
        foowriter.write('bar', 'hello')
        foowriter.write('baz', 'world')

        expected = 'MS\x00\x00\x00\x03bazI\x00\x00\x00\x01MS\x00\x00\x00\x03fooI\x00\x00\x00\x01S\x00\x00\x00\x05helloS\x00\x00\x00\x05world'
        self.assertEqual(expected, buf.getvalue())