blob: b6e03a4fc25cbdd0c0430e28b123fd9f1a6418f5 [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
23class OmahaHashCalculatorTest : public ::testing::Test { };
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=";
29static const char kExpectedRawHash[] = {
30 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
rspangler@google.com49fdf182009-10-10 00:57:34 +000036TEST(OmahaHashCalculatorTest, SimpleTest) {
37 OmahaHashCalculator calc;
38 calc.Update("hi", 2);
39 calc.Finalize();
Darin Petkovd7061ab2010-10-06 14:37:09 -070040 EXPECT_EQ(kExpectedHash, calc.hash());
41 vector<char> raw_hash(kExpectedRawHash,
42 kExpectedRawHash + arraysize(kExpectedRawHash));
43 EXPECT_TRUE(raw_hash == calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000044}
45
46TEST(OmahaHashCalculatorTest, MultiUpdateTest) {
47 OmahaHashCalculator calc;
48 calc.Update("h", 1);
49 calc.Update("i", 1);
50 calc.Finalize();
Darin Petkovd7061ab2010-10-06 14:37:09 -070051 EXPECT_EQ(kExpectedHash, calc.hash());
52 vector<char> raw_hash(kExpectedRawHash,
53 kExpectedRawHash + arraysize(kExpectedRawHash));
54 EXPECT_TRUE(raw_hash == calc.raw_hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000055}
56
Darin Petkov73058b42010-10-06 16:32:19 -070057TEST(OmahaHashCalculatorTest, ContextTest) {
58 OmahaHashCalculator calc;
59 calc.Update("h", 1);
Darin Petkov36a58222010-10-07 22:00:09 -070060 string calc_context = calc.GetContext();
61 calc.Finalize();
Darin Petkov73058b42010-10-06 16:32:19 -070062 OmahaHashCalculator calc_next;
Darin Petkov36a58222010-10-07 22:00:09 -070063 calc_next.SetContext(calc_context);
Darin Petkov73058b42010-10-06 16:32:19 -070064 calc_next.Update("i", 1);
65 calc_next.Finalize();
Darin Petkov36a58222010-10-07 22:00:09 -070066 EXPECT_EQ(kExpectedHash, calc_next.hash());
67 vector<char> raw_hash(kExpectedRawHash,
68 kExpectedRawHash + arraysize(kExpectedRawHash));
69 EXPECT_TRUE(raw_hash == calc_next.raw_hash());
Darin Petkov73058b42010-10-06 16:32:19 -070070}
71
rspangler@google.com49fdf182009-10-10 00:57:34 +000072TEST(OmahaHashCalculatorTest, BigTest) {
73 OmahaHashCalculator calc;
74
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070075 int digit_count = 1;
76 int next_overflow = 10;
rspangler@google.com49fdf182009-10-10 00:57:34 +000077 for (int i = 0; i < 1000000; i++) {
78 char buf[8];
Andrew de los Reyes21067cc2011-06-28 15:27:03 -070079 if (i == next_overflow) {
80 next_overflow *= 10;
81 digit_count++;
82 }
83 ASSERT_EQ(digit_count, snprintf(buf, sizeof(buf), "%d", i)) << " i = " << i;
rspangler@google.com49fdf182009-10-10 00:57:34 +000084 calc.Update(buf, strlen(buf));
85 }
86 calc.Finalize();
87
88 // Hash constant generated by running this on a linux shell:
89 // $ C=0
90 // $ while [ $C -lt 1000000 ]; do
91 // echo -n $C
92 // let C=C+1
Darin Petkovd22cb292010-09-29 10:02:29 -070093 // done | openssl dgst -sha256 -binary | openssl base64
94 EXPECT_EQ("NZf8k6SPBkYMvhaX8YgzuMgbkLP1XZ+neM8K5wcSsf8=", calc.hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000095}
96
Darin Petkov36a58222010-10-07 22:00:09 -070097TEST(OmahaHashCalculatorTest, UpdateFileSimpleTest) {
98 string data_path;
99 ASSERT_TRUE(
100 utils::MakeTempFile("/tmp/data.XXXXXX", &data_path, NULL));
101 ScopedPathUnlinker data_path_unlinker(data_path);
102 ASSERT_TRUE(utils::WriteFile(data_path.c_str(), "hi", 2));
103
104 static const int kLengths[] = { -1, 2, 10 };
105 for (size_t i = 0; i < arraysize(kLengths); i++) {
106 OmahaHashCalculator calc;
107 EXPECT_EQ(2, calc.UpdateFile(data_path, kLengths[i]));
108 EXPECT_TRUE(calc.Finalize());
109 EXPECT_EQ(kExpectedHash, calc.hash());
110 vector<char> raw_hash(kExpectedRawHash,
111 kExpectedRawHash + arraysize(kExpectedRawHash));
112 EXPECT_TRUE(raw_hash == calc.raw_hash());
113 }
114
115 OmahaHashCalculator calc;
116 EXPECT_EQ(0, calc.UpdateFile(data_path, 0));
117 EXPECT_EQ(1, calc.UpdateFile(data_path, 1));
118 EXPECT_TRUE(calc.Finalize());
119 // echo -n h | openssl dgst -sha256 -binary | openssl base64
120 EXPECT_EQ("qqlAJmTxpB9A67xSyZk+tmrrNmYClY/fqig7ceZNsSM=", calc.hash());
121}
122
Darin Petkov698d0412010-10-13 10:59:44 -0700123TEST(OmahaHashCalculatorTest, RawHashOfFileSimpleTest) {
124 string data_path;
125 ASSERT_TRUE(
126 utils::MakeTempFile("/tmp/data.XXXXXX", &data_path, NULL));
127 ScopedPathUnlinker data_path_unlinker(data_path);
128 ASSERT_TRUE(utils::WriteFile(data_path.c_str(), "hi", 2));
129
130 static const int kLengths[] = { -1, 2, 10 };
131 for (size_t i = 0; i < arraysize(kLengths); i++) {
132 vector<char> exp_raw_hash(kExpectedRawHash,
133 kExpectedRawHash + arraysize(kExpectedRawHash));
134 vector<char> raw_hash;
135 EXPECT_EQ(2, OmahaHashCalculator::RawHashOfFile(data_path,
136 kLengths[i],
137 &raw_hash));
138 EXPECT_TRUE(exp_raw_hash == raw_hash);
139 }
140}
141
Darin Petkov36a58222010-10-07 22:00:09 -0700142TEST(OmahaHashCalculatorTest, UpdateFileNonexistentTest) {
143 OmahaHashCalculator calc;
144 EXPECT_EQ(-1, calc.UpdateFile("/some/non-existent/file", -1));
145}
146
rspangler@google.com49fdf182009-10-10 00:57:34 +0000147TEST(OmahaHashCalculatorTest, AbortTest) {
148 // Just make sure we don't crash and valgrind doesn't detect memory leaks
149 {
150 OmahaHashCalculator calc;
151 }
152 {
153 OmahaHashCalculator calc;
154 calc.Update("h", 1);
155 }
156}
157
158} // namespace chromeos_update_engine