1558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// found in the LICENSE file. 4558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 5558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include <string.h> 6558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/net/probe_message.h" 8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/net/probe_message.pb.h" 9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 11558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace chrome_browser_net { 12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass ProbeMessageTest : public ::testing::Test { 14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch protected: 15558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ProbeMessageTest() {} 16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual ~ProbeMessageTest() {} 18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}; 19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 20558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(ProbeMessageTest, TestGenerateProbeRequest) { 21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ProbeMessage pm; 22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ProbePacket_Token token; 23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch token.set_timestamp_micros(1000000U); 24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch token.mutable_hash()->assign("1x1x"); 25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch uint32 group_id = 1; 26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch uint32 probe_size = 500; 27558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch uint32 pacing_interval_micros = 1000000; 28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch uint32 number_probe_packets = 21; 29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ProbePacket probe_packet; 30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch pm.GenerateProbeRequest(token, 31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch group_id, 32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch probe_size, 33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch pacing_interval_micros, 34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch number_probe_packets, 35558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch &probe_packet); 36558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(probe_packet.header().type(), ProbePacket_Type_PROBE_REQUEST); 38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(probe_packet.header().version(), ProbeMessage::kVersion); 39558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(probe_packet.group_id(), group_id); 40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(probe_packet.probe_size_bytes(), probe_size); 41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(probe_packet.pacing_interval_micros(), pacing_interval_micros); 42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(probe_packet.number_probe_packets(), number_probe_packets); 43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_GE(probe_packet.ByteSize(), static_cast<int>(probe_size)); 44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 46558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(ProbeMessageTest, TestSetPacketHeader) { 47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ProbeMessage pm; 48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ProbePacket probe_packet; 49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch pm.SetPacketHeader(ProbePacket_Type_HELLO_REQUEST, &probe_packet); 50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(probe_packet.header().type(), ProbePacket_Type_HELLO_REQUEST); 51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(probe_packet.header().version(), ProbeMessage::kVersion); 52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch pm.SetPacketHeader(ProbePacket_Type_PROBE_REPLY, &probe_packet); 54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(probe_packet.header().type(), ProbePacket_Type_PROBE_REPLY); 55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 57558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(ProbeMessageTest, TestMakeEncodePacketAndParseInput) { 58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ProbeMessage pm; 59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ProbePacket in_packet; 60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch uint32 version = 2; 61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ProbePacket_Type type = ProbePacket_Type_HELLO_REPLY; 62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch uint32 number_probe_packets = 2; 63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch uint32 group_id = 5; 64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch in_packet.mutable_header()->set_version(version); 65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch in_packet.mutable_header()->set_type(type); 66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch in_packet.set_number_probe_packets(number_probe_packets); 67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch in_packet.set_group_id(group_id); 68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Encode it to string. 70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch std::string output = pm.MakeEncodedPacket(in_packet); 71558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Parse to ProbePacket. 72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ProbePacket out_packet; 73558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch pm.ParseInput(output, &out_packet); 74558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(out_packet.header().type(), type); 76558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(out_packet.header().version(), version); 77558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(out_packet.number_probe_packets(), number_probe_packets); 78558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(out_packet.group_id(), group_id); 79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 81558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(ProbeMessageTest, TestChecksum) { 82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ProbeMessage pm; 83558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch std::string str("ABC"); 84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch uint32 computed_checksum = pm.Checksum(str); 85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch uint32 expected_sum = 0; 86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch for (unsigned i = 0; i < str.size(); ++i) 87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_sum += static_cast<uint8>(str[i]); 88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(computed_checksum, expected_sum); 89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 91558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(ProbeMessageTest, TestEncode) { 92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ProbeMessage pm; 93558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch std::string original("ABC"); 94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch std::string output = pm.Encode(original); 95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch std::string expected_str(original.size(), 0); 96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch for (unsigned i = 0; i < original.size(); ++i) { 97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch expected_str[i] = original[i] ^ ProbeMessage::kEncodingString[i]; 98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(output, expected_str); 100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Do it again to decode. 102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch std::string twice_encoded = pm.Encode(output); 103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(twice_encoded, original); 104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} // namespace chrome_browser_net 107