Chromium Code Reviews| Index: components/data_reduction_proxy/core/common/client_config_parser_unittest.cc |
| diff --git a/components/data_reduction_proxy/core/common/client_config_parser_unittest.cc b/components/data_reduction_proxy/core/common/client_config_parser_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..74eaba9d76a626d797c71e68d3e364f0ef711b81 |
| --- /dev/null |
| +++ b/components/data_reduction_proxy/core/common/client_config_parser_unittest.cc |
| @@ -0,0 +1,228 @@ |
| +// 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/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[] = "] } }"; |
| + |
| +} // namespace |
| + |
| +TEST(ClientConfigParserTest, TimeToISO8601) { |
| + const struct { |
| + base::Time time; |
| + std::string expected; |
| + } tests[] = { |
| + { |
| + base::Time(), |
| + "1601-01-01T00:00:00.000Z", |
| + }, |
| + { |
| + base::Time::UnixEpoch(), |
| + "1970-01-01T00:00:00.000Z", |
| + }, |
| + }; |
| + |
| + for (size_t i = 0; i < arraysize(tests); ++i) { |
|
sclittle
2015/03/18 20:31:51
Use range-based for loops; e.g. for (const auto& t
jeremyim
2015/03/20 16:21:11
Done.
|
| + EXPECT_EQ(tests[i].expected, TimeToISO8601(tests[i].time)); |
| + } |
| +} |
| + |
| +TEST(ClientConfigParserTest, 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, |
| + }, |
| + { |
| + "1900-01-01T00:00:00.000Z", |
| + -2208988800, |
| + }, |
| + { |
| + "1900-01-01T00:00:00.500Z", |
| + -2208988799, // Rounding of negative fractional values causes this. |
| + }, |
| + }; |
| + |
| + for (size_t i = 0; i < arraysize(tests); ++i) { |
| + Timestamp timestamp; |
| + EXPECT_TRUE(ISO8601ToTimestamp(tests[i].time_string, ×tamp)); |
| + EXPECT_EQ(tests[i].epoch_seconds, timestamp.seconds()); |
| + EXPECT_EQ(0, timestamp.nanos()); |
| + } |
| +} |
| + |
| +TEST(ClientConfigParserTest, ISO8601ToTimestampTestFailures) { |
| + const std::string inputs[] = { |
| + "", |
| + "Not a time", |
| + "1234", |
| + "2099-43-12", |
| + "2099-11-52", |
| + }; |
| + |
| + for (size_t i = 0; i < arraysize(inputs); ++i) { |
| + Timestamp timestamp; |
| + EXPECT_FALSE(ISO8601ToTimestamp(inputs[i], ×tamp)); |
| + } |
| +} |
| + |
| +TEST(ClientConfigParserTest, TimestampToTime) { |
| + base::Time::Exploded future = { |
| + 2100, |
| + 12, |
| + 5, |
| + 31, |
| + 23, |
| + 59, |
| + 59, |
| + 0, |
| + }; |
| + 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), |
| + }, |
| + { |
| + // 2100-12-31T23:59:59.000Z |
| + 4133980799, |
| + 0, |
| + base::Time::FromUTCExploded(future), |
| + }, |
| + }; |
| + |
| + for (size_t i = 0; i < arraysize(tests); ++i) { |
| + Timestamp ts; |
| + ts.set_seconds(tests[i].timestamp_seconds); |
| + ts.set_nanos(tests[i].timestamp_nanos); |
| + EXPECT_EQ(tests[i].expected_time, TimestampToTime(ts)); |
| + } |
| +} |
| + |
| +TEST(ClientConfigParserTest, 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 (size_t i = 0; i < arraysize(inputs); ++i) { |
| + std::string input = kValidPreamble + inputs[i] + kValidPostamble; |
| + ClientConfig config; |
| + EXPECT_TRUE(ParseClientConfig(input, &config)); |
| + EXPECT_EQ(1, config.proxy_config().http_proxy_servers_size()); |
| + } |
| +} |
| + |
| +TEST(ClientConfigParserTest, 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(ParseClientConfig( |
| + kValidPreamble + input + kValidPostamble, &config)); |
| + EXPECT_EQ(3, config.proxy_config().http_proxy_servers_size()); |
| +} |
| + |
| +TEST(ClientConfigParserTest, 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 (size_t i = 0; i < arraysize(inputs); ++i) { |
| + const std::string& input = inputs[i]; |
| + ClientConfig config; |
| + EXPECT_FALSE(ParseClientConfig(input, &config)); |
| + } |
| +} |
| + |
| +TEST(ClientConfigParserTest, 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 (size_t i = 0; i < arraysize(inputs); ++i) { |
| + std::string input = kValidPreamble + inputs[i] + kValidPostamble; |
| + ClientConfig config; |
| + EXPECT_TRUE(ParseClientConfig(input, &config)); |
| + EXPECT_EQ(0, config.proxy_config().http_proxy_servers_size()); |
| + } |
| +} |
| + |
| +} // namespace data_reduction_proxy |