Skip to content

Commit 8511be8

Browse files
committed
Add the TEST_DATA PID and some responder tests for it
1 parent 064fb4c commit 8511be8

File tree

7 files changed

+96
-0
lines changed

7 files changed

+96
-0
lines changed

common/rdm/DummyResponder.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ const ResponderOps<DummyResponder>::ParamHandler
169169
{ PID_FIRMWARE_URL,
170170
&DummyResponder::GetFirmwareURL,
171171
NULL},
172+
{ PID_TEST_DATA,
173+
&DummyResponder::GetTestData,
174+
&DummyResponder::SetTestData},
172175
{ OLA_MANUFACTURER_PID_CODE_VERSION,
173176
&DummyResponder::GetOlaCodeVersion,
174177
NULL},
@@ -469,6 +472,14 @@ RDMResponse *DummyResponder::GetFirmwareURL(
469472
UINT8_MAX); // TODO(Peter): This field's length isn't limited in the spec
470473
}
471474

475+
RDMResponse *DummyResponder::GetTestData(const RDMRequest *request) {
476+
return ResponderHelper::GetTestData(request);
477+
}
478+
479+
RDMResponse *DummyResponder::SetTestData(const RDMRequest *request) {
480+
return ResponderHelper::SetTestData(request);
481+
}
482+
472483
RDMResponse *DummyResponder::GetOlaCodeVersion(
473484
const RDMRequest *request) {
474485
return ResponderHelper::GetString(request, VERSION);

common/rdm/ResponderHelper.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,6 +1072,44 @@ RDMResponse *ResponderHelper::GetIPV4Address(
10721072
queued_message_count);
10731073
}
10741074

1075+
RDMResponse *ResponderHelper::GetTestData(
1076+
const RDMRequest *request,
1077+
uint8_t queued_message_count) {
1078+
uint16_t pattern_length;
1079+
if (!ExtractUInt16(request, &pattern_length)) {
1080+
return NackWithReason(request, NR_FORMAT_ERROR, queued_message_count);
1081+
}
1082+
1083+
if (pattern_length > MAX_RDM_TEST_DATA_PATTERN_LENGTH) {
1084+
return NackWithReason(request, NR_DATA_OUT_OF_RANGE, queued_message_count);
1085+
}
1086+
1087+
uint8_t pattern_data[pattern_length];
1088+
1089+
for (unsigned int i = 0; i < pattern_length; i++) {
1090+
// Need to return values 0-255, 0... etc
1091+
pattern_data[i] = i % (UINT8_MAX + 1);
1092+
}
1093+
1094+
return GetResponseFromData(
1095+
request,
1096+
reinterpret_cast<uint8_t*>(&pattern_data),
1097+
sizeof(pattern_data),
1098+
RDM_ACK,
1099+
queued_message_count);
1100+
}
1101+
1102+
RDMResponse *ResponderHelper::SetTestData(
1103+
const RDMRequest *request,
1104+
uint8_t queued_message_count) {
1105+
return GetResponseFromData(
1106+
request,
1107+
request->ParamData(),
1108+
request->ParamDataSize(),
1109+
RDM_ACK,
1110+
queued_message_count);
1111+
}
1112+
10751113
RDMResponse *ResponderHelper::GetListTags(
10761114
const RDMRequest *request,
10771115
const TagSet *tag_set,

include/ola/rdm/RDMEnums.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,13 +759,17 @@ static const uint8_t MAX_RDM_DOMAIN_NAME_LENGTH = 231;
759759
static const uint8_t DNS_NAME_SERVER_MAX_INDEX = 2;
760760

761761
// Consts for E1.37-5
762+
static const uint16_t MAX_RDM_TEST_DATA_PATTERN_LENGTH = 4096;
763+
762764
// The shipping lock states
763765
typedef enum {
764766
SHIPPING_LOCK_STATE_UNLOCKED = 0x00,
765767
SHIPPING_LOCK_STATE_LOCKED = 0x01,
766768
SHIPPING_LOCK_STATE_PARTIALLY_LOCKED = 0x02,
767769
} rdm_shipping_lock_state;
768770

771+
static const uint8_t MAX_RDM_SERIAL_NUMBER_LENGTH = 231;
772+
769773
// Excluding the mandatory NULL terminator
770774
static const uint8_t MAX_RDM_SCOPE_STRING_LENGTH = 62;
771775
} // namespace rdm

include/ola/rdm/ResponderHelper.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,14 @@ class ResponderHelper {
218218
uint8_t queued_message_count = 0);
219219

220220
// E1.37-5 Helpers
221+
static RDMResponse *GetTestData(
222+
const RDMRequest *request,
223+
uint8_t queued_message_count = 0);
224+
225+
static RDMResponse *SetTestData(
226+
const RDMRequest *request,
227+
uint8_t queued_message_count = 0);
228+
221229
static RDMResponse *GetListTags(
222230
const RDMRequest *request,
223231
const TagSet *tag_set,

python/ola/RDMConstants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242
RDM_MAX_SERIAL_NUMBER_LENGTH = 231
4343

44+
RDM_MAX_TEST_DATA_PATTERN_LENGTH = 4096
4445

4546
def _ReverseDict(input):
4647
output = {}

tools/rdm/TestDefinitions.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
RDM_MAX_DOMAIN_NAME_LENGTH,
3030
RDM_MAX_HOSTNAME_LENGTH,
3131
RDM_MAX_SERIAL_NUMBER_LENGTH,
32+
RDM_MAX_TEST_DATA_PATTERN_LENGTH,
3233
RDM_MIN_HOSTNAME_LENGTH,
3334
RDM_ZERO_FOOTPRINT_DMX_ADDRESS)
3435
from ola.StringUtils import StringEscape
@@ -8143,6 +8144,38 @@ class SetSerialNumberWithData(TestMixins.UnsupportedSetWithDataMixin,
81438144
PID = 'SERIAL_NUMBER'
81448145

81458146

8147+
class AllSubDevicesGetTestData(TestMixins.AllSubDevicesGetMixin,
8148+
OptionalParameterTestFixture):
8149+
"""Send a get TEST_DATA to ALL_SUB_DEVICES."""
8150+
PID = 'TEST_DATA'
8151+
DATA = [1]
8152+
8153+
8154+
class GetTestDataWithNoData(TestMixins.GetWithNoDataMixin,
8155+
OptionalParameterTestFixture):
8156+
"""GET TEST_DATA with no argument given."""
8157+
PID = 'TEST_DATA'
8158+
8159+
8160+
class GetTestDataWithExtraData(TestMixins.GetWithDataMixin,
8161+
OptionalParameterTestFixture):
8162+
"""GET TEST_DATA with more than 2 bytes of data."""
8163+
PID = 'TEST_DATA'
8164+
DATA = b'foo'
8165+
# TODO(peter): Ensure the first 2 bytes are sane/valid.
8166+
8167+
8168+
class GetOutOfRangeTestData(OptionalParameterTestFixture):
8169+
"""Get TEST_DATA with a pattern length of 4096 + 1."""
8170+
CATEGORY = TestCategory.ERROR_CONDITIONS
8171+
PID = 'TEST_DATA'
8172+
8173+
def Test(self):
8174+
self.AddIfGetSupported(self.NackGetResult(RDMNack.NR_DATA_OUT_OF_RANGE))
8175+
data = struct.pack('!H', (RDM_MAX_TEST_DATA_PATTERN_LENGTH + 1))
8176+
self.SendRawGet(ROOT_DEVICE, self.pid, data)
8177+
8178+
81468179
class AllSubDevicesGetListTags(TestMixins.AllSubDevicesGetMixin,
81478180
OptionalParameterTestFixture):
81488181
"""Send a get LIST_TAGS to ALL_SUB_DEVICES."""

tools/rdm/list_rdm_tests.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ def main():
356356
for pid in pid_store.Pids():
357357
pid_test_base_name = pid.name.lower().title().replace('_', '')
358358

359+
# TODO(Peter): Need to do min and max size as some PIDs are variable length
359360
get_size = 0
360361
if ((pid.RequestSupported(PidStore.RDM_GET)) and
361362
(pid.GetRequest(PidStore.RDM_GET).HasAtoms())):

0 commit comments

Comments
 (0)