blob: 8810575c60bc3a0d2dc376df1d905076bfe3ff33 [file] [log] [blame]
// Copyright (c) 2013 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 "net/log/net_log_values.h"
#include <limits>
#include "base/values.h"
#include "net/log/file_net_log_observer.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
// Calls NetLogASCIIStringValue() on |raw| and returns the resulting string
// (rather than the base::Value).
std::string GetNetLogString(base::StringPiece raw) {
base::Value value = NetLogStringValue(raw);
std::string result;
EXPECT_TRUE(value.GetAsString(&result));
return result;
}
TEST(NetLogValuesTest, NetLogASCIIStringValue) {
// ASCII strings should not be transformed.
EXPECT_EQ("ascii\nstrin\0g", GetNetLogString("ascii\nstrin\0g"));
// Non-ASCII UTF-8 strings should be escaped.
EXPECT_EQ("%ESCAPED:\xE2\x80\x8B utf-8 string %E2%98%83",
GetNetLogString("utf-8 string \xE2\x98\x83"));
// The presence of percent should not trigger escaping.
EXPECT_EQ("%20", GetNetLogString("%20"));
// However if the value to be escaped contains percent, it should be escaped
// (so can unescape to restore the original string).
EXPECT_EQ("%ESCAPED:\xE2\x80\x8B %E2%98%83 %2520",
GetNetLogString("\xE2\x98\x83 %20"));
// Test that when percent escaping, no ASCII value is escaped (excluding %).
for (uint8_t c = 0; c <= 0x7F; ++c) {
if (c == '%')
continue;
std::string s;
s.push_back(c);
EXPECT_EQ("%ESCAPED:\xE2\x80\x8B %E2 " + s, GetNetLogString("\xE2 " + s));
}
}
TEST(NetLogValuesTest, NetLogBinaryValue) {
// Test the encoding for empty bytes.
auto value1 = NetLogBinaryValue(nullptr, 0);
std::string string1;
ASSERT_TRUE(value1.GetAsString(&string1));
EXPECT_EQ("", string1);
// Test the encoding for a non-empty sequence (which needs padding).
const uint8_t kBytes[] = {0x00, 0xF3, 0xF8, 0xFF};
auto value2 = NetLogBinaryValue(kBytes, base::size(kBytes));
std::string string2;
ASSERT_TRUE(value2.GetAsString(&string2));
EXPECT_EQ("APP4/w==", string2);
}
template <typename T>
std::string SerializedNetLogNumber(T num) {
auto value = NetLogNumberValue(num);
EXPECT_TRUE(value.is_string() || value.is_int() || value.is_double());
return SerializeNetLogValueToJson(value);
}
std::string SerializedNetLogInt64(int64_t num) {
return SerializedNetLogNumber(num);
}
std::string SerializedNetLogUint64(uint64_t num) {
return SerializedNetLogNumber(num);
}
TEST(NetLogValuesTest, NetLogNumberValue) {
const int64_t kMinInt = std::numeric_limits<int32_t>::min();
const int64_t kMaxInt = std::numeric_limits<int32_t>::max();
// Numbers which can be represented by an INTEGER base::Value().
EXPECT_EQ("0", SerializedNetLogInt64(0));
EXPECT_EQ("0", SerializedNetLogUint64(0));
EXPECT_EQ("-1", SerializedNetLogInt64(-1));
EXPECT_EQ("-2147483648", SerializedNetLogInt64(kMinInt));
EXPECT_EQ("2147483647", SerializedNetLogInt64(kMaxInt));
// Numbers which are outside of the INTEGER range, but fit within a DOUBLE.
EXPECT_EQ("-2147483649", SerializedNetLogInt64(kMinInt - 1));
EXPECT_EQ("2147483648", SerializedNetLogInt64(kMaxInt + 1));
EXPECT_EQ("4294967294", SerializedNetLogInt64(0xFFFFFFFF - 1));
// kMaxSafeInteger is the same as JavaScript's Numbers.MAX_SAFE_INTEGER.
const int64_t kMaxSafeInteger = 9007199254740991; // 2^53 - 1
// Numbers that can be represented with full precision by a DOUBLE.
EXPECT_EQ("-9007199254740991", SerializedNetLogInt64(-kMaxSafeInteger));
EXPECT_EQ("9007199254740991", SerializedNetLogInt64(kMaxSafeInteger));
EXPECT_EQ("9007199254740991", SerializedNetLogUint64(kMaxSafeInteger));
// Numbers that are just outside of the range of a DOUBLE need to be encoded
// as strings.
EXPECT_EQ("\"-9007199254740992\"",
SerializedNetLogInt64(-kMaxSafeInteger - 1));
EXPECT_EQ("\"9007199254740992\"", SerializedNetLogInt64(kMaxSafeInteger + 1));
EXPECT_EQ("\"9007199254740992\"",
SerializedNetLogUint64(kMaxSafeInteger + 1));
// Test the 64-bit maximums.
EXPECT_EQ("\"9223372036854775807\"",
SerializedNetLogInt64(std::numeric_limits<int64_t>::max()));
EXPECT_EQ("\"18446744073709551615\"",
SerializedNetLogUint64(std::numeric_limits<uint64_t>::max()));
}
} // namespace net