|
23 | 23 | #include <string>
|
24 | 24 |
|
25 | 25 | #include "ola/Logging.h"
|
| 26 | +#include "ola/io/ByteString.h" |
| 27 | +#include "ola/io/IOQueue.h" |
26 | 28 | #include "ola/io/IOStack.h"
|
27 | 29 | #include "ola/network/NetworkUtils.h"
|
28 | 30 | #include "ola/testing/TestUtils.h"
|
|
32 | 34 | namespace ola {
|
33 | 35 | namespace acn {
|
34 | 36 |
|
| 37 | +using ola::io::ByteString; |
| 38 | +using ola::io::IOQueue; |
35 | 39 | using ola::io::IOStack;
|
| 40 | +using ola::io::OutputStream; |
| 41 | +using ola::network::HostToNetwork; |
36 | 42 |
|
37 | 43 | class RDMPDUTest: public CppUnit::TestFixture {
|
38 | 44 | CPPUNIT_TEST_SUITE(RDMPDUTest);
|
| 45 | + CPPUNIT_TEST(testSimpleRDMPDU); |
| 46 | + CPPUNIT_TEST(testSimpleRDMPDUToOutputStream); |
39 | 47 | CPPUNIT_TEST(testPrepend);
|
40 | 48 | CPPUNIT_TEST_SUITE_END();
|
41 | 49 |
|
42 | 50 | public:
|
| 51 | + void testSimpleRDMPDU(); |
| 52 | + void testSimpleRDMPDUToOutputStream(); |
43 | 53 | void testPrepend();
|
44 | 54 |
|
45 | 55 | private:
|
46 | 56 | static const unsigned int TEST_VECTOR;
|
| 57 | + static const uint8_t EXPECTED_GET_RESPONSE_BUFFER[]; |
47 | 58 | };
|
48 | 59 |
|
49 | 60 | CPPUNIT_TEST_SUITE_REGISTRATION(RDMPDUTest);
|
50 | 61 |
|
51 | 62 | const unsigned int RDMPDUTest::TEST_VECTOR = 0xcc;
|
52 | 63 |
|
| 64 | +const uint8_t RDMPDUTest::EXPECTED_GET_RESPONSE_BUFFER[] = { |
| 65 | + 1, 28, // sub code & length |
| 66 | + 0, 3, 0, 0, 0, 4, // dst uid |
| 67 | + 0, 1, 0, 0, 0, 2, // src uid |
| 68 | + 0, 0, 0, 0, 10, // transaction, port id, msg count & sub device |
| 69 | + 0x21, 1, 40, 4, // command, param id, param data length |
| 70 | + 0x5a, 0x5a, 0x5a, 0x5a, // param data |
| 71 | + 0x02, 0xb3 // checksum |
| 72 | +}; |
| 73 | + |
| 74 | +/* |
| 75 | + * Test that packing an RDMPDU works. |
| 76 | + */ |
| 77 | +void RDMPDUTest::testSimpleRDMPDU() { |
| 78 | + ByteString empty; |
| 79 | + RDMPDU empty_pdu(empty); |
| 80 | + |
| 81 | + OLA_ASSERT_EQ(0u, empty_pdu.HeaderSize()); |
| 82 | + OLA_ASSERT_EQ(0u, empty_pdu.DataSize()); |
| 83 | + OLA_ASSERT_EQ(4u, empty_pdu.Size()); |
| 84 | + |
| 85 | + ByteString response(EXPECTED_GET_RESPONSE_BUFFER, |
| 86 | + sizeof(EXPECTED_GET_RESPONSE_BUFFER)); |
| 87 | + RDMPDU pdu(response); |
| 88 | + |
| 89 | + OLA_ASSERT_EQ(0u, pdu.HeaderSize()); |
| 90 | + OLA_ASSERT_EQ(29u, pdu.DataSize()); |
| 91 | + OLA_ASSERT_EQ(33u, pdu.Size()); |
| 92 | + |
| 93 | + unsigned int size = pdu.Size(); |
| 94 | + uint8_t *data = new uint8_t[size]; |
| 95 | + unsigned int bytes_used = size; |
| 96 | + OLA_ASSERT(pdu.Pack(data, &bytes_used)); |
| 97 | + OLA_ASSERT_EQ(size, bytes_used); |
| 98 | + |
| 99 | + // spot check the data |
| 100 | + OLA_ASSERT_EQ((uint8_t) 0xf0, data[0]); |
| 101 | + // bytes_used is technically data[1] and data[2] if > 255 |
| 102 | + OLA_ASSERT_EQ((uint8_t) bytes_used, data[2]); |
| 103 | + OLA_ASSERT_EQ(HostToNetwork((uint8_t) TEST_VECTOR), data[3]); |
| 104 | + |
| 105 | + // test undersized buffer |
| 106 | + bytes_used = size - 1; |
| 107 | + OLA_ASSERT_FALSE(pdu.Pack(data, &bytes_used)); |
| 108 | + OLA_ASSERT_EQ(0u, bytes_used); |
| 109 | + |
| 110 | + // test oversized buffer |
| 111 | + bytes_used = size + 1; |
| 112 | + OLA_ASSERT(pdu.Pack(data, &bytes_used)); |
| 113 | + OLA_ASSERT_EQ(size, bytes_used); |
| 114 | + delete[] data; |
| 115 | +} |
| 116 | + |
| 117 | + |
| 118 | +/* |
| 119 | + * Test that writing to an output stream works. |
| 120 | + */ |
| 121 | +void RDMPDUTest::testSimpleRDMPDUToOutputStream() { |
| 122 | + ByteString response(EXPECTED_GET_RESPONSE_BUFFER, |
| 123 | + sizeof(EXPECTED_GET_RESPONSE_BUFFER)); |
| 124 | + RDMPDU pdu(response); |
| 125 | + |
| 126 | + OLA_ASSERT_EQ(0u, pdu.HeaderSize()); |
| 127 | + OLA_ASSERT_EQ(29u, pdu.DataSize()); |
| 128 | + OLA_ASSERT_EQ(33u, pdu.Size()); |
| 129 | + |
| 130 | + IOQueue output; |
| 131 | + OutputStream stream(&output); |
| 132 | + pdu.Write(&stream); |
| 133 | + OLA_ASSERT_EQ(33u, output.Size()); |
| 134 | + |
| 135 | + uint8_t *pdu_data = new uint8_t[output.Size()]; |
| 136 | + unsigned int pdu_size = output.Peek(pdu_data, output.Size()); |
| 137 | + OLA_ASSERT_EQ(output.Size(), pdu_size); |
| 138 | + |
| 139 | + uint8_t EXPECTED[] = { |
| 140 | + 0xf0, 0x00, 0x21, |
| 141 | + 0xcc, |
| 142 | + 1, 28, // sub code & length |
| 143 | + 0, 3, 0, 0, 0, 4, // dst uid |
| 144 | + 0, 1, 0, 0, 0, 2, // src uid |
| 145 | + 0, 0, 0, 0, 10, // transaction, port id, msg count & sub device |
| 146 | + 0x21, 1, 40, 4, // command, param id, param data length |
| 147 | + 0x5a, 0x5a, 0x5a, 0x5a, // param data |
| 148 | + 0x02, 0xb3 // checksum |
| 149 | + }; |
| 150 | + OLA_ASSERT_DATA_EQUALS(EXPECTED, sizeof(EXPECTED), pdu_data, pdu_size); |
| 151 | + output.Pop(output.Size()); |
| 152 | + delete[] pdu_data; |
| 153 | +} |
| 154 | + |
| 155 | + |
53 | 156 | void RDMPDUTest::testPrepend() {
|
54 | 157 | IOStack stack;
|
55 | 158 | RDMPDU::PrependPDU(&stack);
|
|
0 commit comments