blob: 51478067fc57a1668ab677aa18af1ed6f08a634f [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
5#include <math.h>
6#include <unistd.h>
Darin Petkovd7061ab2010-10-06 14:37:09 -07007
Darin Petkov36a58222010-10-07 22:00:09 -07008#include <string>
Darin Petkovd7061ab2010-10-06 14:37:09 -07009#include <vector>
10
rspangler@google.com49fdf182009-10-10 00:57:34 +000011#include <glib.h>
12#include <gtest/gtest.h>
Darin Petkovd7061ab2010-10-06 14:37:09 -070013
rspangler@google.com49fdf182009-10-10 00:57:34 +000014#include "update_engine/libcurl_http_fetcher.h"
15#include "update_engine/omaha_hash_calculator.h"
Darin Petkov36a58222010-10-07 22:00:09 -070016#include "update_engine/utils.h"
rspangler@google.com49fdf182009-10-10 00:57:34 +000017
Darin Petkov36a58222010-10-07 22:00:09 -070018using std::string;
Darin Petkovd7061ab2010-10-06 14:37:09 -070019using std::vector;
20
rspangler@google.com49fdf182009-10-10 00:57:34 +000021namespace chromeos_update_engine {
22
Darin Petkovd7061ab2010-10-06 14:37:09 -070023// Generated by running this on a linux shell:
24// $ echo -n hi | openssl dgst -sha256 -binary | openssl base64
25static const char kExpectedHash[] =
26 "j0NDRmSPa5bfid2pAcUXaxCm2Dlh3TwayItZstwyeqQ=";
Han Shen2643cb72012-06-26 14:45:33 -070027static const unsigned char kRawExpectedRawHash[] = {
Darin Petkovd7061ab2010-10-06 14:37:09 -070028 0x8f, 0x43, 0x43, 0x46, 0x64, 0x8f, 0x6b, 0x96,
29 0xdf, 0x89, 0xdd, 0xa9, 0x01, 0xc5, 0x17, 0x6b,
30 0x10, 0xa6, 0xd8, 0x39, 0x61, 0xdd, 0x3c, 0x1a,
31 0xc8, 0x8b, 0x59, 0xb2, 0xdc, 0x32, 0x7a, 0xa4
32};
33
Han Shen2643cb72012-06-26 14:45:33 -070034class OmahaHashCalculatorTest : public ::testing::Test {
35public:
36 const char *kExpectedRawHash;
37 const char *kExpectedRawHashEnd;
38
39 OmahaHashCalculatorTest() :
40 kExpectedRawHash(reinterpret_cast<const char*>(kRawExpectedRawHash)),
41 kExpectedRawHashEnd(kExpectedRawHash + arraysize(kRawExpectedRawHash))
42 {}
43};
44
45TEST_F(OmahaHashCalculatorTest, SimpleTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000046 OmahaHashCalculator calc;
47 calc.Update("hi", 2);
48 calc.Finalize();
Darin Petkovd7061ab2010-10-06 14:37:09 -070049 EXPECT_EQ(kExpectedHash, calc.hash());
Han Shen2643cb72012-06-26 14:45:33 -070050 vector<char> raw_hash(kExpectedRawHash, kExpectedRawHashEnd);
Darin Petkovd7061ab2010-10-06 14:37:09 -070051 EXPECT_TRUE(raw_hash == calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000052}
53
Han Shen2643cb72012-06-26 14:45:33 -070054TEST_F(OmahaHashCalculatorTest, MultiUpdateTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000055 OmahaHashCalculator calc;
56 calc.Update("h", 1);
57 calc.Update("i", 1);
58 calc.Finalize();
Darin Petkovd7061ab2010-10-06 14:37:09 -070059 EXPECT_EQ(kExpectedHash, calc.hash());
Han Shen2643cb72012-06-26 14:45:33 -070060 vector<char> raw_hash(kExpectedRawHash, kExpectedRawHashEnd);
Darin Petkovd7061ab2010-10-06 14:37:09 -070061 EXPECT_TRUE(raw_hash == calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000062}
63
Han Shen2643cb72012-06-26 14:45:33 -070064TEST_F(OmahaHashCalculatorTest, ContextTest) {
Darin Petkov73058b42010-10-06 16:32:19 -070065 OmahaHashCalculator calc;
66 calc.Update("h", 1);
Darin Petkov36a58222010-10-07 22:00:09 -070067 string calc_context = calc.GetContext();
68 calc.Finalize();
Darin Petkov73058b42010-10-06 16:32:19 -070069 OmahaHashCalculator calc_next;
Darin Petkov36a58222010-10-07 22:00:09 -070070 calc_next.SetContext(calc_context);
Darin Petkov73058b42010-10-06 16:32:19 -070071 calc_next.Update("i", 1);
72 calc_next.Finalize();
Darin Petkov36a58222010-10-07 22:00:09 -070073 EXPECT_EQ(kExpectedHash, calc_next.hash());
Han Shen2643cb72012-06-26 14:45:33 -070074 vector<char> raw_hash(kExpectedRawHash, kExpectedRawHashEnd);
Darin Petkov36a58222010-10-07 22:00:09 -070075 EXPECT_TRUE(raw_hash == calc_next.raw_hash());
Darin Petkov73058b42010-10-06 16:32:19 -070076}
77
Han Shen2643cb72012-06-26 14:45:33 -070078TEST_F(OmahaHashCalculatorTest, BigTest) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000079 OmahaHashCalculator calc;
80
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070081 int digit_count = 1;
82 int next_overflow = 10;
rspangler@google.com49fdf182009-10-10 00:57:34 +000083 for (int i = 0; i < 1000000; i++) {
84 char buf[8];
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070085 if (i == next_overflow) {
86 next_overflow *= 10;
87 digit_count++;
88 }
89 ASSERT_EQ(digit_count, snprintf(buf, sizeof(buf), "%d", i)) << " i = " << i;
rspangler@google.com49fdf182009-10-10 00:57:34 +000090 calc.Update(buf, strlen(buf));
91 }
92 calc.Finalize();
93
94 // Hash constant generated by running this on a linux shell:
95 // $ C=0
96 // $ while [ $C -lt 1000000 ]; do
97 // echo -n $C
98 // let C=C+1
Darin Petkovd22cb292010-09-29 10:02:29 -070099 // done | openssl dgst -sha256 -binary | openssl base64
100 EXPECT_EQ("NZf8k6SPBkYMvhaX8YgzuMgbkLP1XZ+neM8K5wcSsf8=", calc.hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +0000101}
102
Han Shen2643cb72012-06-26 14:45:33 -0700103TEST_F(OmahaHashCalculatorTest, UpdateFileSimpleTest) {
Darin Petkov36a58222010-10-07 22:00:09 -0700104 string data_path;
105 ASSERT_TRUE(
106 utils::MakeTempFile("/tmp/data.XXXXXX", &data_path, NULL));
107 ScopedPathUnlinker data_path_unlinker(data_path);
108 ASSERT_TRUE(utils::WriteFile(data_path.c_str(), "hi", 2));
109
110 static const int kLengths[] = { -1, 2, 10 };
111 for (size_t i = 0; i < arraysize(kLengths); i++) {
112 OmahaHashCalculator calc;
113 EXPECT_EQ(2, calc.UpdateFile(data_path, kLengths[i]));
114 EXPECT_TRUE(calc.Finalize());
115 EXPECT_EQ(kExpectedHash, calc.hash());
Han Shen2643cb72012-06-26 14:45:33 -0700116 vector<char> raw_hash(kExpectedRawHash, kExpectedRawHashEnd);
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(
131 utils::MakeTempFile("/tmp/data.XXXXXX", &data_path, NULL));
132 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++) {
Han Shen2643cb72012-06-26 14:45:33 -0700137 vector<char> exp_raw_hash(kExpectedRawHash, kExpectedRawHashEnd);
Darin Petkov698d0412010-10-13 10:59:44 -0700138 vector<char> raw_hash;
139 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