/*
 * Check that sending RDM commands work.
 * This all defer the running of the RDMCallback.
 */
void QueueingRDMControllerTest::testDelayedSendAndReceive() {
  MockRDMController mock_controller;
  ola::rdm::QueueingRDMController controller(&mock_controller, 10);

  // Some mock frame data.
  RDMFrame frame(MOCK_FRAME_DATA, arraysize(MOCK_FRAME_DATA));
  RDMFrames frames;
  frames.push_back(frame);

  // test a simple request/response
  RDMRequest *get_request = NewGetRequest(m_source, m_destination);
  mock_controller.ExpectCallAndCapture(get_request);

  RDMReply *expected_reply = new RDMReply(
      ola::rdm::RDM_COMPLETED_OK,
      NewGetResponse(m_destination, m_source),
      frames);

  controller.SendRDMRequest(
      get_request,
      ola::NewSingleCallback(
          this,
          &QueueingRDMControllerTest::VerifyResponse,
          expected_reply));

  // now run the callback
  mock_controller.RunRDMCallback(expected_reply);
  mock_controller.Verify();
}
/*
 * Check that sending RDM commands work.
 * This runs the RDMCallback immediately.
 */
void QueueingRDMControllerTest::testSendAndReceive() {
  MockRDMController mock_controller;
  ola::rdm::QueueingRDMController controller(&mock_controller, 10);

  // Some mock frame data.
  RDMFrame frame(MOCK_FRAME_DATA, arraysize(MOCK_FRAME_DATA));
  RDMFrames frames;
  frames.push_back(frame);

  // test a simple request/response
  RDMRequest *get_request = NewGetRequest(m_source, m_destination);
  RDMReply *expected_reply = new RDMReply(
      ola::rdm::RDM_COMPLETED_OK,
      NewGetResponse(m_destination, m_source),
      frames);
  mock_controller.ExpectCallAndReplyWith(get_request, expected_reply);

  controller.SendRDMRequest(
      get_request,
      ola::NewSingleCallback(
          this,
          &QueueingRDMControllerTest::VerifyResponse,
          expected_reply));

  // check a response where we return ok, but pass a null pointer
  get_request = NewGetRequest(m_source, m_destination);
  expected_reply = new RDMReply(ola::rdm::RDM_COMPLETED_OK,
                                NULL,
                                frames);
  mock_controller.ExpectCallAndReplyWith(get_request, expected_reply);

  controller.SendRDMRequest(
      get_request,
      ola::NewSingleCallback(
          this,
          &QueueingRDMControllerTest::VerifyResponse,
          expected_reply));

  // check a failed command
  get_request = NewGetRequest(m_source, m_destination);
  expected_reply = new RDMReply(ola::rdm::RDM_FAILED_TO_SEND);
  mock_controller.ExpectCallAndReplyWith(get_request, expected_reply);

  controller.SendRDMRequest(
      get_request,
      ola::NewSingleCallback(
          this,
          &QueueingRDMControllerTest::VerifyResponse,
          expected_reply));

  mock_controller.Verify();
}
Exemple #3
0
RDMReply* RDMReply::FromFrame(const RDMFrame &frame,
                              const RDMRequest *request) {
  RDMFrames frames;
  frames.push_back(frame);

  ola::rdm::RDMStatusCode status_code = RDM_INVALID_RESPONSE;
  RDMResponse *response = NULL;
  if (frame.data.size() > 1) {
    // Skip over the start code.
    response = ola::rdm::RDMResponse::InflateFromData(
        frame.data.data() + 1, frame.data.size() - 1, &status_code,
        request);
  }
  return new RDMReply(status_code, response, frames);
}
void RDMReplyTest::testReplyWithFrames() {
  const uint8_t response_data[] = {
    0xcc, 1, 28,  // start code, sub code & length
    0, 3, 0, 0, 0, 4,   // dst uid
    0, 1, 0, 0, 0, 2,   // src uid
    0, 1, 0, 0, 10,  // transaction, port id, msg count & sub device
    0x21, 1, 40, 4,  // command, param id, param data length
    0x5a, 0x5a, 0x5a, 0x5a,  // param data
    0, 0  // checksum, anoything is fine.
  };

  RDMFrame frame(response_data, arraysize(response_data));
  frame.timing.response_time = 10000;
  frame.timing.mark_time = 32000;
  frame.timing.break_time = 8000;
  frame.timing.data_time = 45000;

  RDMFrames frames;
  frames.push_back(frame);

  RDMResponse *response = new RDMGetResponse(m_source,
                                             m_destination,
                                             0,  // transaction #
                                             0,  // response type
                                             0,  // message count
                                             10,  // sub device
                                             100,  // param id
                                             NULL,  // data
                                             0);

  RDMReply reply(ola::rdm::RDM_COMPLETED_OK, response, frames);

  OLA_ASSERT_EQ(ola::rdm::RDM_COMPLETED_OK, reply.StatusCode());
  OLA_ASSERT_EQ(static_cast<const RDMResponse*>(response), reply.Response());
  OLA_ASSERT_EQ(response, reply.MutableResponse());
  OLA_ASSERT_EQ(static_cast<size_t>(1), reply.Frames().size());
  OLA_ASSERT_TRUE(frame == reply.Frames()[0]);
}
/*
 * Check that we got an unknown UID code
 */
void DmxterWidgetTest::ValidateStatus(
    ola::rdm::RDMStatusCode expected_code,
    RDMFrames expected_frames,
    RDMReply *reply) {
  OLA_ASSERT_EQ(expected_code, reply->StatusCode());
  OLA_ASSERT_NULL(reply->Response());

  const RDMFrames &frames = reply->Frames();
  OLA_ASSERT_EQ(expected_frames.size(), frames.size());
  for (unsigned int i = 0; i < frames.size(); i++) {
    OLA_ASSERT_DATA_EQUALS(expected_frames[i].data.data(),
                           expected_frames[i].data.size(),
                           frames[i].data.data(),
                           frames[i].data.size());
    OLA_ASSERT_TRUE(expected_frames[i] == frames[i]);
  }
  m_ss.Terminate();
}
Exemple #6
0
RDMReply* RDMReply::DUBReply(const RDMFrame &frame) {
  RDMFrames frames;
  frames.push_back(frame);
  return new RDMReply(ola::rdm::RDM_DUB_RESPONSE, NULL, frames);
}
/**
 * Check that we send RDM discovery messages correctly.
 */
void DmxterWidgetTest::testSendRDMDUB() {
  uint8_t RDM_DUB_LABEL = 0x83;
  const UID source(0x4744, 0x12345678);
  const UID destination = UID::AllDevices();

  static const uint8_t REQUEST_DATA[] = {
    0x7a, 0x70, 0, 0, 0, 0,
    0x7a, 0x70, 0xff, 0xff, 0xff, 0xff
  };

  // request
  RDMRequest *rdm_request = new ola::rdm::RDMDiscoveryRequest(
      source,
      destination,
      0,  // transaction #
      1,  // port id
      0,  // sub device
      ola::rdm::PID_DISC_UNIQUE_BRANCH,  // param id
      REQUEST_DATA,
      sizeof(REQUEST_DATA));

  unsigned int request_size = RDMCommandSerializer::RequiredSize(*rdm_request);
  uint8_t *expected_request_frame = new uint8_t[request_size + 1];
  expected_request_frame[0] = 0xcc;
  OLA_ASSERT(RDMCommandSerializer::Pack(*rdm_request,
                                        expected_request_frame + 1,
                                        &request_size));

  // a 4 byte response means a timeout
  static const uint8_t TIMEOUT_RESPONSE[] = {0, 17};

  // add the expected response, send and verify
  m_endpoint->AddExpectedUsbProDataAndReturn(
      RDM_DUB_LABEL,
      expected_request_frame,
      request_size + 1,
      RDM_DUB_LABEL,
      TIMEOUT_RESPONSE,
      sizeof(TIMEOUT_RESPONSE));

  RDMFrames frames;
  m_widget->SendRDMRequest(
      rdm_request,
      ola::NewSingleCallback(this,
                             &DmxterWidgetTest::ValidateStatus,
                             ola::rdm::RDM_TIMEOUT,
                             frames));
  m_ss.Run();
  m_endpoint->Verify();

  delete[] expected_request_frame;

  // now try a dub response that returns something
  rdm_request = new ola::rdm::RDMDiscoveryRequest(
      source,
      destination,
      1,  // transaction #
      1,  // port id
      0,  // sub device
      ola::rdm::PID_DISC_UNIQUE_BRANCH,  // param id
      REQUEST_DATA,
      sizeof(REQUEST_DATA));

  request_size = RDMCommandSerializer::RequiredSize(*rdm_request);
  expected_request_frame = new uint8_t[request_size + 1];
  expected_request_frame[0] = 0xcc;
  OLA_ASSERT(RDMCommandSerializer::Pack(*rdm_request,
                                        expected_request_frame + 1,
                                        &request_size));

  // something that looks like a DUB response
  static const uint8_t FAKE_RESPONSE[] = {0x00, 19, 0xfe, 0xfe, 0xaa, 0xaa};

  // add the expected response, send and verify
  m_endpoint->AddExpectedUsbProDataAndReturn(
      RDM_DUB_LABEL,
      expected_request_frame,
      request_size + 1,
      RDM_DUB_LABEL,
      FAKE_RESPONSE,
      sizeof(FAKE_RESPONSE));

  frames.push_back(RDMFrame(&FAKE_RESPONSE[2], arraysize(FAKE_RESPONSE) - 2));
  m_widget->SendRDMRequest(
      rdm_request,
      ola::NewSingleCallback(this,
                             &DmxterWidgetTest::ValidateStatus,
                             ola::rdm::RDM_DUB_RESPONSE,
                             frames));
  m_ss.Run();
  m_endpoint->Verify();

  delete[] expected_request_frame;
}