blob: d230c329e3481f276a1f50ae2c3f7746a38a74a1 [file] [log] [blame]
// 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 "content/common/ssl_status_serialization.h"
#include "net/ssl/ssl_connection_status_flags.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
namespace {
void SetTestStatus(SSLStatus* status) {
status->security_style = SECURITY_STYLE_AUTHENTICATED;
status->cert_id = 1;
status->cert_status = net::CERT_STATUS_DATE_INVALID;
status->security_bits = 80;
status->key_exchange_info = 23;
status->connection_status = net::SSL_CONNECTION_VERSION_TLS1_2;
status->num_unknown_scts = 0;
status->num_invalid_scts = 0;
status->num_valid_scts = 1;
}
bool SSLStatusAreEqual(const SSLStatus& a, const SSLStatus &b) {
return a.Equals(b);
}
} // namespace
std::ostream& operator<<(std::ostream& os, const SSLStatus& status) {
return os << "Security Style: " << status.security_style
<< "\nCert ID: " << status.cert_id
<< "\nCert Status: " << status.cert_status
<< "\nSecurity bits: " << status.security_bits
<< "\nKey exchange info: " << status.key_exchange_info
<< "\nConnection status: " << status.connection_status
<< "\nContent Status: " << status.content_status
<< "\nNumber of unknown SCTs: " << status.num_unknown_scts
<< "\nNumber of invalid SCTs: " << status.num_invalid_scts
<< "\nNumber of valid SCTs: " << status.num_valid_scts;
}
// Test that a valid serialized SSLStatus returns true on
// deserialization and deserializes correctly.
TEST(SSLStatusSerializationTest, DeserializeSerializedStatus) {
// Serialize dummy data and test that it deserializes properly.
SSLStatus status;
SetTestStatus(&status);
std::string serialized = SerializeSecurityInfo(status);
SSLStatus deserialized;
ASSERT_TRUE(DeserializeSecurityInfo(serialized, &deserialized));
EXPECT_PRED2(SSLStatusAreEqual, status, deserialized);
// Test that |content_status| has the default (initialized) value.
EXPECT_EQ(SSLStatus::NORMAL_CONTENT, deserialized.content_status);
}
// Test that an invalid serialized SSLStatus returns false on
// deserialization.
TEST(SSLStatusSerializationTest, DeserializeBogusStatus) {
// Test that a failure to deserialize returns false and returns
// initialized, default data.
SSLStatus invalid_deserialized;
ASSERT_FALSE(
DeserializeSecurityInfo("not an SSLStatus", &invalid_deserialized));
EXPECT_PRED2(SSLStatusAreEqual, SSLStatus(), invalid_deserialized);
}
// Serialize a status with a bad |security_bits| value and test that
// deserializing it fails.
TEST(SSLStatusSerializationTest, DeserializeBogusSecurityBits) {
SSLStatus status;
SetTestStatus(&status);
// |security_bits| must be <-1. (-1 means the strength is unknown, and
// |0 means the connection is not encrypted).
status.security_bits = -5;
std::string serialized = SerializeSecurityInfo(status);
SSLStatus invalid_deserialized;
ASSERT_FALSE(DeserializeSecurityInfo(serialized, &invalid_deserialized));
EXPECT_PRED2(SSLStatusAreEqual, SSLStatus(), invalid_deserialized);
}
// Serialize a status with a bad |key_exchange_info| value and test that
// deserializing it fails.
TEST(SSLStatusSerializationTest, DeserializeBogusKeyExchangeInfo) {
SSLStatus status;
SetTestStatus(&status);
status.key_exchange_info = -1;
SSLStatus invalid_deserialized;
std::string serialized = SerializeSecurityInfo(status);
ASSERT_FALSE(DeserializeSecurityInfo(serialized, &invalid_deserialized));
EXPECT_PRED2(SSLStatusAreEqual, SSLStatus(), invalid_deserialized);
}
// Serialize a status with a bad |security_style| value and test that
// deserializing it fails.
TEST(SSLStatusSerializationTest, DeserializeBogusSecurityStyle) {
SSLStatus status;
SetTestStatus(&status);
status.security_style = static_cast<SecurityStyle>(100);
std::string serialized = SerializeSecurityInfo(status);
SSLStatus invalid_deserialized;
ASSERT_FALSE(DeserializeSecurityInfo(serialized, &invalid_deserialized));
EXPECT_PRED2(SSLStatusAreEqual, SSLStatus(), invalid_deserialized);
}
} // namespace