blob: d575fb098d6b36ed64ff599fa0e2274aa2018f53 [file] [log] [blame]
rspangler@google.com49fdf182009-10-10 00:57:34 +00001// Copyright (c) 2009 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
Alex Deymoaab50e32014-11-10 19:55:35 -08005#include "update_engine/omaha_hash_calculator.h"
6
rspangler@google.com49fdf182009-10-10 00:57:34 +00007#include <math.h>
8#include <unistd.h>
Darin Petkovd7061ab2010-10-06 14:37:09 -07009
Darin Petkov36a58222010-10-07 22:00:09 -070010#include <string>
Darin Petkovd7061ab2010-10-06 14:37:09 -070011#include <vector>
12
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080013#include <chromeos/secure_blob.h>
rspangler@google.com49fdf182009-10-10 00:57:34 +000014#include <gtest/gtest.h>
Darin Petkovd7061ab2010-10-06 14:37:09 -070015
rspangler@google.com49fdf182009-10-10 00:57:34 +000016#include "update_engine/libcurl_http_fetcher.h"
Darin Petkov36a58222010-10-07 22:00:09 -070017#include "update_engine/utils.h"
rspangler@google.com49fdf182009-10-10 00:57:34 +000018
Darin Petkov36a58222010-10-07 22:00:09 -070019using std::string;
Darin Petkovd7061ab2010-10-06 14:37:09 -070020using std::vector;
21
rspangler@google.com49fdf182009-10-10 00:57:34 +000022namespace chromeos_update_engine {
23
Darin Petkovd7061ab2010-10-06 14:37:09 -070024// Generated by running this on a linux shell:
25// $ echo -n hi | openssl dgst -sha256 -binary | openssl base64
26static const char kExpectedHash[] =
27 "j0NDRmSPa5bfid2pAcUXaxCm2Dlh3TwayItZstwyeqQ=";
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080028static const uint8_t kExpectedRawHash[] = {
Darin Petkovd7061ab2010-10-06 14:37:09 -070029 0x8f, 0x43, 0x43, 0x46, 0x64, 0x8f, 0x6b, 0x96,
30 0xdf, 0x89, 0xdd, 0xa9, 0x01, 0xc5, 0x17, 0x6b,
31 0x10, 0xa6, 0xd8, 0x39, 0x61, 0xdd, 0x3c, 0x1a,
32 0xc8, 0x8b, 0x59, 0xb2, 0xdc, 0x32, 0x7a, 0xa4
33};
34
Han Shen2643cb72012-06-26 14:45:33 -070035class OmahaHashCalculatorTest : public ::testing::Test {
Alex Vakulenkod2779df2014-06-16 13:19:00 -070036 public:
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080037 OmahaHashCalculatorTest() {}
Han Shen2643cb72012-06-26 14:45:33 -070038};
39
40TEST_F(OmahaHashCalculatorTest, SimpleTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000041 OmahaHashCalculator calc;
42 calc.Update("hi", 2);
43 calc.Finalize();
Darin Petkovd7061ab2010-10-06 14:37:09 -070044 EXPECT_EQ(kExpectedHash, calc.hash());
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080045 chromeos::Blob raw_hash(std::begin(kExpectedRawHash),
46 std::end(kExpectedRawHash));
Darin Petkovd7061ab2010-10-06 14:37:09 -070047 EXPECT_TRUE(raw_hash == calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000048}
49
Han Shen2643cb72012-06-26 14:45:33 -070050TEST_F(OmahaHashCalculatorTest, MultiUpdateTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000051 OmahaHashCalculator calc;
52 calc.Update("h", 1);
53 calc.Update("i", 1);
54 calc.Finalize();
Darin Petkovd7061ab2010-10-06 14:37:09 -070055 EXPECT_EQ(kExpectedHash, calc.hash());
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080056 chromeos::Blob raw_hash(std::begin(kExpectedRawHash),
57 std::end(kExpectedRawHash));
Darin Petkovd7061ab2010-10-06 14:37:09 -070058 EXPECT_TRUE(raw_hash == calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000059}
60
Han Shen2643cb72012-06-26 14:45:33 -070061TEST_F(OmahaHashCalculatorTest, ContextTest) {
Darin Petkov73058b42010-10-06 16:32:19 -070062 OmahaHashCalculator calc;
63 calc.Update("h", 1);
Darin Petkov36a58222010-10-07 22:00:09 -070064 string calc_context = calc.GetContext();
65 calc.Finalize();
Darin Petkov73058b42010-10-06 16:32:19 -070066 OmahaHashCalculator calc_next;
Darin Petkov36a58222010-10-07 22:00:09 -070067 calc_next.SetContext(calc_context);
Darin Petkov73058b42010-10-06 16:32:19 -070068 calc_next.Update("i", 1);
69 calc_next.Finalize();
Darin Petkov36a58222010-10-07 22:00:09 -070070 EXPECT_EQ(kExpectedHash, calc_next.hash());
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080071 chromeos::Blob raw_hash(std::begin(kExpectedRawHash),
72 std::end(kExpectedRawHash));
Darin Petkov36a58222010-10-07 22:00:09 -070073 EXPECT_TRUE(raw_hash == calc_next.raw_hash());
Darin Petkov73058b42010-10-06 16:32:19 -070074}
75
Han Shen2643cb72012-06-26 14:45:33 -070076TEST_F(OmahaHashCalculatorTest, BigTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000077 OmahaHashCalculator calc;
78
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070079 int digit_count = 1;
80 int next_overflow = 10;
rspangler@google.com49fdf182009-10-10 00:57:34 +000081 for (int i = 0; i < 1000000; i++) {
82 char buf[8];
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070083 if (i == next_overflow) {
84 next_overflow *= 10;
85 digit_count++;
86 }
87 ASSERT_EQ(digit_count, snprintf(buf, sizeof(buf), "%d", i)) << " i = " << i;
rspangler@google.com49fdf182009-10-10 00:57:34 +000088 calc.Update(buf, strlen(buf));
89 }
90 calc.Finalize();
91
92 // Hash constant generated by running this on a linux shell:
93 // $ C=0
94 // $ while [ $C -lt 1000000 ]; do
95 // echo -n $C
96 // let C=C+1
Darin Petkovd22cb292010-09-29 10:02:29 -070097 // done | openssl dgst -sha256 -binary | openssl base64
98 EXPECT_EQ("NZf8k6SPBkYMvhaX8YgzuMgbkLP1XZ+neM8K5wcSsf8=", calc.hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000099}
100
Han Shen2643cb72012-06-26 14:45:33 -0700101TEST_F(OmahaHashCalculatorTest, UpdateFileSimpleTest) {
Darin Petkov36a58222010-10-07 22:00:09 -0700102 string data_path;
103 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700104 utils::MakeTempFile("data.XXXXXX", &data_path, nullptr));
Darin Petkov36a58222010-10-07 22:00:09 -0700105 ScopedPathUnlinker data_path_unlinker(data_path);
106 ASSERT_TRUE(utils::WriteFile(data_path.c_str(), "hi", 2));
107
108 static const int kLengths[] = { -1, 2, 10 };
109 for (size_t i = 0; i < arraysize(kLengths); i++) {
110 OmahaHashCalculator calc;
111 EXPECT_EQ(2, calc.UpdateFile(data_path, kLengths[i]));
112 EXPECT_TRUE(calc.Finalize());
113 EXPECT_EQ(kExpectedHash, calc.hash());
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800114 chromeos::Blob raw_hash(std::begin(kExpectedRawHash),
115 std::end(kExpectedRawHash));
Darin Petkov36a58222010-10-07 22:00:09 -0700116 EXPECT_TRUE(raw_hash == calc.raw_hash());
117 }
118
119 OmahaHashCalculator calc;
120 EXPECT_EQ(0, calc.UpdateFile(data_path, 0));
121 EXPECT_EQ(1, calc.UpdateFile(data_path, 1));
122 EXPECT_TRUE(calc.Finalize());
123 // echo -n h | openssl dgst -sha256 -binary | openssl base64
124 EXPECT_EQ("qqlAJmTxpB9A67xSyZk+tmrrNmYClY/fqig7ceZNsSM=", calc.hash());
125}
126
Han Shen2643cb72012-06-26 14:45:33 -0700127TEST_F(OmahaHashCalculatorTest, RawHashOfFileSimpleTest) {
Darin Petkov698d0412010-10-13 10:59:44 -0700128 string data_path;
129 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700130 utils::MakeTempFile("data.XXXXXX", &data_path, nullptr));
Darin Petkov698d0412010-10-13 10:59:44 -0700131 ScopedPathUnlinker data_path_unlinker(data_path);
132 ASSERT_TRUE(utils::WriteFile(data_path.c_str(), "hi", 2));
133
134 static const int kLengths[] = { -1, 2, 10 };
135 for (size_t i = 0; i < arraysize(kLengths); i++) {
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800136 chromeos::Blob exp_raw_hash(std::begin(kExpectedRawHash),
137 std::end(kExpectedRawHash));
138 chromeos::Blob raw_hash;
Darin Petkov698d0412010-10-13 10:59:44 -0700139 EXPECT_EQ(2, OmahaHashCalculator::RawHashOfFile(data_path,
140 kLengths[i],
141 &raw_hash));
142 EXPECT_TRUE(exp_raw_hash == raw_hash);
143 }
144}
145
Han Shen2643cb72012-06-26 14:45:33 -0700146TEST_F(OmahaHashCalculatorTest, UpdateFileNonexistentTest) {
Darin Petkov36a58222010-10-07 22:00:09 -0700147 OmahaHashCalculator calc;
148 EXPECT_EQ(-1, calc.UpdateFile("/some/non-existent/file", -1));
149}
150
Han Shen2643cb72012-06-26 14:45:33 -0700151TEST_F(OmahaHashCalculatorTest, AbortTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +0000152 // Just make sure we don't crash and valgrind doesn't detect memory leaks
153 {
154 OmahaHashCalculator calc;
155 }
156 {
157 OmahaHashCalculator calc;
158 calc.Update("h", 1);
159 }
160}
161
162} // namespace chromeos_update_engine