| Index: components/data_reduction_proxy/core/common/data_reduction_proxy_client_config_parser_unittest.cc
|
| diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_client_config_parser_unittest.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_client_config_parser_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..997d6f2804abdbb5841c9fb03daae9f59c359e75
|
| --- /dev/null
|
| +++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_client_config_parser_unittest.cc
|
| @@ -0,0 +1,234 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "components/data_reduction_proxy/core/common/data_reduction_proxy_client_config_parser.h"
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/time/time.h"
|
| +#include "components/data_reduction_proxy/proto/client_config.pb.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace data_reduction_proxy {
|
| +
|
| +namespace {
|
| +
|
| +const char kValidPreamble[] =
|
| + "{ \"sessionKey\": \"foobar\", "
|
| + "\"expireTime\": \"2100-12-31T23:59:59.999999Z\", "
|
| + "\"proxyConfig\": { \"httpProxyServers\": [";
|
| +const char kValidPostamble[] = "] } }";
|
| +const char kFutureTime[] = "31 Dec 2020 23:59:59";
|
| +
|
| +} // namespace
|
| +
|
| +class DataReductionProxyClientConfigParserTest : public testing::Test {
|
| + protected:
|
| + void SetUp() override {
|
| + EXPECT_TRUE(base::Time::FromUTCString(kFutureTime, &future_time_));
|
| + }
|
| +
|
| + const base::Time& GetFutureTime() {
|
| + return future_time_;
|
| + }
|
| +
|
| + private:
|
| + base::Time future_time_;
|
| +};
|
| +
|
| +TEST_F(DataReductionProxyClientConfigParserTest, TimeToISO8601) {
|
| + const struct {
|
| + base::Time time;
|
| + std::string expected;
|
| + } tests[] = {
|
| + {
|
| + base::Time::UnixEpoch(),
|
| + "1970-01-01T00:00:00.000Z",
|
| + },
|
| + {
|
| + GetFutureTime(),
|
| + "2020-12-31T23:59:59.000Z",
|
| + },
|
| + };
|
| +
|
| + for (const auto& test : tests) {
|
| + EXPECT_EQ(test.expected, config_parser::TimeToISO8601(test.time));
|
| + }
|
| +}
|
| +
|
| +TEST_F(DataReductionProxyClientConfigParserTest, ISO8601ToTimestamp) {
|
| + const struct {
|
| + std::string time_string;
|
| + int64 epoch_seconds;
|
| + } tests[] = {
|
| + {
|
| + "1970-01-01T00:00:00.000Z",
|
| + 0,
|
| + },
|
| + {
|
| + "1970-01-01T00:00:00.999Z",
|
| + 0,
|
| + },
|
| + {
|
| + "1950-01-01T00:00:00.000Z",
|
| + -631152000,
|
| + },
|
| + {
|
| + "1950-01-01T00:00:00.500Z",
|
| + -631151999, // Rounding of negative fractional values causes this.
|
| + },
|
| + };
|
| +
|
| + for (const auto& test : tests) {
|
| + Timestamp timestamp;
|
| + EXPECT_TRUE(
|
| + config_parser::ISO8601ToTimestamp(test.time_string, ×tamp));
|
| + EXPECT_EQ(test.epoch_seconds, timestamp.seconds());
|
| + EXPECT_EQ(0, timestamp.nanos());
|
| + }
|
| +}
|
| +
|
| +TEST_F(DataReductionProxyClientConfigParserTest, ISO8601ToTimestampTestFailures)
|
| +{
|
| + const std::string inputs[] = {
|
| + "",
|
| + "Not a time",
|
| + "1234",
|
| + "2099-43-12",
|
| + "2099-11-52",
|
| + };
|
| +
|
| + for (const auto& input : inputs) {
|
| + Timestamp timestamp;
|
| + EXPECT_FALSE(config_parser::ISO8601ToTimestamp(input, ×tamp));
|
| + }
|
| +}
|
| +
|
| +TEST_F(DataReductionProxyClientConfigParserTest, TimestampToTime) {
|
| + const struct {
|
| + int64 timestamp_seconds;
|
| + int32 timestamp_nanos;
|
| + base::Time expected_time;
|
| + } tests[] = {
|
| + {
|
| + 0,
|
| + 0,
|
| + base::Time::UnixEpoch(),
|
| + },
|
| + {
|
| + 24 * 60 * 60 - 1,
|
| + base::Time::kNanosecondsPerSecond - 1,
|
| + base::Time::UnixEpoch() + base::TimeDelta::FromDays(1) -
|
| + base::TimeDelta::FromMicroseconds(1),
|
| + },
|
| + {
|
| + // 2020-12-31T23:59:59.000Z
|
| + 1609459199,
|
| + 0,
|
| + GetFutureTime(),
|
| + },
|
| + };
|
| +
|
| + for (const auto& test : tests) {
|
| + Timestamp ts;
|
| + ts.set_seconds(test.timestamp_seconds);
|
| + ts.set_nanos(test.timestamp_nanos);
|
| + EXPECT_EQ(test.expected_time, config_parser::TimestampToTime(ts));
|
| + }
|
| +}
|
| +
|
| +TEST_F(DataReductionProxyClientConfigParserTest, SingleServer) {
|
| + const std::string inputs[] = {
|
| + "{ \"scheme\": \"HTTP\", \"host\": \"foo.com\", \"port\": 80 }",
|
| + "{ \"scheme\": \"HTTPS\", \"host\": \"foo.com\", \"port\": 443 }",
|
| + "{ \"scheme\": \"QUIC\", \"host\": \"foo.com\", \"port\": 443 }",
|
| + };
|
| +
|
| + for (const auto& scheme_fragment : inputs) {
|
| + std::string input = kValidPreamble + scheme_fragment + kValidPostamble;
|
| + ClientConfig config;
|
| + EXPECT_TRUE(config_parser::ParseClientConfig(input, &config));
|
| + EXPECT_EQ(1, config.proxy_config().http_proxy_servers_size());
|
| + }
|
| +}
|
| +
|
| +TEST_F(DataReductionProxyClientConfigParserTest, MultipleServers) {
|
| + std::string input =
|
| + "{ \"scheme\": \"HTTP\", ""\"host\": \"foo.com\", \"port\": 80 }, "
|
| + "{ \"scheme\": \"HTTPS\", \"host\": \"foo.com\", \"port\": 443 }, "
|
| + "{ \"scheme\": \"QUIC\", \"host\": \"foo.com\", \"port\": 443 }";
|
| + ClientConfig config;
|
| + EXPECT_TRUE(config_parser::ParseClientConfig(
|
| + kValidPreamble + input + kValidPostamble, &config));
|
| + EXPECT_EQ(3, config.proxy_config().http_proxy_servers_size());
|
| +}
|
| +
|
| +TEST_F(DataReductionProxyClientConfigParserTest, FailureCases) {
|
| + const std::string inputs[] = {
|
| + "",
|
| + "invalid json",
|
| + // No sessionKey
|
| + "{ \"expireTime\": \"2100-12-31T23:59:59.999999Z\","
|
| + "\"proxyConfig\": { \"httpProxyServers\": [ ] } }",
|
| + // No expireTime
|
| + "{ \"sessionKey\": \"foobar\","
|
| + "\"proxyConfig\": { \"httpProxyServers\": [ ] } }",
|
| + // No proxyConfig
|
| + "{ \"sessionKey\": \"foobar\", "
|
| + "\"expireTime\": \"2100-12-31T23:59:59.999999Z\" }",
|
| + // No proxyConfig.httpProxyServers
|
| + "{ \"sessionKey\": \"foobar\", "
|
| + "\"expireTime\": \"2100-12-31T23:59:59.999999Z\", \"proxyConfig\": { } }",
|
| + // Invalid sessionKey
|
| + "{ \"sessionKey\": 12345, "
|
| + "\"expireTime\": \"2100-12-31T23:59:59.999999Z\","
|
| + " \"proxyConfig\": { \"httpProxyServers\": [ ] } }",
|
| + // Invalid sessionKey
|
| + "{ \"sessionKey\": { }, "
|
| + "\"expireTime\": \"2100-12-31T23:59:59.999999Z\","
|
| + " \"proxyConfig\": { \"httpProxyServers\": [ ] } }",
|
| + // Invalid sessionKey
|
| + "{ \"sessionKey\": [ ], "
|
| + "\"expireTime\": \"2100-12-31T23:59:59.999999Z\","
|
| + " \"proxyConfig\": { \"httpProxyServers\": [ ] } }",
|
| + // Invalid expireTime
|
| + "{ \"sessionKey\": \"foobar\", "
|
| + "\"expireTime\": \"abcd\","
|
| + " \"proxyConfig\": { \"httpProxyServers\": [ ] } }",
|
| + // Invalid expireTime
|
| + "{ \"sessionKey\": \"foobar\", "
|
| + "\"expireTime\": [ ],"
|
| + " \"proxyConfig\": { \"httpProxyServers\": [ ] } }",
|
| + // Invalid expireTime
|
| + "{ \"sessionKey\": \"foobar\", "
|
| + "\"expireTime\": { },"
|
| + " \"proxyConfig\": { \"httpProxyServers\": [ ] } }",
|
| + };
|
| +
|
| + for (const auto& input : inputs) {
|
| + ClientConfig config;
|
| + EXPECT_FALSE(config_parser::ParseClientConfig(input, &config));
|
| + }
|
| +}
|
| +
|
| +TEST_F(DataReductionProxyClientConfigParserTest, EmptyServerLists) {
|
| + const std::string inputs[] = {
|
| + "",
|
| + "{ }",
|
| + "{ \"scheme\": \"foo\", \"host\": \"foo.com\", \"port\": 80 }",
|
| + "{ \"scheme\": \"HTTP\", \"port\": 80 }",
|
| + "{ \"scheme\": \"HTTP\", \"host\": \"foo.com\" }",
|
| + "{ \"scheme\": \"HTTP\", \"host\": \"foo.com\", \"port\": \"bar\" }",
|
| + "{ \"scheme\": \"HTTP\", \"host\": 12345, \"port\": 80 }",
|
| + };
|
| +
|
| + for (const auto& scheme_fragment : inputs) {
|
| + std::string input = kValidPreamble + scheme_fragment + kValidPostamble;
|
| + ClientConfig config;
|
| + EXPECT_TRUE(config_parser::ParseClientConfig(input, &config));
|
| + EXPECT_EQ(0, config.proxy_config().http_proxy_servers_size());
|
| + }
|
| +}
|
| +
|
| +} // namespace data_reduction_proxy
|
|
|