Index: chromeos/components/tether/message_wrapper_unittest.cc |
diff --git a/chromeos/components/tether/message_wrapper_unittest.cc b/chromeos/components/tether/message_wrapper_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9e5ea88acf9329d423692da86e9c8dd446614258 |
--- /dev/null |
+++ b/chromeos/components/tether/message_wrapper_unittest.cc |
@@ -0,0 +1,198 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chromeos/components/tether/message_wrapper.h" |
+ |
+#include <sstream> |
+ |
+#include "base/base64url.h" |
+#include "base/logging.h" |
+#include "base/macros.h" |
+#include "chromeos/components/tether/proto/tether.pb.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace chromeos { |
+ |
+namespace tether { |
+ |
+namespace { |
+ |
+DeviceStatus CreateFakeDeviceStatus() { |
+ WifiStatus wifi_status; |
+ wifi_status.set_status_code( |
+ WifiStatus_StatusCode::WifiStatus_StatusCode_CONNECTED); |
+ wifi_status.set_ssid("Google A"); |
+ |
+ DeviceStatus device_status; |
+ device_status.set_battery_percentage(75); |
+ device_status.set_cell_provider("Google Fi"); |
+ device_status.set_connection_strength(4); |
+ device_status.mutable_wifi_status()->CopyFrom(wifi_status); |
+ |
+ return device_status; |
+} |
+ |
+TetherAvailabilityResponse CreateTetherAvailabilityResponse() { |
+ TetherAvailabilityResponse response; |
+ response.set_response_code( |
+ TetherAvailabilityResponse_ResponseCode:: |
+ TetherAvailabilityResponse_ResponseCode_TETHER_AVAILABLE); |
+ response.mutable_device_status()->CopyFrom(CreateFakeDeviceStatus()); |
+ return response; |
+} |
+ |
+void VerifyProtoConversion(const google::protobuf::MessageLite* proto, |
+ const MessageWrapper& wrapper, |
+ const MessageType& expected_message_type) { |
+ std::string raw_message = wrapper.ToRawMessage(); |
+ EXPECT_TRUE(raw_message.length() > 0); |
+ |
+ std::unique_ptr<MessageWrapper> wrapper_from_raw_message = |
+ MessageWrapper::FromRawMessage(raw_message); |
+ EXPECT_TRUE(wrapper_from_raw_message); |
+ EXPECT_EQ(expected_message_type, wrapper_from_raw_message->GetMessageType()); |
+ EXPECT_EQ(proto->SerializeAsString(), |
+ wrapper_from_raw_message->GetProto()->SerializeAsString()); |
+} |
+ |
+} // namespace |
+ |
+class MessageWrapperTest : public testing::Test { |
+ protected: |
+ MessageWrapperTest() {} |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(MessageWrapperTest); |
+}; |
+ |
+TEST_F(MessageWrapperTest, TestToAndFromRawMessage_ConnectTetheringRequest) { |
+ ConnectTetheringRequest request; |
+ |
+ MessageWrapper wrapper(request); |
+ VerifyProtoConversion(&request, wrapper, |
+ MessageType::CONNECT_TETHERING_REQUEST); |
+} |
+ |
+TEST_F(MessageWrapperTest, TestToAndFromRawMessage_ConnectTetheringResponse) { |
+ ConnectTetheringResponse response; |
+ response.set_ssid("Instant Tethering 123456"); |
+ response.set_password("password"); |
+ response.set_response_code(ConnectTetheringResponse_ResponseCode:: |
+ ConnectTetheringResponse_ResponseCode_SUCCESS); |
+ response.mutable_device_status()->CopyFrom(CreateFakeDeviceStatus()); |
+ |
+ MessageWrapper wrapper(response); |
+ VerifyProtoConversion(&response, wrapper, |
+ MessageType::CONNECT_TETHERING_RESPONSE); |
+} |
+ |
+TEST_F(MessageWrapperTest, TestToAndFromRawMessage_DisconnectTetheringRequest) { |
+ DisconnectTetheringRequest request; |
+ |
+ MessageWrapper wrapper(request); |
+ VerifyProtoConversion(&request, wrapper, |
+ MessageType::DISCONNECT_TETHERING_REQUEST); |
+} |
+ |
+TEST_F(MessageWrapperTest, TestToAndFromRawMessage_KeepAliveTickle) { |
+ KeepAliveTickle tickle; |
+ |
+ MessageWrapper wrapper(tickle); |
+ VerifyProtoConversion(&tickle, wrapper, MessageType::KEEP_ALIVE_TICKLE); |
+} |
+ |
+TEST_F(MessageWrapperTest, TestToAndFromRawMessage_TetherAvailabilityRequest) { |
+ TetherAvailabilityRequest request; |
+ |
+ MessageWrapper wrapper(request); |
+ VerifyProtoConversion(&request, wrapper, |
+ MessageType::TETHER_AVAILABILITY_REQUEST); |
+} |
+ |
+TEST_F(MessageWrapperTest, TestToAndFromRawMessage_TetherAvailabilityResponse) { |
+ TetherAvailabilityResponse response = CreateTetherAvailabilityResponse(); |
+ |
+ MessageWrapper wrapper(response); |
+ VerifyProtoConversion(&response, wrapper, |
+ MessageType::TETHER_AVAILABILITY_RESPONSE); |
+} |
+ |
+TEST_F(MessageWrapperTest, TestHandleInvalidJson) { |
+ EXPECT_FALSE(MessageWrapper::FromRawMessage("not JSON")); |
+} |
+ |
+TEST_F(MessageWrapperTest, TestHandleJsonWithoutType) { |
+ ConnectTetheringRequest request; |
+ std::string encoded_message; |
+ base::Base64UrlEncode(request.SerializeAsString(), |
+ base::Base64UrlEncodePolicy::INCLUDE_PADDING, |
+ &encoded_message); |
+ |
+ std::stringstream ss; |
+ ss << "{\"data\": \"" << encoded_message << "\"}"; |
+ |
+ EXPECT_FALSE(MessageWrapper::FromRawMessage(ss.str())); |
+} |
+ |
+TEST_F(MessageWrapperTest, TestHandleJsonWithoutData) { |
+ EXPECT_FALSE(MessageWrapper::FromRawMessage("{\"type\":1}")); |
+} |
+ |
+TEST_F(MessageWrapperTest, TestHandleJsonWithoutTypeOrData) { |
+ EXPECT_FALSE(MessageWrapper::FromRawMessage("{}")); |
+} |
+ |
+TEST_F(MessageWrapperTest, TestHandleDataNotEncodedWithBase64) { |
+ TetherAvailabilityResponse response = CreateTetherAvailabilityResponse(); |
+ |
+ std::stringstream ss; |
+ ss << "{\"type\":" << static_cast<int>(MessageType::CONNECT_TETHERING_REQUEST) |
+ << ",\"data\":\"" |
+ << response.SerializeAsString() // Do not convert to base-64. |
+ << "\"}"; |
+ |
+ EXPECT_FALSE(MessageWrapper::FromRawMessage(ss.str())); |
+} |
+ |
+TEST_F(MessageWrapperTest, TestFromRawMessage_StringLiteral) { |
+ // Type 2 is TETHER_AVAILABILITY_RESPONSE, and the data supplied is |
+ // CreateTetherAvailabilityResponse() encoded in base-64. |
+ std::string raw_message = |
+ "{\"type\":2,\"data\":\"CAESHQhLEglHb29nbGUgRmkYBCIMCAESCEdvb2dsZSBB\"}"; |
+ |
+ std::unique_ptr<MessageWrapper> wrapper = |
+ MessageWrapper::FromRawMessage(raw_message); |
+ EXPECT_TRUE(wrapper); |
+ EXPECT_EQ(MessageType::TETHER_AVAILABILITY_RESPONSE, |
+ wrapper->GetMessageType()); |
+ EXPECT_EQ(CreateTetherAvailabilityResponse().SerializeAsString(), |
+ wrapper->GetProto()->SerializeAsString()); |
+} |
+ |
+TEST_F(MessageWrapperTest, TestFromRawMessage_ExtraJsonKeyValuePair) { |
+ TetherAvailabilityResponse response = CreateTetherAvailabilityResponse(); |
+ std::string response_string_base64; |
+ base::Base64UrlEncode(response.SerializeAsString(), |
+ base::Base64UrlEncodePolicy::INCLUDE_PADDING, |
+ &response_string_base64); |
+ |
+ std::stringstream ss; |
+ ss << "{\"type\":" |
+ << static_cast<int>(MessageType::TETHER_AVAILABILITY_RESPONSE) |
+ << ",\"data\":\"" << response_string_base64 << "\"" |
+ << ",\"extraKey\":\"extraValue\"}"; |
+ |
+ std::unique_ptr<MessageWrapper> wrapper = |
+ MessageWrapper::FromRawMessage(ss.str()); |
+ EXPECT_TRUE(wrapper); |
+ EXPECT_EQ(MessageType::TETHER_AVAILABILITY_RESPONSE, |
+ wrapper->GetMessageType()); |
+ EXPECT_EQ(response.SerializeAsString(), |
+ wrapper->GetProto()->SerializeAsString()); |
+} |
+ |
+} // namespace tether |
+ |
+} // namespace cryptauth |