blob: 28dc0303113dc7c67092026306a6a7e12f81e1c8 [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
75 for (int i = 0; i < 1000000; i++) {
76 char buf[8];
77 ASSERT_EQ(0 == i ? 1 : static_cast<int>(floorf(logf(i) / logf(10))) + 1,
78 snprintf(buf, sizeof(buf), "%d", i)) << " i = " << i;
79 calc.Update(buf, strlen(buf));
80 }
81 calc.Finalize();
82
83 // Hash constant generated by running this on a linux shell:
84 // $ C=0
85 // $ while [ $C -lt 1000000 ]; do
86 // echo -n $C
87 // let C=C+1
Darin Petkovd22cb292010-09-29 10:02:29 -070088 // done | openssl dgst -sha256 -binary | openssl base64
89 EXPECT_EQ("NZf8k6SPBkYMvhaX8YgzuMgbkLP1XZ+neM8K5wcSsf8=", calc.hash());
rspangler@google.com49fdf182009-10-10 00:57:34 +000090}
91
Darin Petkov36a58222010-10-07 22:00:09 -070092TEST(OmahaHashCalculatorTest, UpdateFileSimpleTest) {
93 string data_path;
94 ASSERT_TRUE(
95 utils::MakeTempFile("/tmp/data.XXXXXX", &data_path, NULL));
96 ScopedPathUnlinker data_path_unlinker(data_path);
97 ASSERT_TRUE(utils::WriteFile(data_path.c_str(), "hi", 2));
98
99 static const int kLengths[] = { -1, 2, 10 };
100 for (size_t i = 0; i < arraysize(kLengths); i++) {
101 OmahaHashCalculator calc;
102 EXPECT_EQ(2, calc.UpdateFile(data_path, kLengths[i]));
103 EXPECT_TRUE(calc.Finalize());
104 EXPECT_EQ(kExpectedHash, calc.hash());
105 vector<char> raw_hash(kExpectedRawHash,
106 kExpectedRawHash + arraysize(kExpectedRawHash));
107 EXPECT_TRUE(raw_hash == calc.raw_hash());
108 }
109
110 OmahaHashCalculator calc;
111 EXPECT_EQ(0, calc.UpdateFile(data_path, 0));
112 EXPECT_EQ(1, calc.UpdateFile(data_path, 1));
113 EXPECT_TRUE(calc.Finalize());
114 // echo -n h | openssl dgst -sha256 -binary | openssl base64
115 EXPECT_EQ("qqlAJmTxpB9A67xSyZk+tmrrNmYClY/fqig7ceZNsSM=", calc.hash());
116}
117
Darin Petkov698d0412010-10-13 10:59:44 -0700118TEST(OmahaHashCalculatorTest, RawHashOfFileSimpleTest) {
119 string data_path;
120 ASSERT_TRUE(
121 utils::MakeTempFile("/tmp/data.XXXXXX", &data_path, NULL));
122 ScopedPathUnlinker data_path_unlinker(data_path);
123 ASSERT_TRUE(utils::WriteFile(data_path.c_str(), "hi", 2));
124
125 static const int kLengths[] = { -1, 2, 10 };
126 for (size_t i = 0; i < arraysize(kLengths); i++) {
127 vector<char> exp_raw_hash(kExpectedRawHash,
128 kExpectedRawHash + arraysize(kExpectedRawHash));
129 vector<char> raw_hash;
130 EXPECT_EQ(2, OmahaHashCalculator::RawHashOfFile(data_path,
131 kLengths[i],
132 &raw_hash));
133 EXPECT_TRUE(exp_raw_hash == raw_hash);
134 }
135}
136
Darin Petkov36a58222010-10-07 22:00:09 -0700137TEST(OmahaHashCalculatorTest, UpdateFileNonexistentTest) {
138 OmahaHashCalculator calc;
139 EXPECT_EQ(-1, calc.UpdateFile("/some/non-existent/file", -1));
140}
141
rspangler@google.com49fdf182009-10-10 00:57:34 +0000142TEST(OmahaHashCalculatorTest, AbortTest) {
143 // Just make sure we don't crash and valgrind doesn't detect memory leaks
144 {
145 OmahaHashCalculator calc;
146 }
147 {
148 OmahaHashCalculator calc;
149 calc.Update("h", 1);
150 }
151}
152
153} // namespace chromeos_update_engine