blob: 29a0e4547016c4c306a7e0a179e8f79200cbab0e [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 <glib.h>
15#include <gtest/gtest.h>
Darin Petkovd7061ab2010-10-06 14:37:09 -070016
rspangler@google.com49fdf182009-10-10 00:57:34 +000017#include "update_engine/libcurl_http_fetcher.h"
Darin Petkov36a58222010-10-07 22:00:09 -070018#include "update_engine/utils.h"
rspangler@google.com49fdf182009-10-10 00:57:34 +000019
Darin Petkov36a58222010-10-07 22:00:09 -070020using std::string;
Darin Petkovd7061ab2010-10-06 14:37:09 -070021using std::vector;
22
rspangler@google.com49fdf182009-10-10 00:57:34 +000023namespace chromeos_update_engine {
24
Darin Petkovd7061ab2010-10-06 14:37:09 -070025// Generated by running this on a linux shell:
26// $ echo -n hi | openssl dgst -sha256 -binary | openssl base64
27static const char kExpectedHash[] =
28 "j0NDRmSPa5bfid2pAcUXaxCm2Dlh3TwayItZstwyeqQ=";
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080029static const uint8_t kExpectedRawHash[] = {
Darin Petkovd7061ab2010-10-06 14:37:09 -070030 0x8f, 0x43, 0x43, 0x46, 0x64, 0x8f, 0x6b, 0x96,
31 0xdf, 0x89, 0xdd, 0xa9, 0x01, 0xc5, 0x17, 0x6b,
32 0x10, 0xa6, 0xd8, 0x39, 0x61, 0xdd, 0x3c, 0x1a,
33 0xc8, 0x8b, 0x59, 0xb2, 0xdc, 0x32, 0x7a, 0xa4
34};
35
Han Shen2643cb72012-06-26 14:45:33 -070036class OmahaHashCalculatorTest : public ::testing::Test {
Alex Vakulenkod2779df2014-06-16 13:19:00 -070037 public:
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080038 OmahaHashCalculatorTest() {}
Han Shen2643cb72012-06-26 14:45:33 -070039};
40
41TEST_F(OmahaHashCalculatorTest, SimpleTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000042 OmahaHashCalculator calc;
43 calc.Update("hi", 2);
44 calc.Finalize();
Darin Petkovd7061ab2010-10-06 14:37:09 -070045 EXPECT_EQ(kExpectedHash, calc.hash());
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080046 chromeos::Blob raw_hash(std::begin(kExpectedRawHash),
47 std::end(kExpectedRawHash));
Darin Petkovd7061ab2010-10-06 14:37:09 -070048 EXPECT_TRUE(raw_hash == calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000049}
50
Han Shen2643cb72012-06-26 14:45:33 -070051TEST_F(OmahaHashCalculatorTest, MultiUpdateTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000052 OmahaHashCalculator calc;
53 calc.Update("h", 1);
54 calc.Update("i", 1);
55 calc.Finalize();
Darin Petkovd7061ab2010-10-06 14:37:09 -070056 EXPECT_EQ(kExpectedHash, calc.hash());
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080057 chromeos::Blob raw_hash(std::begin(kExpectedRawHash),
58 std::end(kExpectedRawHash));
Darin Petkovd7061ab2010-10-06 14:37:09 -070059 EXPECT_TRUE(raw_hash == calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000060}
61
Han Shen2643cb72012-06-26 14:45:33 -070062TEST_F(OmahaHashCalculatorTest, ContextTest) {
Darin Petkov73058b42010-10-06 16:32:19 -070063 OmahaHashCalculator calc;
64 calc.Update("h", 1);
Darin Petkov36a58222010-10-07 22:00:09 -070065 string calc_context = calc.GetContext();
66 calc.Finalize();
Darin Petkov73058b42010-10-06 16:32:19 -070067 OmahaHashCalculator calc_next;
Darin Petkov36a58222010-10-07 22:00:09 -070068 calc_next.SetContext(calc_context);
Darin Petkov73058b42010-10-06 16:32:19 -070069 calc_next.Update("i", 1);
70 calc_next.Finalize();
Darin Petkov36a58222010-10-07 22:00:09 -070071 EXPECT_EQ(kExpectedHash, calc_next.hash());
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080072 chromeos::Blob raw_hash(std::begin(kExpectedRawHash),
73 std::end(kExpectedRawHash));
Darin Petkov36a58222010-10-07 22:00:09 -070074 EXPECT_TRUE(raw_hash == calc_next.raw_hash());
Darin Petkov73058b42010-10-06 16:32:19 -070075}
76
Han Shen2643cb72012-06-26 14:45:33 -070077TEST_F(OmahaHashCalculatorTest, BigTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000078 OmahaHashCalculator calc;
79
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070080 int digit_count = 1;
81 int next_overflow = 10;
rspangler@google.com49fdf182009-10-10 00:57:34 +000082 for (int i = 0; i < 1000000; i++) {
83 char buf[8];
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070084 if (i == next_overflow) {
85 next_overflow *= 10;
86 digit_count++;
87 }
88 ASSERT_EQ(digit_count, snprintf(buf, sizeof(buf), "%d", i)) << " i = " << i;
rspangler@google.com49fdf182009-10-10 00:57:34 +000089 calc.Update(buf, strlen(buf));
90 }
91 calc.Finalize();
92
93 // Hash constant generated by running this on a linux shell:
94 // $ C=0
95 // $ while [ $C -lt 1000000 ]; do
96 // echo -n $C
97 // let C=C+1
Darin Petkovd22cb292010-09-29 10:02:29 -070098 // done | openssl dgst -sha256 -binary | openssl base64
99 EXPECT_EQ("NZf8k6SPBkYMvhaX8YgzuMgbkLP1XZ+neM8K5wcSsf8=", calc.hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +0000100}
101
Han Shen2643cb72012-06-26 14:45:33 -0700102TEST_F(OmahaHashCalculatorTest, UpdateFileSimpleTest) {
Darin Petkov36a58222010-10-07 22:00:09 -0700103 string data_path;
104 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700105 utils::MakeTempFile("data.XXXXXX", &data_path, nullptr));
Darin Petkov36a58222010-10-07 22:00:09 -0700106 ScopedPathUnlinker data_path_unlinker(data_path);
107 ASSERT_TRUE(utils::WriteFile(data_path.c_str(), "hi", 2));
108
109 static const int kLengths[] = { -1, 2, 10 };
110 for (size_t i = 0; i < arraysize(kLengths); i++) {
111 OmahaHashCalculator calc;
112 EXPECT_EQ(2, calc.UpdateFile(data_path, kLengths[i]));
113 EXPECT_TRUE(calc.Finalize());
114 EXPECT_EQ(kExpectedHash, calc.hash());
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800115 chromeos::Blob raw_hash(std::begin(kExpectedRawHash),
116 std::end(kExpectedRawHash));
Darin Petkov36a58222010-10-07 22:00:09 -0700117 EXPECT_TRUE(raw_hash == calc.raw_hash());
118 }
119
120 OmahaHashCalculator calc;
121 EXPECT_EQ(0, calc.UpdateFile(data_path, 0));
122 EXPECT_EQ(1, calc.UpdateFile(data_path, 1));
123 EXPECT_TRUE(calc.Finalize());
124 // echo -n h | openssl dgst -sha256 -binary | openssl base64
125 EXPECT_EQ("qqlAJmTxpB9A67xSyZk+tmrrNmYClY/fqig7ceZNsSM=", calc.hash());
126}
127
Han Shen2643cb72012-06-26 14:45:33 -0700128TEST_F(OmahaHashCalculatorTest, RawHashOfFileSimpleTest) {
Darin Petkov698d0412010-10-13 10:59:44 -0700129 string data_path;
130 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700131 utils::MakeTempFile("data.XXXXXX", &data_path, nullptr));
Darin Petkov698d0412010-10-13 10:59:44 -0700132 ScopedPathUnlinker data_path_unlinker(data_path);
133 ASSERT_TRUE(utils::WriteFile(data_path.c_str(), "hi", 2));
134
135 static const int kLengths[] = { -1, 2, 10 };
136 for (size_t i = 0; i < arraysize(kLengths); i++) {
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800137 chromeos::Blob exp_raw_hash(std::begin(kExpectedRawHash),
138 std::end(kExpectedRawHash));
139 chromeos::Blob raw_hash;
Darin Petkov698d0412010-10-13 10:59:44 -0700140 EXPECT_EQ(2, OmahaHashCalculator::RawHashOfFile(data_path,
141 kLengths[i],
142 &raw_hash));
143 EXPECT_TRUE(exp_raw_hash == raw_hash);
144 }
145}
146
Han Shen2643cb72012-06-26 14:45:33 -0700147TEST_F(OmahaHashCalculatorTest, UpdateFileNonexistentTest) {
Darin Petkov36a58222010-10-07 22:00:09 -0700148 OmahaHashCalculator calc;
149 EXPECT_EQ(-1, calc.UpdateFile("/some/non-existent/file", -1));
150}
151
Han Shen2643cb72012-06-26 14:45:33 -0700152TEST_F(OmahaHashCalculatorTest, AbortTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +0000153 // Just make sure we don't crash and valgrind doesn't detect memory leaks
154 {
155 OmahaHashCalculator calc;
156 }
157 {
158 OmahaHashCalculator calc;
159 calc.Update("h", 1);
160 }
161}
162
163} // namespace chromeos_update_engine