blob: 08e8698e934a6655212ee2c8d7ff7d6ac05a1c83 [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
rspangler@google.com49fdf182009-10-10 00:57:34 +000013#include <glib.h>
14#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=";
Han Shen2643cb72012-06-26 14:45:33 -070028static const unsigned char kRawExpectedRawHash[] = {
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:
Han Shen2643cb72012-06-26 14:45:33 -070037 const char *kExpectedRawHash;
38 const char *kExpectedRawHashEnd;
39
40 OmahaHashCalculatorTest() :
41 kExpectedRawHash(reinterpret_cast<const char*>(kRawExpectedRawHash)),
42 kExpectedRawHashEnd(kExpectedRawHash + arraysize(kRawExpectedRawHash))
43 {}
44};
45
46TEST_F(OmahaHashCalculatorTest, SimpleTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000047 OmahaHashCalculator calc;
48 calc.Update("hi", 2);
49 calc.Finalize();
Darin Petkovd7061ab2010-10-06 14:37:09 -070050 EXPECT_EQ(kExpectedHash, calc.hash());
Han Shen2643cb72012-06-26 14:45:33 -070051 vector<char> raw_hash(kExpectedRawHash, kExpectedRawHashEnd);
Darin Petkovd7061ab2010-10-06 14:37:09 -070052 EXPECT_TRUE(raw_hash == calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000053}
54
Han Shen2643cb72012-06-26 14:45:33 -070055TEST_F(OmahaHashCalculatorTest, MultiUpdateTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000056 OmahaHashCalculator calc;
57 calc.Update("h", 1);
58 calc.Update("i", 1);
59 calc.Finalize();
Darin Petkovd7061ab2010-10-06 14:37:09 -070060 EXPECT_EQ(kExpectedHash, calc.hash());
Han Shen2643cb72012-06-26 14:45:33 -070061 vector<char> raw_hash(kExpectedRawHash, kExpectedRawHashEnd);
Darin Petkovd7061ab2010-10-06 14:37:09 -070062 EXPECT_TRUE(raw_hash == calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000063}
64
Han Shen2643cb72012-06-26 14:45:33 -070065TEST_F(OmahaHashCalculatorTest, ContextTest) {
Darin Petkov73058b42010-10-06 16:32:19 -070066 OmahaHashCalculator calc;
67 calc.Update("h", 1);
Darin Petkov36a58222010-10-07 22:00:09 -070068 string calc_context = calc.GetContext();
69 calc.Finalize();
Darin Petkov73058b42010-10-06 16:32:19 -070070 OmahaHashCalculator calc_next;
Darin Petkov36a58222010-10-07 22:00:09 -070071 calc_next.SetContext(calc_context);
Darin Petkov73058b42010-10-06 16:32:19 -070072 calc_next.Update("i", 1);
73 calc_next.Finalize();
Darin Petkov36a58222010-10-07 22:00:09 -070074 EXPECT_EQ(kExpectedHash, calc_next.hash());
Han Shen2643cb72012-06-26 14:45:33 -070075 vector<char> raw_hash(kExpectedRawHash, kExpectedRawHashEnd);
Darin Petkov36a58222010-10-07 22:00:09 -070076 EXPECT_TRUE(raw_hash == calc_next.raw_hash());
Darin Petkov73058b42010-10-06 16:32:19 -070077}
78
Han Shen2643cb72012-06-26 14:45:33 -070079TEST_F(OmahaHashCalculatorTest, BigTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000080 OmahaHashCalculator calc;
81
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070082 int digit_count = 1;
83 int next_overflow = 10;
rspangler@google.com49fdf182009-10-10 00:57:34 +000084 for (int i = 0; i < 1000000; i++) {
85 char buf[8];
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070086 if (i == next_overflow) {
87 next_overflow *= 10;
88 digit_count++;
89 }
90 ASSERT_EQ(digit_count, snprintf(buf, sizeof(buf), "%d", i)) << " i = " << i;
rspangler@google.com49fdf182009-10-10 00:57:34 +000091 calc.Update(buf, strlen(buf));
92 }
93 calc.Finalize();
94
95 // Hash constant generated by running this on a linux shell:
96 // $ C=0
97 // $ while [ $C -lt 1000000 ]; do
98 // echo -n $C
99 // let C=C+1
Darin Petkovd22cb292010-09-29 10:02:29 -0700100 // done | openssl dgst -sha256 -binary | openssl base64
101 EXPECT_EQ("NZf8k6SPBkYMvhaX8YgzuMgbkLP1XZ+neM8K5wcSsf8=", calc.hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +0000102}
103
Han Shen2643cb72012-06-26 14:45:33 -0700104TEST_F(OmahaHashCalculatorTest, UpdateFileSimpleTest) {
Darin Petkov36a58222010-10-07 22:00:09 -0700105 string data_path;
106 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700107 utils::MakeTempFile("data.XXXXXX", &data_path, nullptr));
Darin Petkov36a58222010-10-07 22:00:09 -0700108 ScopedPathUnlinker data_path_unlinker(data_path);
109 ASSERT_TRUE(utils::WriteFile(data_path.c_str(), "hi", 2));
110
111 static const int kLengths[] = { -1, 2, 10 };
112 for (size_t i = 0; i < arraysize(kLengths); i++) {
113 OmahaHashCalculator calc;
114 EXPECT_EQ(2, calc.UpdateFile(data_path, kLengths[i]));
115 EXPECT_TRUE(calc.Finalize());
116 EXPECT_EQ(kExpectedHash, calc.hash());
Han Shen2643cb72012-06-26 14:45:33 -0700117 vector<char> raw_hash(kExpectedRawHash, kExpectedRawHashEnd);
Darin Petkov36a58222010-10-07 22:00:09 -0700118 EXPECT_TRUE(raw_hash == calc.raw_hash());
119 }
120
121 OmahaHashCalculator calc;
122 EXPECT_EQ(0, calc.UpdateFile(data_path, 0));
123 EXPECT_EQ(1, calc.UpdateFile(data_path, 1));
124 EXPECT_TRUE(calc.Finalize());
125 // echo -n h | openssl dgst -sha256 -binary | openssl base64
126 EXPECT_EQ("qqlAJmTxpB9A67xSyZk+tmrrNmYClY/fqig7ceZNsSM=", calc.hash());
127}
128
Han Shen2643cb72012-06-26 14:45:33 -0700129TEST_F(OmahaHashCalculatorTest, RawHashOfFileSimpleTest) {
Darin Petkov698d0412010-10-13 10:59:44 -0700130 string data_path;
131 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700132 utils::MakeTempFile("data.XXXXXX", &data_path, nullptr));
Darin Petkov698d0412010-10-13 10:59:44 -0700133 ScopedPathUnlinker data_path_unlinker(data_path);
134 ASSERT_TRUE(utils::WriteFile(data_path.c_str(), "hi", 2));
135
136 static const int kLengths[] = { -1, 2, 10 };
137 for (size_t i = 0; i < arraysize(kLengths); i++) {
Han Shen2643cb72012-06-26 14:45:33 -0700138 vector<char> exp_raw_hash(kExpectedRawHash, kExpectedRawHashEnd);
Darin Petkov698d0412010-10-13 10:59:44 -0700139 vector<char> raw_hash;
140 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