summaryrefslogtreecommitdiff
path: root/src/components/protocol_handler/test/protocol_payload_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/protocol_handler/test/protocol_payload_test.cc')
-rw-r--r--src/components/protocol_handler/test/protocol_payload_test.cc270
1 files changed, 270 insertions, 0 deletions
diff --git a/src/components/protocol_handler/test/protocol_payload_test.cc b/src/components/protocol_handler/test/protocol_payload_test.cc
new file mode 100644
index 000000000..3b973e106
--- /dev/null
+++ b/src/components/protocol_handler/test/protocol_payload_test.cc
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <gtest/gtest.h>
+#include <vector>
+
+#include "utils/macro.h"
+#include "utils/bitstream.h"
+#include "protocol_handler/protocol_payload.h"
+#include "protocol/common.h"
+
+namespace test {
+namespace components {
+namespace protocol_handler_test {
+using namespace ::protocol_handler;
+using ::utils::BitStream;
+
+void prepare_data(uint8_t* data_for_sending, ProtocolPayloadV2& message) {
+ uint8_t rpc_type_flag = message.header.rpc_type;
+ uint8_t offset = 0;
+
+ uint32_t function_id = message.header.rpc_function_id;
+ data_for_sending[offset++] = ((rpc_type_flag << 4) & 0xF0) | (function_id >> 24);
+ data_for_sending[offset++] = function_id >> 16;
+ data_for_sending[offset++] = function_id >> 8;
+ data_for_sending[offset++] = function_id;
+
+ uint32_t correlationId = message.header.correlation_id;
+ data_for_sending[offset++] = correlationId >> 24;
+ data_for_sending[offset++] = correlationId >> 16;
+ data_for_sending[offset++] = correlationId >> 8;
+ data_for_sending[offset++] = correlationId;
+
+ uint32_t jsonSize = message.header.json_size;
+ data_for_sending[offset++] = jsonSize >> 24;
+ data_for_sending[offset++] = jsonSize >> 16;
+ data_for_sending[offset++] = jsonSize >> 8;
+ data_for_sending[offset++] = jsonSize;
+
+ if (message.json.length() != 0) {
+ memcpy(data_for_sending + offset, message.json.c_str(),
+ message.json.size());
+ }
+
+ if (message.data.size() != 0) {
+ uint8_t* current_pointer = data_for_sending + offset + message.json.length();
+ u_int32_t binarySize = message.data.size();
+ for (uint32_t i = 0; i < binarySize; ++i) {
+ current_pointer[i] = message.data[i];
+ }
+ }
+}
+
+TEST(ProtocolPayloadTest, ExtractProtocolWithOnlyHeader) {
+ ProtocolPayloadV2 prot_payload_test;
+
+ prot_payload_test.header.correlation_id = 1;
+ prot_payload_test.header.rpc_function_id = 2;
+ prot_payload_test.header.json_size = 0;
+ prot_payload_test.header.rpc_type = kRpcTypeRequest;
+
+ const size_t data_for_sending_size = PROTOCOL_HEADER_V2_SIZE;
+ uint8_t* data_for_sending = new uint8_t[data_for_sending_size];
+
+ prepare_data(data_for_sending, prot_payload_test);
+
+ BitStream bs(data_for_sending, data_for_sending_size);
+
+ ProtocolPayloadV2 prot_payload;
+ Extract(&bs, &prot_payload, data_for_sending_size);
+
+ EXPECT_TRUE(bs.IsGood());
+
+ EXPECT_EQ(prot_payload_test.header.correlation_id,
+ prot_payload.header.correlation_id);
+ EXPECT_EQ(prot_payload_test.header.json_size, prot_payload.header.json_size);
+ EXPECT_EQ(prot_payload_test.header.rpc_function_id,
+ prot_payload.header.rpc_function_id);
+ EXPECT_EQ(prot_payload_test.header.rpc_type, prot_payload.header.rpc_type);
+ delete[] data_for_sending;
+}
+
+TEST(ProtocolPayloadTest, ExtractCorrectProtocolWithDataWithoutJSON) {
+ ProtocolPayloadV2 prot_payload_test;
+
+ prot_payload_test.header.correlation_id = 1;
+ prot_payload_test.header.rpc_function_id = 2;
+ prot_payload_test.header.json_size = 0;
+ prot_payload_test.header.rpc_type = kRpcTypeNotification;
+ prot_payload_test.data = {1, 2, 3};
+
+ const size_t data_for_sending_size = PROTOCOL_HEADER_V2_SIZE +
+ prot_payload_test.data.size() +
+ prot_payload_test.json.length();
+ uint8_t* data_for_sending = new uint8_t[data_for_sending_size];
+
+ prepare_data(data_for_sending, prot_payload_test);
+
+ BitStream bs(data_for_sending, data_for_sending_size);
+
+ ProtocolPayloadV2 prot_payload;
+ Extract(&bs, &prot_payload, data_for_sending_size);
+
+ EXPECT_TRUE(bs.IsGood());
+
+ EXPECT_EQ(prot_payload_test.header.correlation_id,
+ prot_payload.header.correlation_id);
+ EXPECT_EQ(prot_payload_test.header.json_size, prot_payload.header.json_size);
+ EXPECT_EQ(prot_payload_test.header.rpc_function_id,
+ prot_payload.header.rpc_function_id);
+ EXPECT_EQ(prot_payload_test.header.rpc_type, prot_payload.header.rpc_type);
+ EXPECT_EQ(prot_payload_test.data.size(), prot_payload.data.size());
+ EXPECT_EQ(prot_payload_test.data[0], prot_payload.data[0]);
+ EXPECT_EQ(prot_payload_test.data[1], prot_payload.data[1]);
+ EXPECT_EQ(prot_payload_test.data[2], prot_payload.data[2]);
+
+ delete[] data_for_sending;
+}
+
+TEST(ProtocolPayloadTest, ExtractCorrectProtocolWithoutDataWithJSON) {
+ ProtocolPayloadV2 prot_payload_test;
+
+ prot_payload_test.header.correlation_id = 1;
+ prot_payload_test.header.rpc_function_id = 2;
+
+ prot_payload_test.header.rpc_type = kRpcTypeResponse;
+
+ std::string expect_output_json_string =
+ "{\n \" : {\n \"name\" : \"\",\n\"parameters\" : \"\"\n}\n}\n";
+
+ prot_payload_test.json = expect_output_json_string;
+ prot_payload_test.header.json_size = prot_payload_test.json.length();
+
+ const size_t data_for_sending_size = PROTOCOL_HEADER_V2_SIZE +
+ prot_payload_test.data.size() +
+ prot_payload_test.json.length();
+ uint8_t *data_for_sending = new uint8_t[data_for_sending_size];
+ prepare_data(data_for_sending, prot_payload_test);
+
+ BitStream bs(data_for_sending, data_for_sending_size);
+ ProtocolPayloadV2 prot_payload;
+ Extract(&bs, &prot_payload, data_for_sending_size);
+
+ EXPECT_TRUE(bs.IsGood());
+
+ EXPECT_EQ(prot_payload_test.header.correlation_id,
+ prot_payload.header.correlation_id);
+ EXPECT_EQ(prot_payload_test.header.json_size, prot_payload.header.json_size);
+ EXPECT_EQ(prot_payload_test.header.rpc_function_id,
+ prot_payload.header.rpc_function_id);
+ EXPECT_EQ(prot_payload_test.header.rpc_type, prot_payload.header.rpc_type);
+ EXPECT_EQ(prot_payload_test.json.length(), prot_payload.json.length());
+ EXPECT_EQ(prot_payload_test.json, prot_payload.json);
+ delete[] data_for_sending;
+}
+
+TEST(ProtocolPayloadTest, ExtractCorrectProtocolWithDataWithJSON) {
+ ProtocolPayloadV2 prot_payload_test;
+
+ prot_payload_test.header.correlation_id = 1;
+ prot_payload_test.header.rpc_function_id = 2;
+ prot_payload_test.header.rpc_type = kRpcTypeRequest;
+ prot_payload_test.data = {1, 2, 3};
+
+ std::string expect_output_json_string =
+ "{\n \" : {\n \"name\" : \"\",\n\"parameters\" : \"\"\n}\n}\n";
+
+ prot_payload_test.json = expect_output_json_string;
+ prot_payload_test.header.json_size = prot_payload_test.json.length();
+
+ const size_t data_for_sending_size = PROTOCOL_HEADER_V2_SIZE +
+ prot_payload_test.data.size() +
+ prot_payload_test.json.length();
+ uint8_t* data_for_sending = new uint8_t[data_for_sending_size];
+ prepare_data(data_for_sending, prot_payload_test);
+
+ BitStream bs(data_for_sending, data_for_sending_size);
+ ProtocolPayloadV2 prot_payload;
+ Extract(&bs, &prot_payload, data_for_sending_size);
+
+ EXPECT_TRUE(bs.IsGood());
+
+ EXPECT_EQ(prot_payload_test.header.correlation_id,
+ prot_payload.header.correlation_id);
+ EXPECT_EQ(prot_payload_test.header.json_size, prot_payload.header.json_size);
+ EXPECT_EQ(prot_payload_test.header.rpc_function_id,
+ prot_payload.header.rpc_function_id);
+ EXPECT_EQ(prot_payload_test.header.rpc_type, prot_payload.header.rpc_type);
+ EXPECT_EQ(prot_payload_test.json.length(), prot_payload.json.length());
+ EXPECT_EQ(prot_payload_test.json, prot_payload.json);
+ EXPECT_EQ(prot_payload_test.data.size(), prot_payload.data.size());
+ EXPECT_EQ(prot_payload_test.data[0], prot_payload.data[0]);
+ EXPECT_EQ(prot_payload_test.data[1], prot_payload.data[1]);
+ EXPECT_EQ(prot_payload_test.data[2], prot_payload.data[2]);
+
+ delete[] data_for_sending;
+}
+
+TEST(ProtocolPayloadTest, ExtractProtocolWithJSONWithDataWithWrongPayloadSize) {
+ ProtocolPayloadV2 prot_payload_test;
+
+ prot_payload_test.header.correlation_id = 1;
+ prot_payload_test.header.rpc_function_id = 2;
+
+ prot_payload_test.header.rpc_type = kRpcTypeResponse;
+ prot_payload_test.data = {1, 2, 3};
+
+ std::string expect_output_json_string =
+ "{\n \" : {\n \"name\" : \"\",\n\"parameters\" : \"\"\n}\n}\n";
+
+ prot_payload_test.json = expect_output_json_string;
+ prot_payload_test.header.json_size = prot_payload_test.json.length();
+
+ const size_t data_for_sending_size =
+ PROTOCOL_HEADER_V2_SIZE + prot_payload_test.json.length();
+ uint8_t* data_for_sending = new uint8_t[data_for_sending_size];
+ prepare_data(data_for_sending, prot_payload_test);
+
+ BitStream bs(data_for_sending, data_for_sending_size);
+ ProtocolPayloadV2 prot_payload;
+
+ // Try extract with payload size less than size of data
+ Extract(&bs, &prot_payload, PROTOCOL_HEADER_V2_SIZE);
+
+ EXPECT_TRUE(bs.IsBad());
+
+ EXPECT_EQ(prot_payload_test.header.correlation_id,
+ prot_payload.header.correlation_id);
+ EXPECT_EQ(prot_payload_test.header.json_size, prot_payload.header.json_size);
+ EXPECT_EQ(prot_payload_test.header.rpc_function_id,
+ prot_payload.header.rpc_function_id);
+ EXPECT_EQ(prot_payload_test.header.rpc_type, prot_payload.header.rpc_type);
+ EXPECT_EQ(prot_payload_test.json.length(), prot_payload.json.length());
+ EXPECT_EQ(prot_payload_test.json, prot_payload.json);
+ EXPECT_EQ(0u, prot_payload.data.size());
+ delete[] data_for_sending;
+}
+
+} // namespace protocol_handler_test
+} // namespace components
+} // namespace test