/// @brief Tests for correct reponse to a payload which an invalid data size field. bool MavlinkFtpTest::_bad_datasize_test(void) { mavlink_message_t msg; MavlinkFTP::PayloadHeader payload; mavlink_file_transfer_protocol_t ftp_msg; MavlinkFTP::PayloadHeader *reply; payload.opcode = MavlinkFTP::kCmdListDirectory; _setup_ftp_msg(&payload, 0, nullptr, &msg); // Set the data size to be one larger than is legal ((MavlinkFTP::PayloadHeader*)((mavlink_file_transfer_protocol_t*)msg.payload64)->payload)->size = MAVLINK_MSG_FILE_TRANSFER_PROTOCOL_FIELD_PAYLOAD_LEN + 1; _ftp_server->handle_message(nullptr /* mavlink */, &msg); if (!_decode_message(&_reply_msg, &ftp_msg, &reply)) { return false; } ut_compare("Didn't get Nak back", reply->opcode, MavlinkFTP::kRspNak); ut_compare("Incorrect payload size", reply->size, 1); ut_compare("Incorrect error code", reply->data[0], MavlinkFTP::kErrInvalidDataSize); return true; }
/// @brief Sends the specified FTP message to the server and returns response bool MavlinkFtpTest::_send_receive_msg(MavlinkFTP::PayloadHeader *payload_header, ///< FTP payload header uint8_t size, ///< size in bytes of data const uint8_t *data, ///< Data to start into FTP message payload const MavlinkFTP::PayloadHeader **payload_reply) ///< Payload inside FTP message response { mavlink_message_t msg; _setup_ftp_msg(payload_header, size, data, &msg); _ftp_server->handle_message(&msg); return _decode_message(&_reply_msg, payload_reply); }
/// @brief Sends the specified FTP message to the server and returns response bool MavlinkFtpTest::_send_receive_msg(MavlinkFTP::PayloadHeader *payload_header, ///< FTP payload header uint8_t size, ///< size in bytes of data const uint8_t *data, ///< Data to start into FTP message payload mavlink_file_transfer_protocol_t *ftp_msg_reply, ///< Response from server MavlinkFTP::PayloadHeader **payload_reply) ///< Payload inside FTP message response { mavlink_message_t msg; _setup_ftp_msg(payload_header, size, data, &msg); _ftp_server->handle_message(nullptr /* mavlink */, &msg); return _decode_message(&_reply_msg, ftp_msg_reply, payload_reply); }
/// @brief Tests for correct reponse to a Read command on an open session. bool MavlinkFtpTest::_burst_test() { MavlinkFTP::PayloadHeader payload; const MavlinkFTP::PayloadHeader *reply; BurstInfo burst_info; for (size_t i = 0; i < sizeof(_rgDownloadTestCases) / sizeof(_rgDownloadTestCases[0]); i++) { struct stat st; const DownloadTestCase *test = &_rgDownloadTestCases[i]; // Read in the file so we can compare it to what we get back ut_compare("stat failed", stat(test->file, &st), 0); uint8_t *bytes = new uint8_t[st.st_size]; ut_assert("new failed", bytes != nullptr); int fd = ::open(test->file, O_RDONLY); ut_assert("open failed", fd != -1); int bytes_read = ::read(fd, bytes, st.st_size); ut_compare("read failed", bytes_read, st.st_size); ::close(fd); // Test case data files are created for specific boundary conditions ut_compare("Test case data files are out of date", test->length, st.st_size); payload.opcode = MavlinkFTP::kCmdOpenFileRO; payload.offset = 0; bool success = _send_receive_msg(&payload, // FTP payload header strlen(test->file) + 1, // size in bytes of data (uint8_t *)test->file, // Data to start into FTP message payload &reply); // Payload inside FTP message response if (!success) { return false; } ut_compare("Didn't get Ack back", reply->opcode, MavlinkFTP::kRspAck); // Setup for burst response handler burst_info.burst_state = burst_state_first_ack; burst_info.single_packet_file = test->singlePacketRead; burst_info.file_size = st.st_size; burst_info.file_bytes = bytes; burst_info.ftp_test_class = this; _ftp_server->set_unittest_worker(MavlinkFtpTest::receive_message_handler_burst, &burst_info); // Send the burst command, message response will be handled by _receive_message_handler_stream payload.opcode = MavlinkFTP::kCmdBurstReadFile; payload.session = reply->session; payload.offset = 0; mavlink_message_t msg; _setup_ftp_msg(&payload, 0, nullptr, &msg); _ftp_server->handle_message(&msg); // First packet is sent using stream mechanism, so we need to force it out ourselves hrt_abstime t = 0; _ftp_server->send(t); ut_compare("Incorrect sequence of messages", burst_info.burst_state, burst_state_complete); // Put back generic message handler _ftp_server->set_unittest_worker(MavlinkFtpTest::receive_message_handler_generic, this); // Terminate session payload.opcode = MavlinkFTP::kCmdTerminateSession; payload.session = reply->session; payload.size = 0; success = _send_receive_msg(&payload, // FTP payload header 0, // size in bytes of data nullptr, // Data to start into FTP message payload &reply); // Payload inside FTP message response if (!success) { return false; } ut_compare("Didn't get Ack back", reply->opcode, MavlinkFTP::kRspAck); ut_compare("Incorrect payload size", reply->size, 0); } return true; }