/**
 * Check that strings do the right thing
 */
void MessageDeserializerTest::testString() {
  vector<const FieldDescriptor*> fields;
  fields.push_back(new StringFieldDescriptor("string", 10, 10));
  fields.push_back(new StringFieldDescriptor("string", 0, 32));
  Descriptor descriptor("Test Descriptor", fields);

  // now setup the data
  const uint8_t data[] = "0123456789this is a longer string";

  // try to inflate with too little
  CPPUNIT_ASSERT(!m_deserializer.InflateMessage(
      &descriptor,
      data,
      0));
  CPPUNIT_ASSERT(!m_deserializer.InflateMessage(
      &descriptor,
      data,
      9));

  // try to inflat with too much data
  CPPUNIT_ASSERT(!m_deserializer.InflateMessage(
      &descriptor,
      data,
      43));

  // now to the right amount
  auto_ptr<const Message> message(m_deserializer.InflateMessage(
      &descriptor,
      data,
      sizeof(data)));
  CPPUNIT_ASSERT(message.get());
  CPPUNIT_ASSERT_EQUAL(2u, message->FieldCount());

  const string expected = (
      "string: 0123456789\nstring: this is a longer string\n");
  CPPUNIT_ASSERT_EQUAL(expected, m_printer.AsString(message.get()));

  // now try with different sizes
  auto_ptr<const Message> message2(m_deserializer.InflateMessage(
      &descriptor,
      data,
      19));
  CPPUNIT_ASSERT(message2.get());
  CPPUNIT_ASSERT_EQUAL(2u, message2->FieldCount());

  const string expected2 = (
      "string: 0123456789\nstring: this is a\n");
  CPPUNIT_ASSERT_EQUAL(expected2, m_printer.AsString(message2.get()));
}
/*
 * Test the MessagePrinter
 */
void GenericMessagePrinterTest::testSimplePrinter() {
  // setup some fields
  BoolFieldDescriptor bool_descriptor("On/Off");
  IPV4FieldDescriptor ipv4_descriptor("ip");
  UIDFieldDescriptor uid_descriptor("uid");
  StringFieldDescriptor string_descriptor("Name", 0, 32);
  UInt32FieldDescriptor uint32_descriptor("Id");
  UInt8FieldDescriptor uint8_descriptor("Count", false, -3);
  Int8FieldDescriptor int8_descriptor("Delta", false, 1);
  Int16FieldDescriptor int16_descriptor("Rate", false, -1);

  // try a simple print first
  vector<const ola::messaging::MessageFieldInterface*> fields;
  fields.push_back(new BoolMessageField(&bool_descriptor, false));
  fields.push_back(new IPV4MessageField(&ipv4_descriptor, 0x0100000a));
  fields.push_back(new UIDMessageField(&uid_descriptor, UID(0x7a70, 1)));
  fields.push_back(new StringMessageField(&string_descriptor, "foobar"));
  fields.push_back(new UInt32MessageField(&uint32_descriptor, 42));
  fields.push_back(new UInt8MessageField(&uint8_descriptor, 4));
  fields.push_back(new Int8MessageField(&int8_descriptor, 10));
  fields.push_back(new Int16MessageField(&int16_descriptor, 10));

  Message message(fields);
  string expected = (
      "On/Off: false\nip: 10.0.0.1\nuid: 7a70:00000001\nName: foobar\nId: 42\n"
      "Count: 4 x 10 ^ -3\nDelta: 10 x 10 ^ 1\nRate: 10 x 10 ^ -1\n");
  OLA_ASSERT_EQ(expected, m_printer.AsString(&message));
}
/**
 * Test that simple (no variable sized fields) work big endian style.
 */
void MessageDeserializerTest::testSimpleBigEndian() {
  // build the descriptor
  vector<const FieldDescriptor*> fields;
  // All multi-byte fields default to big endian
  fields.push_back(new BoolFieldDescriptor("bool"));
  fields.push_back(new UInt8FieldDescriptor("uint8"));
  fields.push_back(new Int8FieldDescriptor("int8"));
  fields.push_back(new UInt16FieldDescriptor("uint16"));
  fields.push_back(new Int16FieldDescriptor("int16"));
  fields.push_back(new UInt32FieldDescriptor("uint32"));
  fields.push_back(new Int32FieldDescriptor("int32"));
  Descriptor descriptor("Test Descriptor", fields);

  // now setup the data
  const uint8_t big_endian_data[] = {
    0, 10, -10, 1, 0x2c, 0xfe, 10,
    1, 2, 3, 4, 0xfe, 6, 7, 8};

  // try to inflate with no data
  CPPUNIT_ASSERT(!m_deserializer.InflateMessage(
      &descriptor,
      NULL,
      0));

  // now inflate with too little data
  CPPUNIT_ASSERT(!m_deserializer.InflateMessage(
      &descriptor,
      big_endian_data,
      1));

  // now inflate with too much data
  CPPUNIT_ASSERT(!m_deserializer.InflateMessage(
      &descriptor,
      big_endian_data,
      sizeof(big_endian_data) + 1));

  // now the correct amount & verify
  auto_ptr<const Message> message(m_deserializer.InflateMessage(
      &descriptor,
      big_endian_data,
      sizeof(big_endian_data)));
  CPPUNIT_ASSERT(message.get());
  CPPUNIT_ASSERT_EQUAL(7u, message->FieldCount());

  const string expected = (
      "bool: false\nuint8: 10\nint8: -10\nuint16: 300\nint16: -502\n"
      "uint32: 16909060\nint32: -33159416\n");
  CPPUNIT_ASSERT_EQUAL(expected, m_printer.AsString(message.get()));
}
/**
 * Test that simple (no variable sized fields) work little endian style.
 */
void MessageDeserializerTest::testSimpleLittleEndian() {
  // build the descriptor
  vector<const FieldDescriptor*> fields;
  fields.push_back(new BoolFieldDescriptor("bool"));
  fields.push_back(new UInt8FieldDescriptor("uint8"));
  fields.push_back(new Int8FieldDescriptor("int8"));
  fields.push_back(new UInt16FieldDescriptor("uint16", true));
  fields.push_back(new Int16FieldDescriptor("int16", true));
  fields.push_back(new UInt32FieldDescriptor("uint32", true));
  fields.push_back(new Int32FieldDescriptor("int32", true));
  Descriptor descriptor("Test Descriptor", fields);

  // now setup the data
  const uint8_t little_endian_data[] = {
    1, 10, 246, 0x2c, 1, 10, 0xfe,
    4, 3, 2, 1, 8, 7, 6, 0xfe};

  // try to inflate with no data
  OLA_ASSERT_NULL(m_deserializer.InflateMessage(
      &descriptor,
      NULL,
      0));

  // now inflate with too little data
  OLA_ASSERT_NULL(m_deserializer.InflateMessage(
      &descriptor,
      little_endian_data,
      1));

  // now inflate with too much data
  OLA_ASSERT_NULL(m_deserializer.InflateMessage(
      &descriptor,
      little_endian_data,
      sizeof(little_endian_data) + 1));

  // now the correct amount & verify
  auto_ptr<const Message> message(m_deserializer.InflateMessage(
      &descriptor,
      little_endian_data,
      sizeof(little_endian_data)));
  OLA_ASSERT_NOT_NULL(message.get());
  OLA_ASSERT_EQ(7u, message->FieldCount());

  const string expected = (
      "bool: true\nuint8: 10\nint8: -10\nuint16: 300\nint16: -502\n"
      "uint32: 16909060\nint32: -33159416\n");
  OLA_ASSERT_EQ(expected, m_printer.AsString(message.get()));
}
Example #5
0
/**
 * Check that labels are added
 */
void GenericMessagePrinterTest::testLabeledPrinter() {
  UInt8FieldDescriptor::IntervalVector intervals;
  intervals.push_back(UInt8FieldDescriptor::Interval(0, 2));

  UInt8FieldDescriptor::LabeledValues labels;
  labels["off"] = 0;
  labels["on"] = 1;
  labels["auto"] = 2;

  UInt8FieldDescriptor uint8_descriptor("State", intervals, labels);

  vector<const ola::messaging::MessageFieldInterface*> fields;
  fields.push_back(new UInt8MessageField(&uint8_descriptor, 0));
  fields.push_back(new UInt8MessageField(&uint8_descriptor, 1));
  fields.push_back(new UInt8MessageField(&uint8_descriptor, 2));

  Message message(fields);
  string expected = "State: off\nState: on\nState: auto\n";
  CPPUNIT_ASSERT_EQUAL(expected, m_printer.AsString(&message));
}
/**
 * Test UID inflation.
 */
void MessageDeserializerTest::testUID() {
  // build the descriptor
  vector<const FieldDescriptor*> fields;
  fields.push_back(new UIDFieldDescriptor("Address"));
  Descriptor descriptor("Test Descriptor", fields);

  // now setup the data
  const uint8_t big_endian_data[] = {0x70, 0x7a, 0, 0, 0, 1};

  // now the correct amount & verify
  auto_ptr<const Message> message(m_deserializer.InflateMessage(
      &descriptor,
      big_endian_data,
      sizeof(big_endian_data)));
  CPPUNIT_ASSERT(message.get());
  CPPUNIT_ASSERT_EQUAL(1u, message->FieldCount());

  const string expected = "Address: 707a:00000001\n";
  CPPUNIT_ASSERT_EQUAL(expected, m_printer.AsString(message.get()));
}
Example #7
0
void GenericMessagePrinterTest::testNestedPrinter() {
  // this holds some information on people
  StringFieldDescriptor *string_descriptor = new StringFieldDescriptor(
      "Name", 0, 32);
  BoolFieldDescriptor *bool_descriptor = new BoolFieldDescriptor("Female");
  UInt8FieldDescriptor *uint8_descriptor = new UInt8FieldDescriptor("Age");

  vector<const FieldDescriptor*> person_fields;
  person_fields.push_back(string_descriptor);
  person_fields.push_back(bool_descriptor);
  person_fields.push_back(uint8_descriptor);
  FieldDescriptorGroup group_descriptor("Person", person_fields, 0, 10);

  // setup the first person
  vector<const MessageFieldInterface*> person1;
  person1.push_back(new StringMessageField(string_descriptor, "Lisa"));
  person1.push_back(new BoolMessageField(bool_descriptor, true));
  person1.push_back(new UInt8MessageField(uint8_descriptor, 21));

  // setup the second person
  vector<const MessageFieldInterface*> person2;
  person2.push_back(new StringMessageField(string_descriptor, "Simon"));
  person2.push_back(new BoolMessageField(bool_descriptor, false));
  person2.push_back(new UInt8MessageField(uint8_descriptor, 26));

  vector<const ola::messaging::MessageFieldInterface*> messages;
  messages.push_back(new GroupMessageField(&group_descriptor, person1));
  messages.push_back(new GroupMessageField(&group_descriptor, person2));

  Message message(messages);

  string expected = (
      "Person {\n  Name: Lisa\n  Female: true\n  Age: 21\n}\n"
      "Person {\n  Name: Simon\n  Female: false\n  Age: 26\n}\n");
  CPPUNIT_ASSERT_EQUAL(expected, m_printer.AsString(&message));
}
/*
 * Test MessageSerializer with nested fixed groups.
 */
void MessageDeserializerTest::testWithNestedFixedGroups() {
  vector<const FieldDescriptor*> fields, group_fields, group_fields2;
  group_fields.push_back(new BoolFieldDescriptor("bool"));
  group_fields2.push_back(new UInt8FieldDescriptor("uint8"));
  group_fields2.push_back(new FieldDescriptorGroup("bar", group_fields, 2, 2));
  fields.push_back(new FieldDescriptorGroup("", group_fields2, 0, 4));
  Descriptor descriptor("Test Descriptor", fields);

  // now setup the inputs
  const uint8_t data[] = {0, 0, 0, 1, 0, 1, 2, 1, 0, 3, 1, 1};

  // an empty mesage
  auto_ptr<const Message> message(m_deserializer.InflateMessage(
      &descriptor,
      data,
      0));
  CPPUNIT_ASSERT(message.get());
  CPPUNIT_ASSERT_EQUAL(0u, message->FieldCount());

  // message with not enough data
  CPPUNIT_ASSERT(!m_deserializer.InflateMessage(
      &descriptor,
      data,
      1));
  CPPUNIT_ASSERT(!m_deserializer.InflateMessage(
      &descriptor,
      data,
      2));

  // a single instance of a group
  auto_ptr<const Message> message2(m_deserializer.InflateMessage(
      &descriptor,
      data,
      3));
  CPPUNIT_ASSERT(message2.get());
  CPPUNIT_ASSERT_EQUAL(1u, message2->FieldCount());

  const string expected = (
      " {\n  uint8: 0\n  bar {\n    bool: false\n  }\n  bar {\n"
      "    bool: false\n  }\n}\n");
  CPPUNIT_ASSERT_EQUAL(expected, m_printer.AsString(message2.get()));

  // four instances
  auto_ptr<const Message> message3(m_deserializer.InflateMessage(
      &descriptor,
      data,
      sizeof(data)));
  CPPUNIT_ASSERT(message3.get());
  CPPUNIT_ASSERT_EQUAL(4u, message3->FieldCount());

  const string expected2 = (
      " {\n  uint8: 0\n  bar {\n    bool: false\n  }\n  bar {\n"
      "    bool: false\n  }\n}\n"
      " {\n  uint8: 1\n  bar {\n    bool: false\n  }\n  bar {\n"
      "    bool: true\n  }\n}\n"
      " {\n  uint8: 2\n  bar {\n    bool: true\n  }\n  bar {\n"
      "    bool: false\n  }\n}\n"
      " {\n  uint8: 3\n  bar {\n    bool: true\n  }\n  bar {\n"
      "    bool: true\n  }\n}\n");
  CPPUNIT_ASSERT_EQUAL(expected2, m_printer.AsString(message3.get()));

  // too much data
  CPPUNIT_ASSERT(!m_deserializer.InflateMessage(
      &descriptor,
      data,
      sizeof(data) + 1));
}
/*
 * Check the MessageSerializer works with variable sized groups.
 */
void MessageDeserializerTest::testWithGroups() {
  // build the descriptor
  vector<const FieldDescriptor*> group_fields;
  group_fields.push_back(new BoolFieldDescriptor("bool"));
  group_fields.push_back(new UInt8FieldDescriptor("uint8"));

  vector<const FieldDescriptor*> fields;
  fields.push_back(new FieldDescriptorGroup("group", group_fields, 0, 3));
  Descriptor descriptor("Test Descriptor", fields);

  // now setup the inputs
  const uint8_t data[] = {0, 10, 1, 3, 0, 20, 1, 40};

  // an empty message
  auto_ptr<const Message> message(m_deserializer.InflateMessage(
      &descriptor,
      data,
      0));
  CPPUNIT_ASSERT(message.get());
  CPPUNIT_ASSERT_EQUAL(0u, message->FieldCount());

  // message with not enough data
  CPPUNIT_ASSERT(!m_deserializer.InflateMessage(
      &descriptor,
      data,
      1));

  // a single instance of a group
  auto_ptr<const Message> message2(m_deserializer.InflateMessage(
      &descriptor,
      data,
      2));
  CPPUNIT_ASSERT(message2.get());
  CPPUNIT_ASSERT_EQUAL(1u,
                       message2->FieldCount());

  const string expected = "group {\n  bool: false\n  uint8: 10\n}\n";
  CPPUNIT_ASSERT_EQUAL(expected, m_printer.AsString(message2.get()));

  // another message with not enough data
  CPPUNIT_ASSERT(!m_deserializer.InflateMessage(
      &descriptor,
      data,
      3));

  // two instances of the group
  auto_ptr<const Message> message3(m_deserializer.InflateMessage(
      &descriptor,
      data,
      4));
  CPPUNIT_ASSERT(message3.get());
  CPPUNIT_ASSERT_EQUAL(2u, message3->FieldCount());

  const string expected2 = (
      "group {\n  bool: false\n  uint8: 10\n}\n"
      "group {\n  bool: true\n  uint8: 3\n}\n");
  CPPUNIT_ASSERT_EQUAL(expected2, m_printer.AsString(message3.get()));

  // trhee instances of the group
  auto_ptr<const Message> message4(m_deserializer.InflateMessage(
      &descriptor,
      data,
      6));
  CPPUNIT_ASSERT(message4.get());
  CPPUNIT_ASSERT_EQUAL(3u,
                       message4->FieldCount());

  const string expected3 = (
      "group {\n  bool: false\n  uint8: 10\n}\n"
      "group {\n  bool: true\n  uint8: 3\n}\n"
      "group {\n  bool: false\n  uint8: 20\n}\n");
  CPPUNIT_ASSERT_EQUAL(expected3, m_printer.AsString(message4.get()));

  // message with too much data
  CPPUNIT_ASSERT(!m_deserializer.InflateMessage(
      &descriptor,
      data,
      sizeof(data)));
}