| // Copyright 2013 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| |
| #include <stdint.h> |
| #include <string.h> |
| |
| #include "chrome/browser/net/probe_message.h" |
| #include "chrome/browser/net/probe_message.pb.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace chrome_browser_net { |
| |
| class ProbeMessageTest : public ::testing::Test { |
| protected: |
| ProbeMessageTest() = default; |
| |
| ~ProbeMessageTest() override = default; |
| }; |
| |
| TEST_F(ProbeMessageTest, TestGenerateProbeRequest) { |
| ProbeMessage pm; |
| ProbePacket_Token token; |
| token.set_timestamp_micros(1000000U); |
| token.mutable_hash()->assign("1x1x"); |
| uint32_t group_id = 1; |
| uint32_t probe_size = 500; |
| uint32_t pacing_interval_micros = 1000000; |
| uint32_t number_probe_packets = 21; |
| ProbePacket probe_packet; |
| pm.GenerateProbeRequest(token, |
| group_id, |
| probe_size, |
| pacing_interval_micros, |
| number_probe_packets, |
| &probe_packet); |
| |
| EXPECT_EQ(probe_packet.header().type(), ProbePacket_Type_PROBE_REQUEST); |
| EXPECT_EQ(probe_packet.header().version(), ProbeMessage::kVersion); |
| EXPECT_EQ(probe_packet.group_id(), group_id); |
| EXPECT_EQ(probe_packet.probe_size_bytes(), probe_size); |
| EXPECT_EQ(probe_packet.pacing_interval_micros(), pacing_interval_micros); |
| EXPECT_EQ(probe_packet.number_probe_packets(), number_probe_packets); |
| EXPECT_GE(probe_packet.ByteSizeLong(), probe_size); |
| } |
| |
| TEST_F(ProbeMessageTest, TestSetPacketHeader) { |
| ProbeMessage pm; |
| ProbePacket probe_packet; |
| pm.SetPacketHeader(ProbePacket_Type_HELLO_REQUEST, &probe_packet); |
| EXPECT_EQ(probe_packet.header().type(), ProbePacket_Type_HELLO_REQUEST); |
| EXPECT_EQ(probe_packet.header().version(), ProbeMessage::kVersion); |
| |
| pm.SetPacketHeader(ProbePacket_Type_PROBE_REPLY, &probe_packet); |
| EXPECT_EQ(probe_packet.header().type(), ProbePacket_Type_PROBE_REPLY); |
| } |
| |
| TEST_F(ProbeMessageTest, TestMakeEncodePacketAndParseInput) { |
| ProbeMessage pm; |
| ProbePacket in_packet; |
| uint32_t version = 2; |
| ProbePacket_Type type = ProbePacket_Type_HELLO_REPLY; |
| uint32_t number_probe_packets = 2; |
| uint32_t group_id = 5; |
| in_packet.mutable_header()->set_version(version); |
| in_packet.mutable_header()->set_type(type); |
| in_packet.set_number_probe_packets(number_probe_packets); |
| in_packet.set_group_id(group_id); |
| |
| // Encode it to string. |
| std::string output = pm.MakeEncodedPacket(in_packet); |
| // Parse to ProbePacket. |
| ProbePacket out_packet; |
| pm.ParseInput(output, &out_packet); |
| |
| EXPECT_EQ(out_packet.header().type(), type); |
| EXPECT_EQ(out_packet.header().version(), version); |
| EXPECT_EQ(out_packet.number_probe_packets(), number_probe_packets); |
| EXPECT_EQ(out_packet.group_id(), group_id); |
| } |
| |
| TEST_F(ProbeMessageTest, TestChecksum) { |
| ProbeMessage pm; |
| std::string str("ABC"); |
| uint32_t computed_checksum = pm.Checksum(str); |
| uint32_t expected_sum = 0; |
| for (unsigned i = 0; i < str.size(); ++i) |
| expected_sum += static_cast<uint8_t>(str[i]); |
| EXPECT_EQ(computed_checksum, expected_sum); |
| } |
| |
| TEST_F(ProbeMessageTest, TestEncode) { |
| ProbeMessage pm; |
| std::string original("ABC"); |
| std::string output = pm.Encode(original); |
| std::string expected_str(original.size(), 0); |
| for (unsigned i = 0; i < original.size(); ++i) { |
| expected_str[i] = original[i] ^ ProbeMessage::kEncodingString[i]; |
| } |
| EXPECT_EQ(output, expected_str); |
| |
| // Do it again to decode. |
| std::string twice_encoded = pm.Encode(output); |
| EXPECT_EQ(twice_encoded, original); |
| } |
| |
| } // namespace chrome_browser_net |