summaryrefslogtreecommitdiffstats
path: root/content/common/ssl_status_serialization_unittest.cc
blob: d479518add63ab52a74e694f2eff5b17b7434d8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// 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->signed_certificate_timestamp_ids.push_back(
      SignedCertificateTimestampIDAndStatus(1, net::ct::SCT_STATUS_OK));
}

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 SCTs: " << status.signed_certificate_timestamp_ids.size();
}

// 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);
  EXPECT_EQ(SignedCertificateTimestampIDAndStatus(1, net::ct::SCT_STATUS_OK),
            deserialized.signed_certificate_timestamp_ids[0]);
  // 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