blob: ccff25889cad9247c4ee7f3000bf2b2d3373c460 [file] [log] [blame]
Bruno Rocha7f9aea22011-09-12 14:31:24 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <string>
6
7#include <base/string_util.h>
8#include <gmock/gmock.h>
9#include <gtest/gtest.h>
10#include <metrics/metrics_library_mock.h>
11
12#include "update_engine/certificate_checker.h"
13#include "update_engine/certificate_checker_mock.h"
14#include "update_engine/prefs_mock.h"
15
16using ::testing::_;
17using ::testing::DoAll;
18using ::testing::Return;
19using ::testing::SetArgumentPointee;
20using ::testing::SetArrayArgument;
21using std::string;
22
23namespace chromeos_update_engine {
24
25class CertificateCheckerTest : public testing::Test {
26 public:
27 CertificateCheckerTest() {}
28
29 protected:
30 virtual void SetUp() {
31 depth_ = 0;
32 length_ = 4;
33 digest_[0] = 0x17;
34 digest_[1] = 0x7D;
35 digest_[2] = 0x07;
36 digest_[3] = 0x5F;
37 digest_hex_ = "177D075F";
38 diff_digest_hex_ = "1234ABCD";
39 cert_key_prefix_ = kPrefsUpdateServerCertificate;
40 server_to_check_ = CertificateChecker::kUpdate;
41 cert_key_ = StringPrintf("%s-%d-%d",
42 cert_key_prefix_.c_str(),
43 server_to_check_,
44 depth_);
45 kCertChanged = "Updater.ServerCertificateChanged";
46 kCertFailed = "Updater.ServerCertificateFailed";
47 CertificateChecker::set_metrics_lib(&metrics_lib_);
48 CertificateChecker::set_prefs(&prefs_);
49 CertificateChecker::set_openssl_wrapper(&openssl_wrapper_);
50 }
51
52 virtual void TearDown() {}
53
54 MetricsLibraryMock metrics_lib_;
55 PrefsMock prefs_;
56 OpenSSLWrapperMock openssl_wrapper_;
57 // Parameters of our mock certificate digest.
58 int depth_;
59 unsigned int length_;
60 unsigned char digest_[4];
61 string digest_hex_;
62 string diff_digest_hex_;
63 string cert_key_prefix_;
64 CertificateChecker::ServerToCheck server_to_check_;
65 string cert_key_;
66 string kCertChanged;
67 string kCertFailed;
68};
69
70// check certificate change, new
71TEST_F(CertificateCheckerTest, NewCertificate) {
72 EXPECT_CALL(openssl_wrapper_, GetCertificateDigest(NULL, _, _, _))
73 .WillOnce(DoAll(
74 SetArgumentPointee<1>(depth_),
75 SetArgumentPointee<2>(length_),
76 SetArrayArgument<3>(digest_, digest_ + 4),
77 Return(true)));
78 EXPECT_CALL(prefs_, GetString(cert_key_, _))
79 .WillOnce(Return(false));
80 EXPECT_CALL(prefs_, SetString(cert_key_, digest_hex_))
81 .WillOnce(Return(true));
82 ASSERT_TRUE(CertificateChecker::CheckCertificateChange(
83 server_to_check_, 1, NULL));
84}
85
86// check certificate change, unchanged
87TEST_F(CertificateCheckerTest, SameCertificate) {
88 EXPECT_CALL(openssl_wrapper_, GetCertificateDigest(NULL, _, _, _))
89 .WillOnce(DoAll(
90 SetArgumentPointee<1>(depth_),
91 SetArgumentPointee<2>(length_),
92 SetArrayArgument<3>(digest_, digest_ + 4),
93 Return(true)));
94 EXPECT_CALL(prefs_, GetString(cert_key_, _))
95 .WillOnce(DoAll(
96 SetArgumentPointee<1>(digest_hex_),
97 Return(true)));
98 EXPECT_CALL(prefs_, SetString(_, _)).Times(0);
99 ASSERT_TRUE(CertificateChecker::CheckCertificateChange(
100 server_to_check_, 1, NULL));
101}
102
103// check certificate change, changed
104TEST_F(CertificateCheckerTest, ChangedCertificate) {
105 EXPECT_CALL(openssl_wrapper_, GetCertificateDigest(NULL, _, _, _))
106 .WillOnce(DoAll(
107 SetArgumentPointee<1>(depth_),
108 SetArgumentPointee<2>(length_),
109 SetArrayArgument<3>(digest_, digest_ + 4),
110 Return(true)));
111 EXPECT_CALL(prefs_, GetString(cert_key_, _))
112 .WillOnce(DoAll(
113 SetArgumentPointee<1>(diff_digest_hex_),
114 Return(true)));
115 EXPECT_CALL(prefs_, SetString(kPrefsCertificateReportToSendUpdate,
116 kCertChanged))
117 .WillOnce(Return(true));
118 EXPECT_CALL(prefs_, SetString(cert_key_, digest_hex_))
119 .WillOnce(Return(true));
120 ASSERT_TRUE(CertificateChecker::CheckCertificateChange(
121 server_to_check_, 1, NULL));
122}
123
124// check certificate change, failed
125TEST_F(CertificateCheckerTest, FailedCertificate) {
126 EXPECT_CALL(prefs_, SetString(kPrefsCertificateReportToSendUpdate,
127 kCertFailed))
128 .WillOnce(Return(true));
129 EXPECT_CALL(prefs_, GetString(_,_)).Times(0);
130 EXPECT_CALL(openssl_wrapper_, GetCertificateDigest(_,_,_,_)).Times(0);
131 ASSERT_FALSE(CertificateChecker::CheckCertificateChange(
132 server_to_check_, 0, NULL));
133}
134
135// flush send report
136TEST_F(CertificateCheckerTest, FlushReport) {
137 EXPECT_CALL(prefs_, GetString(kPrefsCertificateReportToSendUpdate, _))
138 .WillOnce(DoAll(
139 SetArgumentPointee<1>(kCertChanged),
140 Return(true)));
141 EXPECT_CALL(prefs_, GetString(kPrefsCertificateReportToSendDownload, _))
142 .WillOnce(Return(false));
143 EXPECT_CALL(metrics_lib_, SendUserActionToUMA(kCertChanged))
144 .WillOnce(Return(true));
145 EXPECT_CALL(prefs_, SetString(kPrefsCertificateReportToSendUpdate, ""))
146 .WillOnce(Return(true));
147 EXPECT_CALL(prefs_, SetString(kPrefsCertificateReportToSendDownload, _))
148 .Times(0);
149 CertificateChecker::FlushReport();
150}
151
152// flush nothing to report
153TEST_F(CertificateCheckerTest, FlushNothingToReport) {
154 string empty = "";
155 EXPECT_CALL(prefs_, GetString(kPrefsCertificateReportToSendUpdate, _))
156 .WillOnce(DoAll(
157 SetArgumentPointee<1>(empty),
158 Return(true)));
159 EXPECT_CALL(prefs_, GetString(kPrefsCertificateReportToSendDownload, _))
160 .WillOnce(Return(false));
161 EXPECT_CALL(metrics_lib_, SendUserActionToUMA(_)).Times(0);
162 EXPECT_CALL(prefs_, SetString(_,_)).Times(0);
163 CertificateChecker::FlushReport();
164}
165
166} // namespace chromeos_update_engine