11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/proximity_auth/wire_message.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace proximity_auth {
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_EmptyMessage) {
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message =
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WireMessage::Deserialize(std::string(), &is_incomplete);
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(is_incomplete);
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(message);
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_IncompleteHeader) {
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message =
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WireMessage::Deserialize("\3", &is_incomplete);
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(is_incomplete);
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(message);
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_UnexpectedMessageFormatVersion) {
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Version 2 is below the minimum supported version.
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message =
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WireMessage::Deserialize("\2\1\1", &is_incomplete);
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(is_incomplete);
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(message);
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_BodyOfSizeZero) {
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message =
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WireMessage::Deserialize(std::string("\3\0\0", 3), &is_incomplete);
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(is_incomplete);
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(message);
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_IncompleteBody) {
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message =
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WireMessage::Deserialize(std::string("\3\0\5", 3), &is_incomplete);
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(is_incomplete);
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(message);
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_BodyLongerThanSpecifiedInHeader) {
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message = WireMessage::Deserialize(
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      std::string("\3\0\5", 3) + "123456", &is_incomplete);
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(is_incomplete);
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(message);
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_BodyIsNotValidJSON) {
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message = WireMessage::Deserialize(
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      std::string("\3\0\5", 3) + "12345", &is_incomplete);
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(is_incomplete);
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(message);
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_BodyIsNotADictionary) {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string header("\3\0\x29", 3);
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string bytes =
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      header + "[{\"permit_id\": \"Hi!\", \"payload\": \"YQ==\"}]";
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message =
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WireMessage::Deserialize(bytes, &is_incomplete);
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(is_incomplete);
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(message);
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The permit ID is optional.
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_BodyLacksPermitId) {
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string header("\3\0\x13", 3);
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string bytes = header + "{\"payload\": \"YQ==\"}";
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message =
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WireMessage::Deserialize(bytes, &is_incomplete);
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(is_incomplete);
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(message);
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(std::string(), message->permit_id());
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("a", message->payload());
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_BodyLacksPayload) {
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string header("\3\0\x14", 3);
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string bytes = header + "{\"permit_id\": \"Hi!\"}";
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message =
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WireMessage::Deserialize(bytes, &is_incomplete);
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(is_incomplete);
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(message);
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The permit ID is optional.
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_BodyHasEmptyPermitId) {
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string header("\3\0\x24", 3);
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string bytes = header + "{\"permit_id\": \"\", \"payload\": \"YQ==\"}";
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message =
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WireMessage::Deserialize(bytes, &is_incomplete);
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(is_incomplete);
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(message);
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(std::string(), message->permit_id());
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("a", message->payload());
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_BodyHasEmptyPayload) {
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string header("\3\0\x23", 3);
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string bytes = header + "{\"permit_id\": \"Hi!\", \"payload\": \"\"}";
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message =
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WireMessage::Deserialize(bytes, &is_incomplete);
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(is_incomplete);
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(message);
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_PayloadIsNotBase64Encoded) {
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string header("\3\0\x2A", 3);
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string bytes =
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      header + "{\"permit_id\": \"Hi!\", \"payload\": \"garbage\"}";
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message =
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WireMessage::Deserialize(bytes, &is_incomplete);
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(is_incomplete);
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(message);
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_ValidMessage) {
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string header("\3\0\x27", 3);
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string bytes =
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      header + "{\"permit_id\": \"Hi!\", \"payload\": \"YQ==\"}";
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message =
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WireMessage::Deserialize(bytes, &is_incomplete);
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(is_incomplete);
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(message);
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("Hi!", message->permit_id());
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("a", message->payload());
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(ProximityAuthWireMessage, Deserialize_ValidMessageWithExtraUnknownFields) {
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_incomplete;
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string header("\3\0\x46", 3);
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string bytes = header +
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      "{"
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      "  \"permit_id\": \"Hi!\","
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      "  \"payload\": \"YQ==\","
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      "  \"unexpected\": \"surprise!\""
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      "}";
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WireMessage> message =
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WireMessage::Deserialize(bytes, &is_incomplete);
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(is_incomplete);
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(message);
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("Hi!", message->permit_id());
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("a", message->payload());
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace proximity_auth
167