1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <string.h>
6
7#include "chrome/browser/net/probe_message.h"
8#include "chrome/browser/net/probe_message.pb.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
11namespace chrome_browser_net {
12
13class ProbeMessageTest : public ::testing::Test {
14 protected:
15  ProbeMessageTest() {}
16
17  virtual ~ProbeMessageTest() {}
18};
19
20TEST_F(ProbeMessageTest, TestGenerateProbeRequest) {
21  ProbeMessage pm;
22  ProbePacket_Token token;
23  token.set_timestamp_micros(1000000U);
24  token.mutable_hash()->assign("1x1x");
25  uint32 group_id = 1;
26  uint32 probe_size = 500;
27  uint32 pacing_interval_micros = 1000000;
28  uint32 number_probe_packets = 21;
29  ProbePacket probe_packet;
30  pm.GenerateProbeRequest(token,
31                          group_id,
32                          probe_size,
33                          pacing_interval_micros,
34                          number_probe_packets,
35                          &probe_packet);
36
37  EXPECT_EQ(probe_packet.header().type(), ProbePacket_Type_PROBE_REQUEST);
38  EXPECT_EQ(probe_packet.header().version(), ProbeMessage::kVersion);
39  EXPECT_EQ(probe_packet.group_id(), group_id);
40  EXPECT_EQ(probe_packet.probe_size_bytes(), probe_size);
41  EXPECT_EQ(probe_packet.pacing_interval_micros(), pacing_interval_micros);
42  EXPECT_EQ(probe_packet.number_probe_packets(), number_probe_packets);
43  EXPECT_GE(probe_packet.ByteSize(), static_cast<int>(probe_size));
44}
45
46TEST_F(ProbeMessageTest, TestSetPacketHeader) {
47  ProbeMessage pm;
48  ProbePacket probe_packet;
49  pm.SetPacketHeader(ProbePacket_Type_HELLO_REQUEST, &probe_packet);
50  EXPECT_EQ(probe_packet.header().type(), ProbePacket_Type_HELLO_REQUEST);
51  EXPECT_EQ(probe_packet.header().version(), ProbeMessage::kVersion);
52
53  pm.SetPacketHeader(ProbePacket_Type_PROBE_REPLY, &probe_packet);
54  EXPECT_EQ(probe_packet.header().type(), ProbePacket_Type_PROBE_REPLY);
55}
56
57TEST_F(ProbeMessageTest, TestMakeEncodePacketAndParseInput) {
58  ProbeMessage pm;
59  ProbePacket in_packet;
60  uint32 version = 2;
61  ProbePacket_Type type = ProbePacket_Type_HELLO_REPLY;
62  uint32 number_probe_packets = 2;
63  uint32 group_id = 5;
64  in_packet.mutable_header()->set_version(version);
65  in_packet.mutable_header()->set_type(type);
66  in_packet.set_number_probe_packets(number_probe_packets);
67  in_packet.set_group_id(group_id);
68
69  // Encode it to string.
70  std::string output = pm.MakeEncodedPacket(in_packet);
71  // Parse to ProbePacket.
72  ProbePacket out_packet;
73  pm.ParseInput(output, &out_packet);
74
75  EXPECT_EQ(out_packet.header().type(), type);
76  EXPECT_EQ(out_packet.header().version(), version);
77  EXPECT_EQ(out_packet.number_probe_packets(), number_probe_packets);
78  EXPECT_EQ(out_packet.group_id(), group_id);
79}
80
81TEST_F(ProbeMessageTest, TestChecksum) {
82  ProbeMessage pm;
83  std::string str("ABC");
84  uint32 computed_checksum = pm.Checksum(str);
85  uint32 expected_sum = 0;
86  for (unsigned i = 0; i < str.size(); ++i)
87    expected_sum += static_cast<uint8>(str[i]);
88  EXPECT_EQ(computed_checksum, expected_sum);
89}
90
91TEST_F(ProbeMessageTest, TestEncode) {
92  ProbeMessage pm;
93  std::string original("ABC");
94  std::string output = pm.Encode(original);
95  std::string expected_str(original.size(), 0);
96  for (unsigned i = 0; i < original.size(); ++i) {
97    expected_str[i] = original[i] ^ ProbeMessage::kEncodingString[i];
98  }
99  EXPECT_EQ(output, expected_str);
100
101  // Do it again to decode.
102  std::string twice_encoded = pm.Encode(output);
103  EXPECT_EQ(twice_encoded, original);
104}
105
106}  // namespace chrome_browser_net
107