blob: 12497350fcafb117c8bffd6486b444836fbaa529 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2012 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
Bruno Rocha7f9aea22011-09-12 14:31:24 -070016
Alex Deymo8427b4a2014-11-05 14:00:32 -080017#include "update_engine/certificate_checker.h"
18
Bruno Rocha7f9aea22011-09-12 14:31:24 -070019#include <string>
20
Alex Vakulenko75039d72014-03-25 12:36:28 -070021#include <base/strings/string_util.h>
22#include <base/strings/stringprintf.h>
Bruno Rocha7f9aea22011-09-12 14:31:24 -070023#include <gmock/gmock.h>
24#include <gtest/gtest.h>
25#include <metrics/metrics_library_mock.h>
26
Jay Srinivasand29695d2013-04-08 15:08:05 -070027#include "update_engine/constants.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070028#include "update_engine/fake_system_state.h"
Alex Deymo8427b4a2014-11-05 14:00:32 -080029#include "update_engine/mock_certificate_checker.h"
30#include "update_engine/mock_prefs.h"
Bruno Rocha7f9aea22011-09-12 14:31:24 -070031
Bruno Rocha7f9aea22011-09-12 14:31:24 -070032using ::testing::DoAll;
33using ::testing::Return;
34using ::testing::SetArgumentPointee;
35using ::testing::SetArrayArgument;
Alex Deymof329b932014-10-30 01:37:48 -070036using ::testing::_;
Bruno Rocha7f9aea22011-09-12 14:31:24 -070037using std::string;
38
39namespace chromeos_update_engine {
40
41class CertificateCheckerTest : public testing::Test {
42 public:
43 CertificateCheckerTest() {}
44
45 protected:
Alex Deymo610277e2014-11-11 21:18:11 -080046 void SetUp() override {
Bruno Rocha7f9aea22011-09-12 14:31:24 -070047 depth_ = 0;
48 length_ = 4;
49 digest_[0] = 0x17;
50 digest_[1] = 0x7D;
51 digest_[2] = 0x07;
52 digest_[3] = 0x5F;
53 digest_hex_ = "177D075F";
54 diff_digest_hex_ = "1234ABCD";
55 cert_key_prefix_ = kPrefsUpdateServerCertificate;
56 server_to_check_ = CertificateChecker::kUpdate;
Alex Vakulenko75039d72014-03-25 12:36:28 -070057 cert_key_ = base::StringPrintf("%s-%d-%d",
58 cert_key_prefix_.c_str(),
59 server_to_check_,
60 depth_);
Bruno Rocha7f9aea22011-09-12 14:31:24 -070061 kCertChanged = "Updater.ServerCertificateChanged";
62 kCertFailed = "Updater.ServerCertificateFailed";
Gilad Arnold5bb4c902014-04-10 12:32:13 -070063 CertificateChecker::set_system_state(&fake_system_state_);
Bruno Rocha7f9aea22011-09-12 14:31:24 -070064 CertificateChecker::set_openssl_wrapper(&openssl_wrapper_);
Gilad Arnold5bb4c902014-04-10 12:32:13 -070065 prefs_ = fake_system_state_.mock_prefs();
Bruno Rocha7f9aea22011-09-12 14:31:24 -070066 }
67
Alex Deymo610277e2014-11-11 21:18:11 -080068 void TearDown() override {}
Bruno Rocha7f9aea22011-09-12 14:31:24 -070069
Gilad Arnold5bb4c902014-04-10 12:32:13 -070070 FakeSystemState fake_system_state_;
Alex Deymo8427b4a2014-11-05 14:00:32 -080071 MockPrefs* prefs_; // shortcut to fake_system_state_.mock_prefs()
72 MockOpenSSLWrapper openssl_wrapper_;
Bruno Rocha7f9aea22011-09-12 14:31:24 -070073 // Parameters of our mock certificate digest.
74 int depth_;
75 unsigned int length_;
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080076 uint8_t digest_[4];
Bruno Rocha7f9aea22011-09-12 14:31:24 -070077 string digest_hex_;
78 string diff_digest_hex_;
79 string cert_key_prefix_;
80 CertificateChecker::ServerToCheck server_to_check_;
81 string cert_key_;
82 string kCertChanged;
83 string kCertFailed;
84};
85
86// check certificate change, new
87TEST_F(CertificateCheckerTest, NewCertificate) {
Alex Vakulenko88b591f2014-08-28 16:48:57 -070088 EXPECT_CALL(openssl_wrapper_, GetCertificateDigest(nullptr, _, _, _))
Bruno Rocha7f9aea22011-09-12 14:31:24 -070089 .WillOnce(DoAll(
90 SetArgumentPointee<1>(depth_),
91 SetArgumentPointee<2>(length_),
92 SetArrayArgument<3>(digest_, digest_ + 4),
93 Return(true)));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080094 EXPECT_CALL(*prefs_, GetString(cert_key_, _))
Bruno Rocha7f9aea22011-09-12 14:31:24 -070095 .WillOnce(Return(false));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080096 EXPECT_CALL(*prefs_, SetString(cert_key_, digest_hex_))
Bruno Rocha7f9aea22011-09-12 14:31:24 -070097 .WillOnce(Return(true));
98 ASSERT_TRUE(CertificateChecker::CheckCertificateChange(
Alex Vakulenko88b591f2014-08-28 16:48:57 -070099 server_to_check_, 1, nullptr));
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700100}
101
102// check certificate change, unchanged
103TEST_F(CertificateCheckerTest, SameCertificate) {
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700104 EXPECT_CALL(openssl_wrapper_, GetCertificateDigest(nullptr, _, _, _))
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700105 .WillOnce(DoAll(
106 SetArgumentPointee<1>(depth_),
107 SetArgumentPointee<2>(length_),
108 SetArrayArgument<3>(digest_, digest_ + 4),
109 Return(true)));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800110 EXPECT_CALL(*prefs_, GetString(cert_key_, _))
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700111 .WillOnce(DoAll(
112 SetArgumentPointee<1>(digest_hex_),
113 Return(true)));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800114 EXPECT_CALL(*prefs_, SetString(_, _)).Times(0);
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700115 ASSERT_TRUE(CertificateChecker::CheckCertificateChange(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700116 server_to_check_, 1, nullptr));
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700117}
118
119// check certificate change, changed
120TEST_F(CertificateCheckerTest, ChangedCertificate) {
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700121 EXPECT_CALL(openssl_wrapper_, GetCertificateDigest(nullptr, _, _, _))
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700122 .WillOnce(DoAll(
123 SetArgumentPointee<1>(depth_),
124 SetArgumentPointee<2>(length_),
125 SetArrayArgument<3>(digest_, digest_ + 4),
126 Return(true)));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800127 EXPECT_CALL(*prefs_, GetString(cert_key_, _))
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700128 .WillOnce(DoAll(
129 SetArgumentPointee<1>(diff_digest_hex_),
130 Return(true)));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800131 EXPECT_CALL(*prefs_, SetString(kPrefsCertificateReportToSendUpdate,
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700132 kCertChanged))
133 .WillOnce(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800134 EXPECT_CALL(*prefs_, SetString(cert_key_, digest_hex_))
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700135 .WillOnce(Return(true));
136 ASSERT_TRUE(CertificateChecker::CheckCertificateChange(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700137 server_to_check_, 1, nullptr));
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700138}
139
140// check certificate change, failed
141TEST_F(CertificateCheckerTest, FailedCertificate) {
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800142 EXPECT_CALL(*prefs_, SetString(kPrefsCertificateReportToSendUpdate,
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700143 kCertFailed))
144 .WillOnce(Return(true));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700145 EXPECT_CALL(*prefs_, GetString(_, _)).Times(0);
146 EXPECT_CALL(openssl_wrapper_, GetCertificateDigest(_, _, _, _)).Times(0);
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700147 ASSERT_FALSE(CertificateChecker::CheckCertificateChange(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700148 server_to_check_, 0, nullptr));
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700149}
150
151// flush send report
152TEST_F(CertificateCheckerTest, FlushReport) {
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800153 EXPECT_CALL(*prefs_, GetString(kPrefsCertificateReportToSendUpdate, _))
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700154 .WillOnce(DoAll(
155 SetArgumentPointee<1>(kCertChanged),
156 Return(true)));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800157 EXPECT_CALL(*prefs_, GetString(kPrefsCertificateReportToSendDownload, _))
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700158 .WillOnce(Return(false));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700159 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800160 SendUserActionToUMA(kCertChanged))
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700161 .WillOnce(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800162 EXPECT_CALL(*prefs_, Delete(kPrefsCertificateReportToSendUpdate))
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700163 .WillOnce(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800164 EXPECT_CALL(*prefs_, SetString(kPrefsCertificateReportToSendDownload, _))
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700165 .Times(0);
166 CertificateChecker::FlushReport();
167}
168
169// flush nothing to report
170TEST_F(CertificateCheckerTest, FlushNothingToReport) {
171 string empty = "";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800172 EXPECT_CALL(*prefs_, GetString(kPrefsCertificateReportToSendUpdate, _))
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700173 .WillOnce(DoAll(
174 SetArgumentPointee<1>(empty),
175 Return(true)));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800176 EXPECT_CALL(*prefs_, GetString(kPrefsCertificateReportToSendDownload, _))
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700177 .WillOnce(Return(false));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700178 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800179 SendUserActionToUMA(_)).Times(0);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700180 EXPECT_CALL(*prefs_, SetString(_, _)).Times(0);
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700181 CertificateChecker::FlushReport();
182}
183
184} // namespace chromeos_update_engine