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)
def test_parse_comments(self): definition = """ (foo, 1): # comment after the message declaration - username: str#immediate comment # line comment """ sendlib.parse(definition)
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)
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])
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())
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())
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')
def test_many(self): definition = """ (foo, 1): - a: many str - b: str """ msgs = sendlib.parse(definition) foo = msgs[('foo', 1)]
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)])
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)
def test_nested_message(self): definition = """ (foo, 1): - bar: str - baz: str (baz, 1): - foo: msg (foo, 1) """ registry = sendlib.parse(definition)
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')
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')
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)
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', '')
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)
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'))
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', '')
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'))
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)
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())
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'))
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'))
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'))
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())
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'))
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)
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())
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'))
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())