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