blob: e3133f9e09215bef158d7ac863b3b6e77798be89 [file] [log] [blame]
Mike Frysinger8155d082012-04-06 15:23:18 -04001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
adlr@google.com3defe6a2009-12-04 20:57:17 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Alex Deymo2c0db7b2014-11-04 12:23:39 -08005#include "update_engine/utils.h"
6
Alex Vakulenko44cab302014-07-23 13:12:15 -07007#include <errno.h>
Ben Chan9abb7632014-08-07 00:10:53 -07008#include <stdint.h>
adlr@google.com3defe6a2009-12-04 20:57:17 +00009#include <sys/stat.h>
10#include <sys/types.h>
Darin Petkov5c0a8af2010-08-24 13:39:13 -070011
Andrew de los Reyescc92cd32010-10-05 16:56:14 -070012#include <map>
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080013#include <string>
adlr@google.com3defe6a2009-12-04 20:57:17 +000014#include <vector>
Darin Petkov5c0a8af2010-08-24 13:39:13 -070015
Alex Deymoc1711e22014-08-08 13:16:23 -070016#include <base/files/file_path.h>
Alex Deymo2c0db7b2014-11-04 12:23:39 -080017#include <base/files/file_util.h>
Alex Vakulenko75039d72014-03-25 12:36:28 -070018#include <base/strings/string_util.h>
19#include <base/strings/stringprintf.h>
Darin Petkovd3f8c892010-10-12 21:38:45 -070020#include <gtest/gtest.h>
21
David Zeuthen33bae492014-02-25 16:16:18 -080022#include "update_engine/fake_clock.h"
Alex Deymo2c0db7b2014-11-04 12:23:39 -080023#include "update_engine/fake_prefs.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070024#include "update_engine/fake_system_state.h"
David Zeuthen33bae492014-02-25 16:16:18 -080025#include "update_engine/prefs.h"
Darin Petkovd3f8c892010-10-12 21:38:45 -070026#include "update_engine/test_utils.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000027
Andrew de los Reyescc92cd32010-10-05 16:56:14 -070028using std::map;
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080029using std::string;
adlr@google.com3defe6a2009-12-04 20:57:17 +000030using std::vector;
31
32namespace chromeos_update_engine {
33
34class UtilsTest : public ::testing::Test { };
35
Chris Sosac1972482013-04-30 22:31:10 -070036TEST(UtilsTest, CanParseECVersion) {
Chris Sosac1972482013-04-30 22:31:10 -070037 // Should be able to parse and valid key value line.
J. Richard Barnette63137e52013-10-28 10:57:29 -070038 EXPECT_EQ("12345", utils::ParseECVersion("fw_version=12345"));
39 EXPECT_EQ("123456", utils::ParseECVersion(
40 "b=1231a fw_version=123456 a=fasd2"));
41 EXPECT_EQ("12345", utils::ParseECVersion("fw_version=12345"));
42 EXPECT_EQ("00VFA616", utils::ParseECVersion(
Chris Sosac1972482013-04-30 22:31:10 -070043 "vendor=\"sam\" fw_version=\"00VFA616\""));
44
45 // For invalid entries, should return the empty string.
J. Richard Barnette63137e52013-10-28 10:57:29 -070046 EXPECT_EQ("", utils::ParseECVersion("b=1231a fw_version a=fasd2"));
Chris Sosac1972482013-04-30 22:31:10 -070047}
48
J. Richard Barnette30842932013-10-28 15:04:23 -070049
50TEST(UtilsTest, KernelDeviceOfBootDevice) {
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -070051 EXPECT_EQ("", utils::KernelDeviceOfBootDevice(""));
J. Richard Barnette30842932013-10-28 15:04:23 -070052 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("foo"));
53 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda0"));
54 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda1"));
55 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda2"));
56 EXPECT_EQ("/dev/sda2", utils::KernelDeviceOfBootDevice("/dev/sda3"));
57 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda4"));
58 EXPECT_EQ("/dev/sda4", utils::KernelDeviceOfBootDevice("/dev/sda5"));
59 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda6"));
60 EXPECT_EQ("/dev/sda6", utils::KernelDeviceOfBootDevice("/dev/sda7"));
61 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda8"));
62 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda9"));
63
64 EXPECT_EQ("/dev/mmcblk0p2",
65 utils::KernelDeviceOfBootDevice("/dev/mmcblk0p3"));
66 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/mmcblk0p4"));
67
68 EXPECT_EQ("/dev/ubi2", utils::KernelDeviceOfBootDevice("/dev/ubi3"));
69 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/ubi4"));
70
71 EXPECT_EQ("/dev/mtdblock2",
72 utils::KernelDeviceOfBootDevice("/dev/ubiblock3_0"));
73 EXPECT_EQ("/dev/mtdblock4",
74 utils::KernelDeviceOfBootDevice("/dev/ubiblock5_0"));
75 EXPECT_EQ("/dev/mtdblock6",
76 utils::KernelDeviceOfBootDevice("/dev/ubiblock7_0"));
77 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/ubiblock4_0"));
78}
79
80
adlr@google.com3defe6a2009-12-04 20:57:17 +000081TEST(UtilsTest, NormalizePathTest) {
82 EXPECT_EQ("", utils::NormalizePath("", false));
83 EXPECT_EQ("", utils::NormalizePath("", true));
84 EXPECT_EQ("/", utils::NormalizePath("/", false));
85 EXPECT_EQ("", utils::NormalizePath("/", true));
86 EXPECT_EQ("/", utils::NormalizePath("//", false));
87 EXPECT_EQ("", utils::NormalizePath("//", true));
88 EXPECT_EQ("foo", utils::NormalizePath("foo", false));
89 EXPECT_EQ("foo", utils::NormalizePath("foo", true));
90 EXPECT_EQ("/foo/", utils::NormalizePath("/foo//", false));
91 EXPECT_EQ("/foo", utils::NormalizePath("/foo//", true));
92 EXPECT_EQ("bar/baz/foo/adlr", utils::NormalizePath("bar/baz//foo/adlr",
93 false));
94 EXPECT_EQ("bar/baz/foo/adlr", utils::NormalizePath("bar/baz//foo/adlr",
95 true));
96 EXPECT_EQ("/bar/baz/foo/adlr/", utils::NormalizePath("/bar/baz//foo/adlr/",
97 false));
98 EXPECT_EQ("/bar/baz/foo/adlr", utils::NormalizePath("/bar/baz//foo/adlr/",
99 true));
100 EXPECT_EQ("\\\\", utils::NormalizePath("\\\\", false));
101 EXPECT_EQ("\\\\", utils::NormalizePath("\\\\", true));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700102 EXPECT_EQ("\\:/;$PATH\n\\",
103 utils::NormalizePath("\\://;$PATH\n\\", false));
104 EXPECT_EQ("\\:/;$PATH\n\\",
105 utils::NormalizePath("\\://;$PATH\n\\", true));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000106 EXPECT_EQ("/spaces s/ ok/s / / /",
107 utils::NormalizePath("/spaces s/ ok/s / / /", false));
108 EXPECT_EQ("/spaces s/ ok/s / / ",
109 utils::NormalizePath("/spaces s/ ok/s / / /", true));
110}
111
112TEST(UtilsTest, ReadFileFailure) {
113 vector<char> empty;
114 EXPECT_FALSE(utils::ReadFile("/this/doesn't/exist", &empty));
115}
116
Darin Petkov8e447e02013-04-16 16:23:50 +0200117TEST(UtilsTest, ReadFileChunk) {
Alex Vakulenko75039d72014-03-25 12:36:28 -0700118 base::FilePath file;
119 EXPECT_TRUE(base::CreateTemporaryFile(&file));
Darin Petkov8e447e02013-04-16 16:23:50 +0200120 ScopedPathUnlinker unlinker(file.value());
121 vector<char> data;
122 const size_t kSize = 1024 * 1024;
123 for (size_t i = 0; i < kSize; i++) {
124 data.push_back(i % 255);
125 }
126 EXPECT_TRUE(utils::WriteFile(file.value().c_str(), &data[0], data.size()));
127 vector<char> in_data;
128 EXPECT_TRUE(utils::ReadFileChunk(file.value().c_str(), kSize, 10, &in_data));
129 EXPECT_TRUE(in_data.empty());
130 EXPECT_TRUE(utils::ReadFileChunk(file.value().c_str(), 0, -1, &in_data));
131 EXPECT_TRUE(data == in_data);
132 in_data.clear();
133 EXPECT_TRUE(utils::ReadFileChunk(file.value().c_str(), 10, 20, &in_data));
134 EXPECT_TRUE(vector<char>(data.begin() + 10, data.begin() + 10 + 20) ==
135 in_data);
136}
137
adlr@google.com3defe6a2009-12-04 20:57:17 +0000138TEST(UtilsTest, ErrnoNumberAsStringTest) {
139 EXPECT_EQ("No such file or directory", utils::ErrnoNumberAsString(ENOENT));
140}
141
142TEST(UtilsTest, StringHasSuffixTest) {
143 EXPECT_TRUE(utils::StringHasSuffix("foo", "foo"));
144 EXPECT_TRUE(utils::StringHasSuffix("foo", "o"));
145 EXPECT_TRUE(utils::StringHasSuffix("", ""));
146 EXPECT_TRUE(utils::StringHasSuffix("abcabc", "abc"));
147 EXPECT_TRUE(utils::StringHasSuffix("adlrwashere", "ere"));
148 EXPECT_TRUE(utils::StringHasSuffix("abcdefgh", "gh"));
149 EXPECT_TRUE(utils::StringHasSuffix("abcdefgh", ""));
150 EXPECT_FALSE(utils::StringHasSuffix("foo", "afoo"));
151 EXPECT_FALSE(utils::StringHasSuffix("", "x"));
152 EXPECT_FALSE(utils::StringHasSuffix("abcdefgh", "fg"));
153 EXPECT_FALSE(utils::StringHasSuffix("abcdefgh", "ab"));
154}
155
156TEST(UtilsTest, StringHasPrefixTest) {
157 EXPECT_TRUE(utils::StringHasPrefix("foo", "foo"));
158 EXPECT_TRUE(utils::StringHasPrefix("foo", "f"));
159 EXPECT_TRUE(utils::StringHasPrefix("", ""));
160 EXPECT_TRUE(utils::StringHasPrefix("abcabc", "abc"));
161 EXPECT_TRUE(utils::StringHasPrefix("adlrwashere", "adl"));
162 EXPECT_TRUE(utils::StringHasPrefix("abcdefgh", "ab"));
163 EXPECT_TRUE(utils::StringHasPrefix("abcdefgh", ""));
164 EXPECT_FALSE(utils::StringHasPrefix("foo", "fooa"));
165 EXPECT_FALSE(utils::StringHasPrefix("", "x"));
166 EXPECT_FALSE(utils::StringHasPrefix("abcdefgh", "bc"));
167 EXPECT_FALSE(utils::StringHasPrefix("abcdefgh", "gh"));
168}
169
adlr@google.com3defe6a2009-12-04 20:57:17 +0000170TEST(UtilsTest, RecursiveUnlinkDirTest) {
Gilad Arnoldb4346a22013-07-16 06:44:45 -0700171 string first_dir_name;
172 ASSERT_TRUE(utils::MakeTempDirectory("RecursiveUnlinkDirTest-a-XXXXXX",
173 &first_dir_name));
174 ASSERT_EQ(0, Chmod(first_dir_name, 0755));
175 string second_dir_name;
176 ASSERT_TRUE(utils::MakeTempDirectory("RecursiveUnlinkDirTest-b-XXXXXX",
177 &second_dir_name));
178 ASSERT_EQ(0, Chmod(second_dir_name, 0755));
179
180 EXPECT_EQ(0, Symlink(string("../") + first_dir_name,
181 second_dir_name + "/link"));
182 EXPECT_EQ(0, System(string("echo hi > ") + second_dir_name + "/file"));
183 EXPECT_EQ(0, Mkdir(second_dir_name + "/dir", 0755));
184 EXPECT_EQ(0, System(string("echo ok > ") + second_dir_name + "/dir/subfile"));
185 EXPECT_TRUE(utils::RecursiveUnlinkDir(second_dir_name));
186 EXPECT_TRUE(utils::FileExists(first_dir_name.c_str()));
187 EXPECT_EQ(0, System(string("rm -rf ") + first_dir_name));
188 EXPECT_FALSE(utils::FileExists(second_dir_name.c_str()));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000189 EXPECT_TRUE(utils::RecursiveUnlinkDir("/something/that/doesnt/exist"));
190}
191
Darin Petkov002b2fe2010-11-22 13:53:22 -0800192TEST(UtilsTest, IsSymlinkTest) {
193 string temp_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800194 EXPECT_TRUE(utils::MakeTempDirectory("symlink-test.XXXXXX", &temp_dir));
Alex Deymo8d925292014-05-21 19:15:25 -0700195 string temp_file = temp_dir + "/temp-file";
Darin Petkov002b2fe2010-11-22 13:53:22 -0800196 EXPECT_TRUE(utils::WriteFile(temp_file.c_str(), "", 0));
Alex Deymo8d925292014-05-21 19:15:25 -0700197 string temp_symlink = temp_dir + "/temp-symlink";
Darin Petkov002b2fe2010-11-22 13:53:22 -0800198 EXPECT_EQ(0, symlink(temp_file.c_str(), temp_symlink.c_str()));
199 EXPECT_FALSE(utils::IsSymlink(temp_dir.c_str()));
200 EXPECT_FALSE(utils::IsSymlink(temp_file.c_str()));
201 EXPECT_TRUE(utils::IsSymlink(temp_symlink.c_str()));
202 EXPECT_FALSE(utils::IsSymlink("/non/existent/path"));
203 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
204}
205
Alex Deymo7dc4c502014-05-20 20:09:58 -0700206TEST(UtilsTest, IsDirTest) {
207 string temp_dir;
208 EXPECT_TRUE(utils::MakeTempDirectory("isdir-test.XXXXXX", &temp_dir));
Alex Deymo8d925292014-05-21 19:15:25 -0700209 string temp_file = temp_dir + "/temp-file";
Alex Deymo7dc4c502014-05-20 20:09:58 -0700210 EXPECT_TRUE(utils::WriteFile(temp_file.c_str(), "", 0));
Alex Deymo8d925292014-05-21 19:15:25 -0700211 string temp_symlink = temp_dir + "/temp-symlink";
Alex Deymo7dc4c502014-05-20 20:09:58 -0700212 EXPECT_EQ(0, symlink(temp_dir.c_str(), temp_symlink.c_str()));
213 EXPECT_TRUE(utils::IsDir(temp_dir.c_str()));
214 EXPECT_FALSE(utils::IsDir(temp_file.c_str()));
215 EXPECT_FALSE(utils::IsDir(temp_symlink.c_str()));
216 EXPECT_FALSE(utils::IsDir("/non/existent/path"));
217 ASSERT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
218}
219
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800220TEST(UtilsTest, GetDiskNameTest) {
221 EXPECT_EQ("/dev/sda", utils::GetDiskName("/dev/sda3"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700222 EXPECT_EQ("/dev/sdp", utils::GetDiskName("/dev/sdp1234"));
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800223 EXPECT_EQ("/dev/mmcblk0", utils::GetDiskName("/dev/mmcblk0p3"));
224 EXPECT_EQ("", utils::GetDiskName("/dev/mmcblk0p"));
225 EXPECT_EQ("", utils::GetDiskName("/dev/sda"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700226 EXPECT_EQ("/dev/ubiblock", utils::GetDiskName("/dev/ubiblock3_2"));
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800227 EXPECT_EQ("", utils::GetDiskName("/dev/foo/bar"));
228 EXPECT_EQ("", utils::GetDiskName("/"));
229 EXPECT_EQ("", utils::GetDiskName(""));
Darin Petkovf74eb652010-08-04 12:08:38 -0700230}
231
232TEST(UtilsTest, SysfsBlockDeviceTest) {
233 EXPECT_EQ("/sys/block/sda", utils::SysfsBlockDevice("/dev/sda"));
234 EXPECT_EQ("", utils::SysfsBlockDevice("/foo/sda"));
235 EXPECT_EQ("", utils::SysfsBlockDevice("/dev/foo/bar"));
236 EXPECT_EQ("", utils::SysfsBlockDevice("/"));
237 EXPECT_EQ("", utils::SysfsBlockDevice("./"));
238 EXPECT_EQ("", utils::SysfsBlockDevice(""));
239}
240
241TEST(UtilsTest, IsRemovableDeviceTest) {
242 EXPECT_FALSE(utils::IsRemovableDevice(""));
243 EXPECT_FALSE(utils::IsRemovableDevice("/dev/non-existent-device"));
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700244}
245
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800246TEST(UtilsTest, GetPartitionNumberTest) {
247 EXPECT_EQ(3, utils::GetPartitionNumber("/dev/sda3"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700248 EXPECT_EQ(3, utils::GetPartitionNumber("/dev/sdz3"));
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800249 EXPECT_EQ(123, utils::GetPartitionNumber("/dev/sda123"));
250 EXPECT_EQ(2, utils::GetPartitionNumber("/dev/mmcblk0p2"));
251 EXPECT_EQ(0, utils::GetPartitionNumber("/dev/mmcblk0p"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700252 EXPECT_EQ(3, utils::GetPartitionNumber("/dev/ubiblock3_2"));
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800253 EXPECT_EQ(0, utils::GetPartitionNumber(""));
254 EXPECT_EQ(0, utils::GetPartitionNumber("/"));
255 EXPECT_EQ(0, utils::GetPartitionNumber("/dev/"));
256 EXPECT_EQ(0, utils::GetPartitionNumber("/dev/sda"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700257 EXPECT_EQ(10, utils::GetPartitionNumber("/dev/loop10"));
258 EXPECT_EQ(11, utils::GetPartitionNumber("/dev/loop28p11"));
259 EXPECT_EQ(10, utils::GetPartitionNumber("/dev/loop10_0"));
260 EXPECT_EQ(11, utils::GetPartitionNumber("/dev/loop28p11_0"));
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700261}
262
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700263TEST(UtilsTest, MakePartitionNameTest) {
264 EXPECT_EQ("/dev/sda4", utils::MakePartitionName("/dev/sda", 4));
265 EXPECT_EQ("/dev/sda123", utils::MakePartitionName("/dev/sda", 123));
266 EXPECT_EQ("/dev/mmcblk2", utils::MakePartitionName("/dev/mmcblk", 2));
267 EXPECT_EQ("/dev/mmcblk0p2", utils::MakePartitionName("/dev/mmcblk0", 2));
268 EXPECT_EQ("/dev/loop8", utils::MakePartitionName("/dev/loop", 8));
269 EXPECT_EQ("/dev/loop12p2", utils::MakePartitionName("/dev/loop12", 2));
270 EXPECT_EQ("/dev/ubiblock3_0", utils::MakePartitionName("/dev/ubiblock", 3));
271}
272
273
Chris Sosa4f8ee272012-11-30 13:01:54 -0800274TEST(UtilsTest, CompareCpuSharesTest) {
275 EXPECT_LT(utils::CompareCpuShares(utils::kCpuSharesLow,
276 utils::kCpuSharesNormal), 0);
277 EXPECT_GT(utils::CompareCpuShares(utils::kCpuSharesNormal,
278 utils::kCpuSharesLow), 0);
279 EXPECT_EQ(utils::CompareCpuShares(utils::kCpuSharesNormal,
280 utils::kCpuSharesNormal), 0);
281 EXPECT_GT(utils::CompareCpuShares(utils::kCpuSharesHigh,
282 utils::kCpuSharesNormal), 0);
Darin Petkovc6c135c2010-08-11 13:36:18 -0700283}
284
Darin Petkov5c0a8af2010-08-24 13:39:13 -0700285TEST(UtilsTest, FuzzIntTest) {
286 static const unsigned int kRanges[] = { 0, 1, 2, 20 };
287 for (size_t r = 0; r < arraysize(kRanges); ++r) {
288 unsigned int range = kRanges[r];
289 const int kValue = 50;
290 for (int tries = 0; tries < 100; ++tries) {
291 int value = utils::FuzzInt(kValue, range);
292 EXPECT_GE(value, kValue - range / 2);
293 EXPECT_LE(value, kValue + range - range / 2);
294 }
295 }
296}
297
Andrew de los Reyescc92cd32010-10-05 16:56:14 -0700298TEST(UtilsTest, ApplyMapTest) {
299 int initial_values[] = {1, 2, 3, 4, 6};
300 vector<int> collection(&initial_values[0],
301 initial_values + arraysize(initial_values));
302 EXPECT_EQ(arraysize(initial_values), collection.size());
303 int expected_values[] = {1, 2, 5, 4, 8};
304 map<int, int> value_map;
305 value_map[3] = 5;
306 value_map[6] = 8;
307 value_map[5] = 10;
308
309 utils::ApplyMap(&collection, value_map);
310
311 size_t index = 0;
Alex Deymo020600d2014-11-05 21:05:55 -0800312 for (const int value : collection) {
313 EXPECT_EQ(expected_values[index++], value);
Andrew de los Reyescc92cd32010-10-05 16:56:14 -0700314 }
315}
316
Darin Petkovd3f8c892010-10-12 21:38:45 -0700317TEST(UtilsTest, RunAsRootGetFilesystemSizeTest) {
318 string img;
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700319 EXPECT_TRUE(utils::MakeTempFile("img.XXXXXX", &img, nullptr));
Darin Petkovd3f8c892010-10-12 21:38:45 -0700320 ScopedPathUnlinker img_unlinker(img);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700321 CreateExtImageAtPath(img, nullptr);
Darin Petkovd3f8c892010-10-12 21:38:45 -0700322 // Extend the "partition" holding the file system from 10MiB to 20MiB.
323 EXPECT_EQ(0, System(base::StringPrintf(
324 "dd if=/dev/zero of=%s seek=20971519 bs=1 count=1",
325 img.c_str())));
326 EXPECT_EQ(20 * 1024 * 1024, utils::FileSize(img));
327 int block_count = 0;
328 int block_size = 0;
329 EXPECT_TRUE(utils::GetFilesystemSize(img, &block_count, &block_size));
330 EXPECT_EQ(4096, block_size);
331 EXPECT_EQ(10 * 1024 * 1024 / 4096, block_count);
332}
333
Alex Deymo192393b2014-11-10 15:58:38 -0800334// Squashfs example filesystem, generated with:
335// echo hola>hola
336// mksquashfs hola hola.sqfs -noappend -nopad
337// hexdump hola.sqfs -e '16/1 "%02x, " "\n"'
338const unsigned char kSquashfsFile[] = {
339 0x68, 0x73, 0x71, 0x73, 0x02, 0x00, 0x00, 0x00, // magic, inodes
340 0x3e, 0x49, 0x61, 0x54, 0x00, 0x00, 0x02, 0x00,
341 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00,
342 0xc0, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, // flags, noids, major, minor
343 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // root_inode
344 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // bytes_used
345 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
347 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x68, 0x6f, 0x6c, 0x61, 0x0a, 0x2c, 0x00, 0x78,
352 0xda, 0x63, 0x62, 0x58, 0xc2, 0xc8, 0xc0, 0xc0,
353 0xc8, 0xd0, 0x6b, 0x91, 0x18, 0x02, 0x64, 0xa0,
354 0x00, 0x56, 0x06, 0x90, 0xcc, 0x7f, 0xb0, 0xbc,
355 0x9d, 0x67, 0x62, 0x08, 0x13, 0x54, 0x1c, 0x44,
356 0x4b, 0x03, 0x31, 0x33, 0x10, 0x03, 0x00, 0xb5,
357 0x87, 0x04, 0x89, 0x16, 0x00, 0x78, 0xda, 0x63,
358 0x60, 0x80, 0x00, 0x46, 0x28, 0xcd, 0xc4, 0xc0,
359 0xcc, 0x90, 0x91, 0x9f, 0x93, 0x08, 0x00, 0x04,
360 0x70, 0x01, 0xab, 0x10, 0x80, 0x60, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
362 0x01, 0x00, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x78,
364 0xda, 0x63, 0x60, 0x80, 0x00, 0x05, 0x28, 0x0d,
365 0x00, 0x01, 0x10, 0x00, 0x21, 0xc5, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x99,
367 0xcd, 0x02, 0x00, 0x88, 0x13, 0x00, 0x00, 0xdd,
368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
369};
370
371TEST(UtilsTest, GetSquashfs4Size) {
372 unsigned char buffer[sizeof(kSquashfsFile)];
373 memcpy(buffer, kSquashfsFile, sizeof(kSquashfsFile));
374
375 int block_count = -1;
376 int block_size = -1;
377 // Not enough bytes passed.
378 EXPECT_FALSE(utils::GetSquashfs4Size(buffer, 10, nullptr, nullptr));
379
380 // The whole file system is passed, which is enough for parsing.
381 EXPECT_TRUE(utils::GetSquashfs4Size(buffer, sizeof(kSquashfsFile),
382 &block_count, &block_size));
383 EXPECT_EQ(4096, block_size);
384 EXPECT_EQ(1, block_count);
385
386 // Modify the major version to 5.
387 uint16_t* s_major = reinterpret_cast<uint16_t*>(buffer + 0x1c);
388 *s_major = 5;
389 EXPECT_FALSE(utils::GetSquashfs4Size(buffer, 10, nullptr, nullptr));
390 memcpy(buffer, kSquashfsFile, sizeof(kSquashfsFile));
391
392 // Modify the bytes_used to have 6 blocks.
393 int64_t* bytes_used = reinterpret_cast<int64_t*>(buffer + 0x28);
394 *bytes_used = 4096 * 5 + 1; // 6 "blocks".
395 EXPECT_TRUE(utils::GetSquashfs4Size(buffer, sizeof(kSquashfsFile),
396 &block_count, &block_size));
397 EXPECT_EQ(4096, block_size);
398 EXPECT_EQ(6, block_count);
399}
400
Chris Sosad317e402013-06-12 13:47:09 -0700401TEST(UtilsTest, GetInstallDevTest) {
402 string boot_dev = "/dev/sda5";
403 string install_dev;
404 EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev));
405 EXPECT_EQ(install_dev, "/dev/sda3");
406
407 boot_dev = "/dev/sda3";
408 EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev));
409 EXPECT_EQ(install_dev, "/dev/sda5");
410
411 boot_dev = "/dev/sda12";
412 EXPECT_FALSE(utils::GetInstallDev(boot_dev, &install_dev));
Liam McLoughlin049d1652013-07-31 18:47:46 -0700413
414 boot_dev = "/dev/ubiblock3_0";
415 EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev));
416 EXPECT_EQ(install_dev, "/dev/ubiblock5_0");
417
418 boot_dev = "/dev/ubiblock5_0";
419 EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev));
420 EXPECT_EQ(install_dev, "/dev/ubiblock3_0");
421
422 boot_dev = "/dev/ubiblock12_0";
423 EXPECT_FALSE(utils::GetInstallDev(boot_dev, &install_dev));
Chris Sosad317e402013-06-12 13:47:09 -0700424}
425
Andrew de los Reyes712b3ac2011-01-07 13:47:52 -0800426namespace {
Alex Deymo032e7722014-03-25 17:53:56 -0700427void GetFileFormatTester(const string& expected,
Ben Chan9abb7632014-08-07 00:10:53 -0700428 const vector<uint8_t>& contents) {
Alex Deymo032e7722014-03-25 17:53:56 -0700429 ScopedTempFile file;
430 ASSERT_TRUE(utils::WriteFile(file.GetPath().c_str(),
431 reinterpret_cast<const char*>(contents.data()),
432 contents.size()));
433 EXPECT_EQ(expected, utils::GetFileFormat(file.GetPath()));
434}
435}
436
437TEST(UtilsTest, GetFileFormatTest) {
438 EXPECT_EQ("File not found.", utils::GetFileFormat("/path/to/nowhere"));
Ben Chan9abb7632014-08-07 00:10:53 -0700439 GetFileFormatTester("data", vector<uint8_t>{1, 2, 3, 4, 5, 6, 7, 8});
440 GetFileFormatTester("ELF", vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46});
Alex Deymo032e7722014-03-25 17:53:56 -0700441
442 // Real tests from cros_installer on different boards.
443 // ELF 32-bit LSB executable, Intel 80386
444 GetFileFormatTester(
445 "ELF 32-bit little-endian x86",
Ben Chan9abb7632014-08-07 00:10:53 -0700446 vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00,
447 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
448 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00,
449 0x90, 0x83, 0x04, 0x08, 0x34, 0x00, 0x00, 0x00});
Alex Deymo032e7722014-03-25 17:53:56 -0700450
Alex Deymoc1711e22014-08-08 13:16:23 -0700451 // ELF 32-bit LSB executable, MIPS
452 GetFileFormatTester(
453 "ELF 32-bit little-endian mips",
454 vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00,
455 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
456 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
457 0xc0, 0x12, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00});
458
Alex Deymo032e7722014-03-25 17:53:56 -0700459 // ELF 32-bit LSB executable, ARM
460 GetFileFormatTester(
461 "ELF 32-bit little-endian arm",
Ben Chan9abb7632014-08-07 00:10:53 -0700462 vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00,
463 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
464 0x02, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00,
465 0x85, 0x8b, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00});
Alex Deymo032e7722014-03-25 17:53:56 -0700466
467 // ELF 64-bit LSB executable, x86-64
468 GetFileFormatTester(
469 "ELF 64-bit little-endian x86-64",
Ben Chan9abb7632014-08-07 00:10:53 -0700470 vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46, 0x02, 0x01, 0x01, 0x00,
471 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
472 0x02, 0x00, 0x3e, 0x00, 0x01, 0x00, 0x00, 0x00,
473 0xb0, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00});
Alex Deymo032e7722014-03-25 17:53:56 -0700474}
475
476namespace {
Andrew de los Reyes712b3ac2011-01-07 13:47:52 -0800477gboolean TerminateScheduleCrashReporterUploadTest(void* arg) {
478 GMainLoop* loop = reinterpret_cast<GMainLoop*>(arg);
479 g_main_loop_quit(loop);
480 return FALSE; // Don't call this callback again
481}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700482} // namespace
Andrew de los Reyes712b3ac2011-01-07 13:47:52 -0800483
484TEST(UtilsTest, ScheduleCrashReporterUploadTest) {
485 // Not much to test. At least this tests for memory leaks, crashes,
486 // log errors.
487 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
488 utils::ScheduleCrashReporterUpload();
489 g_timeout_add_seconds(1, &TerminateScheduleCrashReporterUploadTest, loop);
490 g_main_loop_run(loop);
491 g_main_loop_unref(loop);
492}
493
David Zeuthen674c3182013-04-18 14:05:20 -0700494TEST(UtilsTest, FormatTimeDeltaTest) {
495 // utils::FormatTimeDelta() is not locale-aware (it's only used for logging
496 // which is not localized) so we only need to test the C locale
497 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromMilliseconds(100)),
498 "0.1s");
499 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(0)),
500 "0s");
501 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(1)),
502 "1s");
503 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(59)),
504 "59s");
505 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(60)),
506 "1m0s");
507 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(61)),
508 "1m1s");
509 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(90)),
510 "1m30s");
511 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(1205)),
512 "20m5s");
513 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(3600)),
514 "1h0m0s");
515 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(3601)),
516 "1h0m1s");
517 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(3661)),
518 "1h1m1s");
519 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(7261)),
520 "2h1m1s");
521 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(86400)),
522 "1d0h0m0s");
523 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(86401)),
524 "1d0h0m1s");
525 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(200000)),
526 "2d7h33m20s");
527 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(200000) +
528 base::TimeDelta::FromMilliseconds(1)),
529 "2d7h33m20.001s");
David Zeuthen973449e2014-08-18 16:18:23 -0400530 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(-1)),
531 "-1s");
David Zeuthen674c3182013-04-18 14:05:20 -0700532}
533
David Zeuthen27a48bc2013-08-06 12:06:29 -0700534TEST(UtilsTest, TimeFromStructTimespecTest) {
535 struct timespec ts;
536
537 // Unix epoch (Thursday 00:00:00 UTC on Jan 1, 1970)
538 ts = (struct timespec) {.tv_sec = 0, .tv_nsec = 0};
539 EXPECT_EQ(base::Time::UnixEpoch(), utils::TimeFromStructTimespec(&ts));
540
541 // 42 ms after the Unix billennium (Sunday 01:46:40 UTC on September 9, 2001)
542 ts = (struct timespec) {.tv_sec = 1000 * 1000 * 1000,
543 .tv_nsec = 42 * 1000 * 1000};
544 base::Time::Exploded exploded = (base::Time::Exploded) {
545 .year = 2001, .month = 9, .day_of_week = 0, .day_of_month = 9,
546 .hour = 1, .minute = 46, .second = 40, .millisecond = 42};
547 EXPECT_EQ(base::Time::FromUTCExploded(exploded),
548 utils::TimeFromStructTimespec(&ts));
549}
550
David Zeuthene7f89172013-10-31 10:21:04 -0700551TEST(UtilsTest, DecodeAndStoreBase64String) {
552 base::FilePath path;
553
554 // Ensure we return false on empty strings or invalid base64.
555 EXPECT_FALSE(utils::DecodeAndStoreBase64String("", &path));
556 EXPECT_FALSE(utils::DecodeAndStoreBase64String("not valid base64", &path));
557
558 // Pass known base64 and check that it matches. This string was generated
559 // the following way:
560 //
561 // $ echo "Update Engine" | base64
562 // VXBkYXRlIEVuZ2luZQo=
563 EXPECT_TRUE(utils::DecodeAndStoreBase64String("VXBkYXRlIEVuZ2luZQo=",
564 &path));
565 ScopedPathUnlinker unlinker(path.value());
566 string expected_contents = "Update Engine\n";
567 string contents;
568 EXPECT_TRUE(utils::ReadFile(path.value(), &contents));
569 EXPECT_EQ(contents, expected_contents);
570 EXPECT_EQ(utils::FileSize(path.value()), expected_contents.size());
571}
572
David Zeuthen639aa362014-02-03 16:23:44 -0800573TEST(UtilsTest, ConvertToOmahaInstallDate) {
574 // The Omaha Epoch starts at Jan 1, 2007 0:00 PST which is a
575 // Monday. In Unix time, this point in time is easily obtained via
576 // the date(1) command like this:
577 //
578 // $ date +"%s" --date="Jan 1, 2007 0:00 PST"
579 const time_t omaha_epoch = 1167638400;
580 int value;
581
582 // Points in time *on and after* the Omaha epoch should not fail.
583 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
584 base::Time::FromTimeT(omaha_epoch), &value));
585 EXPECT_GE(value, 0);
586
587 // Anything before the Omaha epoch should fail. We test it for two points.
588 EXPECT_FALSE(utils::ConvertToOmahaInstallDate(
589 base::Time::FromTimeT(omaha_epoch - 1), &value));
590 EXPECT_FALSE(utils::ConvertToOmahaInstallDate(
591 base::Time::FromTimeT(omaha_epoch - 100*24*3600), &value));
592
593 // Check that we jump from 0 to 7 exactly on the one-week mark, e.g.
594 // on Jan 8, 2007 0:00 PST.
595 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
596 base::Time::FromTimeT(omaha_epoch + 7*24*3600 - 1), &value));
597 EXPECT_EQ(value, 0);
598 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
599 base::Time::FromTimeT(omaha_epoch + 7*24*3600), &value));
600 EXPECT_EQ(value, 7);
601
602 // Check a couple of more values.
603 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
604 base::Time::FromTimeT(omaha_epoch + 10*24*3600), &value));
605 EXPECT_EQ(value, 7);
606 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
607 base::Time::FromTimeT(omaha_epoch + 20*24*3600), &value));
608 EXPECT_EQ(value, 14);
609 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
610 base::Time::FromTimeT(omaha_epoch + 26*24*3600), &value));
611 EXPECT_EQ(value, 21);
612 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
613 base::Time::FromTimeT(omaha_epoch + 29*24*3600), &value));
614 EXPECT_EQ(value, 28);
615
616 // The date Jun 4, 2007 0:00 PDT is a Monday and is hence a point
617 // where the Omaha InstallDate jumps 7 days. Its unix time is
618 // 1180940400. Notably, this is a point in time where Daylight
619 // Savings Time (DST) was is in effect (e.g. it's PDT, not PST).
620 //
621 // Note that as utils::ConvertToOmahaInstallDate() _deliberately_
622 // ignores DST (as it's hard to implement in a thread-safe way using
623 // glibc, see comments in utils.h) we have to fudge by the DST
624 // offset which is one hour. Conveniently, if the function were
625 // someday modified to be DST aware, this test would have to be
626 // modified as well.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700627 const time_t dst_time = 1180940400; // Jun 4, 2007 0:00 PDT.
David Zeuthen639aa362014-02-03 16:23:44 -0800628 const time_t fudge = 3600;
629 int value1, value2;
630 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
631 base::Time::FromTimeT(dst_time + fudge - 1), &value1));
632 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
633 base::Time::FromTimeT(dst_time + fudge), &value2));
634 EXPECT_EQ(value1, value2 - 7);
635}
636
David Zeuthen33bae492014-02-25 16:16:18 -0800637TEST(UtilsTest, WallclockDurationHelper) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700638 FakeSystemState fake_system_state;
David Zeuthen33bae492014-02-25 16:16:18 -0800639 FakeClock fake_clock;
640 base::TimeDelta duration;
641 string state_variable_key = "test-prefs";
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800642 FakePrefs fake_prefs;
David Zeuthen33bae492014-02-25 16:16:18 -0800643
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700644 fake_system_state.set_clock(&fake_clock);
645 fake_system_state.set_prefs(&fake_prefs);
David Zeuthen33bae492014-02-25 16:16:18 -0800646
647 // Initialize wallclock to 1 sec.
648 fake_clock.SetWallclockTime(base::Time::FromInternalValue(1000000));
649
650 // First time called so no previous measurement available.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700651 EXPECT_FALSE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800652 state_variable_key,
653 &duration));
654
655 // Next time, we should get zero since the clock didn't advance.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700656 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800657 state_variable_key,
658 &duration));
659 EXPECT_EQ(duration.InSeconds(), 0);
660
661 // We can also call it as many times as we want with it being
662 // considered a failure.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700663 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800664 state_variable_key,
665 &duration));
666 EXPECT_EQ(duration.InSeconds(), 0);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700667 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800668 state_variable_key,
669 &duration));
670 EXPECT_EQ(duration.InSeconds(), 0);
671
672 // Advance the clock one second, then we should get 1 sec on the
673 // next call and 0 sec on the subsequent call.
674 fake_clock.SetWallclockTime(base::Time::FromInternalValue(2000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700675 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800676 state_variable_key,
677 &duration));
678 EXPECT_EQ(duration.InSeconds(), 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700679 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800680 state_variable_key,
681 &duration));
682 EXPECT_EQ(duration.InSeconds(), 0);
683
684 // Advance clock two seconds and we should get 2 sec and then 0 sec.
685 fake_clock.SetWallclockTime(base::Time::FromInternalValue(4000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700686 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800687 state_variable_key,
688 &duration));
689 EXPECT_EQ(duration.InSeconds(), 2);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700690 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800691 state_variable_key,
692 &duration));
693 EXPECT_EQ(duration.InSeconds(), 0);
694
695 // There's a possibility that the wallclock can go backwards (NTP
696 // adjustments, for example) so check that we properly handle this
697 // case.
698 fake_clock.SetWallclockTime(base::Time::FromInternalValue(3000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700699 EXPECT_FALSE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800700 state_variable_key,
701 &duration));
702 fake_clock.SetWallclockTime(base::Time::FromInternalValue(4000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700703 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800704 state_variable_key,
705 &duration));
706 EXPECT_EQ(duration.InSeconds(), 1);
David Zeuthen33bae492014-02-25 16:16:18 -0800707}
708
709TEST(UtilsTest, MonotonicDurationHelper) {
710 int64_t storage = 0;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700711 FakeSystemState fake_system_state;
David Zeuthen33bae492014-02-25 16:16:18 -0800712 FakeClock fake_clock;
713 base::TimeDelta duration;
714
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700715 fake_system_state.set_clock(&fake_clock);
David Zeuthen33bae492014-02-25 16:16:18 -0800716
717 // Initialize monotonic clock to 1 sec.
718 fake_clock.SetMonotonicTime(base::Time::FromInternalValue(1000000));
719
720 // First time called so no previous measurement available.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700721 EXPECT_FALSE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800722 &storage,
723 &duration));
724
725 // Next time, we should get zero since the clock didn't advance.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700726 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800727 &storage,
728 &duration));
729 EXPECT_EQ(duration.InSeconds(), 0);
730
731 // We can also call it as many times as we want with it being
732 // considered a failure.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700733 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800734 &storage,
735 &duration));
736 EXPECT_EQ(duration.InSeconds(), 0);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700737 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800738 &storage,
739 &duration));
740 EXPECT_EQ(duration.InSeconds(), 0);
741
742 // Advance the clock one second, then we should get 1 sec on the
743 // next call and 0 sec on the subsequent call.
744 fake_clock.SetMonotonicTime(base::Time::FromInternalValue(2000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700745 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800746 &storage,
747 &duration));
748 EXPECT_EQ(duration.InSeconds(), 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700749 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800750 &storage,
751 &duration));
752 EXPECT_EQ(duration.InSeconds(), 0);
753
754 // Advance clock two seconds and we should get 2 sec and then 0 sec.
755 fake_clock.SetMonotonicTime(base::Time::FromInternalValue(4000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700756 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800757 &storage,
758 &duration));
759 EXPECT_EQ(duration.InSeconds(), 2);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700760 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800761 &storage,
762 &duration));
763 EXPECT_EQ(duration.InSeconds(), 0);
764}
765
David Zeuthenb281f072014-04-02 10:20:19 -0700766TEST(UtilsTest, GetConnectionType) {
767 // Check that expected combinations map to the right value.
768 EXPECT_EQ(metrics::ConnectionType::kUnknown,
769 utils::GetConnectionType(kNetUnknown,
770 NetworkTethering::kUnknown));
771 EXPECT_EQ(metrics::ConnectionType::kEthernet,
772 utils::GetConnectionType(kNetEthernet,
773 NetworkTethering::kUnknown));
774 EXPECT_EQ(metrics::ConnectionType::kWifi,
775 utils::GetConnectionType(kNetWifi,
776 NetworkTethering::kUnknown));
777 EXPECT_EQ(metrics::ConnectionType::kWimax,
778 utils::GetConnectionType(kNetWimax,
779 NetworkTethering::kUnknown));
780 EXPECT_EQ(metrics::ConnectionType::kBluetooth,
781 utils::GetConnectionType(kNetBluetooth,
782 NetworkTethering::kUnknown));
783 EXPECT_EQ(metrics::ConnectionType::kCellular,
784 utils::GetConnectionType(kNetCellular,
785 NetworkTethering::kUnknown));
786 EXPECT_EQ(metrics::ConnectionType::kTetheredEthernet,
787 utils::GetConnectionType(kNetEthernet,
788 NetworkTethering::kConfirmed));
789 EXPECT_EQ(metrics::ConnectionType::kTetheredWifi,
790 utils::GetConnectionType(kNetWifi,
791 NetworkTethering::kConfirmed));
792
793 // Ensure that we don't report tethered ethernet unless it's confirmed.
794 EXPECT_EQ(metrics::ConnectionType::kEthernet,
795 utils::GetConnectionType(kNetEthernet,
796 NetworkTethering::kNotDetected));
797 EXPECT_EQ(metrics::ConnectionType::kEthernet,
798 utils::GetConnectionType(kNetEthernet,
799 NetworkTethering::kSuspected));
800 EXPECT_EQ(metrics::ConnectionType::kEthernet,
801 utils::GetConnectionType(kNetEthernet,
802 NetworkTethering::kUnknown));
803
804 // Ditto for tethered wifi.
805 EXPECT_EQ(metrics::ConnectionType::kWifi,
806 utils::GetConnectionType(kNetWifi,
807 NetworkTethering::kNotDetected));
808 EXPECT_EQ(metrics::ConnectionType::kWifi,
809 utils::GetConnectionType(kNetWifi,
810 NetworkTethering::kSuspected));
811 EXPECT_EQ(metrics::ConnectionType::kWifi,
812 utils::GetConnectionType(kNetWifi,
813 NetworkTethering::kUnknown));
814}
815
adlr@google.com3defe6a2009-12-04 20:57:17 +0000816} // namespace chromeos_update_engine