blob: cd91279f255ece358cbb6267447eac10a6f80a00 [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>
Allie Wood78750a42015-02-11 15:42:11 -080018#include <base/files/scoped_temp_dir.h>
Alex Vakulenko75039d72014-03-25 12:36:28 -070019#include <base/strings/string_util.h>
20#include <base/strings/stringprintf.h>
Darin Petkovd3f8c892010-10-12 21:38:45 -070021#include <gtest/gtest.h>
22
David Zeuthen33bae492014-02-25 16:16:18 -080023#include "update_engine/fake_clock.h"
Alex Deymo2c0db7b2014-11-04 12:23:39 -080024#include "update_engine/fake_prefs.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070025#include "update_engine/fake_system_state.h"
David Zeuthen33bae492014-02-25 16:16:18 -080026#include "update_engine/prefs.h"
Darin Petkovd3f8c892010-10-12 21:38:45 -070027#include "update_engine/test_utils.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000028
Andrew de los Reyescc92cd32010-10-05 16:56:14 -070029using std::map;
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080030using std::string;
adlr@google.com3defe6a2009-12-04 20:57:17 +000031using std::vector;
32
33namespace chromeos_update_engine {
34
35class UtilsTest : public ::testing::Test { };
36
Chris Sosac1972482013-04-30 22:31:10 -070037TEST(UtilsTest, CanParseECVersion) {
Chris Sosac1972482013-04-30 22:31:10 -070038 // Should be able to parse and valid key value line.
J. Richard Barnette63137e52013-10-28 10:57:29 -070039 EXPECT_EQ("12345", utils::ParseECVersion("fw_version=12345"));
40 EXPECT_EQ("123456", utils::ParseECVersion(
41 "b=1231a fw_version=123456 a=fasd2"));
42 EXPECT_EQ("12345", utils::ParseECVersion("fw_version=12345"));
43 EXPECT_EQ("00VFA616", utils::ParseECVersion(
Chris Sosac1972482013-04-30 22:31:10 -070044 "vendor=\"sam\" fw_version=\"00VFA616\""));
45
46 // For invalid entries, should return the empty string.
J. Richard Barnette63137e52013-10-28 10:57:29 -070047 EXPECT_EQ("", utils::ParseECVersion("b=1231a fw_version a=fasd2"));
Chris Sosac1972482013-04-30 22:31:10 -070048}
49
J. Richard Barnette30842932013-10-28 15:04:23 -070050
51TEST(UtilsTest, KernelDeviceOfBootDevice) {
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -070052 EXPECT_EQ("", utils::KernelDeviceOfBootDevice(""));
J. Richard Barnette30842932013-10-28 15:04:23 -070053 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("foo"));
54 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda0"));
55 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda1"));
56 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda2"));
57 EXPECT_EQ("/dev/sda2", utils::KernelDeviceOfBootDevice("/dev/sda3"));
58 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda4"));
59 EXPECT_EQ("/dev/sda4", utils::KernelDeviceOfBootDevice("/dev/sda5"));
60 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda6"));
61 EXPECT_EQ("/dev/sda6", utils::KernelDeviceOfBootDevice("/dev/sda7"));
62 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda8"));
63 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda9"));
64
65 EXPECT_EQ("/dev/mmcblk0p2",
66 utils::KernelDeviceOfBootDevice("/dev/mmcblk0p3"));
67 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/mmcblk0p4"));
68
Nam T. Nguyena78b28c2015-03-06 22:30:12 -080069 EXPECT_EQ("/dev/mtd2", utils::KernelDeviceOfBootDevice("/dev/ubi3"));
J. Richard Barnette30842932013-10-28 15:04:23 -070070 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/ubi4"));
71
Nam T. Nguyena78b28c2015-03-06 22:30:12 -080072 EXPECT_EQ("/dev/mtd2",
J. Richard Barnette30842932013-10-28 15:04:23 -070073 utils::KernelDeviceOfBootDevice("/dev/ubiblock3_0"));
Nam T. Nguyena78b28c2015-03-06 22:30:12 -080074 EXPECT_EQ("/dev/mtd4",
J. Richard Barnette30842932013-10-28 15:04:23 -070075 utils::KernelDeviceOfBootDevice("/dev/ubiblock5_0"));
Nam T. Nguyena78b28c2015-03-06 22:30:12 -080076 EXPECT_EQ("/dev/mtd6",
J. Richard Barnette30842932013-10-28 15:04:23 -070077 utils::KernelDeviceOfBootDevice("/dev/ubiblock7_0"));
78 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/ubiblock4_0"));
79}
80
81
adlr@google.com3defe6a2009-12-04 20:57:17 +000082TEST(UtilsTest, NormalizePathTest) {
83 EXPECT_EQ("", utils::NormalizePath("", false));
84 EXPECT_EQ("", utils::NormalizePath("", true));
85 EXPECT_EQ("/", utils::NormalizePath("/", false));
86 EXPECT_EQ("", utils::NormalizePath("/", true));
87 EXPECT_EQ("/", utils::NormalizePath("//", false));
88 EXPECT_EQ("", utils::NormalizePath("//", true));
89 EXPECT_EQ("foo", utils::NormalizePath("foo", false));
90 EXPECT_EQ("foo", utils::NormalizePath("foo", true));
91 EXPECT_EQ("/foo/", utils::NormalizePath("/foo//", false));
92 EXPECT_EQ("/foo", utils::NormalizePath("/foo//", true));
93 EXPECT_EQ("bar/baz/foo/adlr", utils::NormalizePath("bar/baz//foo/adlr",
94 false));
95 EXPECT_EQ("bar/baz/foo/adlr", utils::NormalizePath("bar/baz//foo/adlr",
96 true));
97 EXPECT_EQ("/bar/baz/foo/adlr/", utils::NormalizePath("/bar/baz//foo/adlr/",
98 false));
99 EXPECT_EQ("/bar/baz/foo/adlr", utils::NormalizePath("/bar/baz//foo/adlr/",
100 true));
101 EXPECT_EQ("\\\\", utils::NormalizePath("\\\\", false));
102 EXPECT_EQ("\\\\", utils::NormalizePath("\\\\", true));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700103 EXPECT_EQ("\\:/;$PATH\n\\",
104 utils::NormalizePath("\\://;$PATH\n\\", false));
105 EXPECT_EQ("\\:/;$PATH\n\\",
106 utils::NormalizePath("\\://;$PATH\n\\", true));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000107 EXPECT_EQ("/spaces s/ ok/s / / /",
108 utils::NormalizePath("/spaces s/ ok/s / / /", false));
109 EXPECT_EQ("/spaces s/ ok/s / / ",
110 utils::NormalizePath("/spaces s/ ok/s / / /", true));
111}
112
113TEST(UtilsTest, ReadFileFailure) {
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800114 chromeos::Blob empty;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000115 EXPECT_FALSE(utils::ReadFile("/this/doesn't/exist", &empty));
116}
117
Darin Petkov8e447e02013-04-16 16:23:50 +0200118TEST(UtilsTest, ReadFileChunk) {
Alex Vakulenko75039d72014-03-25 12:36:28 -0700119 base::FilePath file;
120 EXPECT_TRUE(base::CreateTemporaryFile(&file));
Darin Petkov8e447e02013-04-16 16:23:50 +0200121 ScopedPathUnlinker unlinker(file.value());
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800122 chromeos::Blob data;
Darin Petkov8e447e02013-04-16 16:23:50 +0200123 const size_t kSize = 1024 * 1024;
124 for (size_t i = 0; i < kSize; i++) {
125 data.push_back(i % 255);
126 }
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800127 EXPECT_TRUE(utils::WriteFile(file.value().c_str(), data.data(), data.size()));
128 chromeos::Blob in_data;
Darin Petkov8e447e02013-04-16 16:23:50 +0200129 EXPECT_TRUE(utils::ReadFileChunk(file.value().c_str(), kSize, 10, &in_data));
130 EXPECT_TRUE(in_data.empty());
131 EXPECT_TRUE(utils::ReadFileChunk(file.value().c_str(), 0, -1, &in_data));
132 EXPECT_TRUE(data == in_data);
133 in_data.clear();
134 EXPECT_TRUE(utils::ReadFileChunk(file.value().c_str(), 10, 20, &in_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800135 EXPECT_TRUE(chromeos::Blob(data.begin() + 10, data.begin() + 10 + 20) ==
Darin Petkov8e447e02013-04-16 16:23:50 +0200136 in_data);
137}
138
adlr@google.com3defe6a2009-12-04 20:57:17 +0000139TEST(UtilsTest, ErrnoNumberAsStringTest) {
140 EXPECT_EQ("No such file or directory", utils::ErrnoNumberAsString(ENOENT));
141}
142
Darin Petkov002b2fe2010-11-22 13:53:22 -0800143TEST(UtilsTest, IsSymlinkTest) {
144 string temp_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800145 EXPECT_TRUE(utils::MakeTempDirectory("symlink-test.XXXXXX", &temp_dir));
Alex Deymo8d925292014-05-21 19:15:25 -0700146 string temp_file = temp_dir + "/temp-file";
Darin Petkov002b2fe2010-11-22 13:53:22 -0800147 EXPECT_TRUE(utils::WriteFile(temp_file.c_str(), "", 0));
Alex Deymo8d925292014-05-21 19:15:25 -0700148 string temp_symlink = temp_dir + "/temp-symlink";
Darin Petkov002b2fe2010-11-22 13:53:22 -0800149 EXPECT_EQ(0, symlink(temp_file.c_str(), temp_symlink.c_str()));
150 EXPECT_FALSE(utils::IsSymlink(temp_dir.c_str()));
151 EXPECT_FALSE(utils::IsSymlink(temp_file.c_str()));
152 EXPECT_TRUE(utils::IsSymlink(temp_symlink.c_str()));
153 EXPECT_FALSE(utils::IsSymlink("/non/existent/path"));
Alex Deymo10875d92014-11-10 21:52:57 -0800154 EXPECT_TRUE(test_utils::RecursiveUnlinkDir(temp_dir));
Darin Petkov002b2fe2010-11-22 13:53:22 -0800155}
156
Alex Deymo7dc4c502014-05-20 20:09:58 -0700157TEST(UtilsTest, IsDirTest) {
158 string temp_dir;
159 EXPECT_TRUE(utils::MakeTempDirectory("isdir-test.XXXXXX", &temp_dir));
Alex Deymo8d925292014-05-21 19:15:25 -0700160 string temp_file = temp_dir + "/temp-file";
Alex Deymo7dc4c502014-05-20 20:09:58 -0700161 EXPECT_TRUE(utils::WriteFile(temp_file.c_str(), "", 0));
Alex Deymo8d925292014-05-21 19:15:25 -0700162 string temp_symlink = temp_dir + "/temp-symlink";
Alex Deymo7dc4c502014-05-20 20:09:58 -0700163 EXPECT_EQ(0, symlink(temp_dir.c_str(), temp_symlink.c_str()));
164 EXPECT_TRUE(utils::IsDir(temp_dir.c_str()));
165 EXPECT_FALSE(utils::IsDir(temp_file.c_str()));
166 EXPECT_FALSE(utils::IsDir(temp_symlink.c_str()));
167 EXPECT_FALSE(utils::IsDir("/non/existent/path"));
Alex Deymo10875d92014-11-10 21:52:57 -0800168 ASSERT_TRUE(test_utils::RecursiveUnlinkDir(temp_dir));
Alex Deymo7dc4c502014-05-20 20:09:58 -0700169}
170
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800171TEST(UtilsTest, GetDiskNameTest) {
172 EXPECT_EQ("/dev/sda", utils::GetDiskName("/dev/sda3"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700173 EXPECT_EQ("/dev/sdp", utils::GetDiskName("/dev/sdp1234"));
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800174 EXPECT_EQ("/dev/mmcblk0", utils::GetDiskName("/dev/mmcblk0p3"));
175 EXPECT_EQ("", utils::GetDiskName("/dev/mmcblk0p"));
176 EXPECT_EQ("", utils::GetDiskName("/dev/sda"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700177 EXPECT_EQ("/dev/ubiblock", utils::GetDiskName("/dev/ubiblock3_2"));
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800178 EXPECT_EQ("", utils::GetDiskName("/dev/foo/bar"));
179 EXPECT_EQ("", utils::GetDiskName("/"));
180 EXPECT_EQ("", utils::GetDiskName(""));
Darin Petkovf74eb652010-08-04 12:08:38 -0700181}
182
183TEST(UtilsTest, SysfsBlockDeviceTest) {
184 EXPECT_EQ("/sys/block/sda", utils::SysfsBlockDevice("/dev/sda"));
185 EXPECT_EQ("", utils::SysfsBlockDevice("/foo/sda"));
186 EXPECT_EQ("", utils::SysfsBlockDevice("/dev/foo/bar"));
187 EXPECT_EQ("", utils::SysfsBlockDevice("/"));
188 EXPECT_EQ("", utils::SysfsBlockDevice("./"));
189 EXPECT_EQ("", utils::SysfsBlockDevice(""));
190}
191
192TEST(UtilsTest, IsRemovableDeviceTest) {
193 EXPECT_FALSE(utils::IsRemovableDevice(""));
194 EXPECT_FALSE(utils::IsRemovableDevice("/dev/non-existent-device"));
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700195}
196
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800197TEST(UtilsTest, GetPartitionNumberTest) {
198 EXPECT_EQ(3, utils::GetPartitionNumber("/dev/sda3"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700199 EXPECT_EQ(3, utils::GetPartitionNumber("/dev/sdz3"));
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800200 EXPECT_EQ(123, utils::GetPartitionNumber("/dev/sda123"));
201 EXPECT_EQ(2, utils::GetPartitionNumber("/dev/mmcblk0p2"));
202 EXPECT_EQ(0, utils::GetPartitionNumber("/dev/mmcblk0p"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700203 EXPECT_EQ(3, utils::GetPartitionNumber("/dev/ubiblock3_2"));
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800204 EXPECT_EQ(0, utils::GetPartitionNumber(""));
205 EXPECT_EQ(0, utils::GetPartitionNumber("/"));
206 EXPECT_EQ(0, utils::GetPartitionNumber("/dev/"));
207 EXPECT_EQ(0, utils::GetPartitionNumber("/dev/sda"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700208 EXPECT_EQ(10, utils::GetPartitionNumber("/dev/loop10"));
209 EXPECT_EQ(11, utils::GetPartitionNumber("/dev/loop28p11"));
210 EXPECT_EQ(10, utils::GetPartitionNumber("/dev/loop10_0"));
211 EXPECT_EQ(11, utils::GetPartitionNumber("/dev/loop28p11_0"));
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700212}
213
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700214TEST(UtilsTest, MakePartitionNameTest) {
215 EXPECT_EQ("/dev/sda4", utils::MakePartitionName("/dev/sda", 4));
216 EXPECT_EQ("/dev/sda123", utils::MakePartitionName("/dev/sda", 123));
217 EXPECT_EQ("/dev/mmcblk2", utils::MakePartitionName("/dev/mmcblk", 2));
218 EXPECT_EQ("/dev/mmcblk0p2", utils::MakePartitionName("/dev/mmcblk0", 2));
219 EXPECT_EQ("/dev/loop8", utils::MakePartitionName("/dev/loop", 8));
220 EXPECT_EQ("/dev/loop12p2", utils::MakePartitionName("/dev/loop12", 2));
Nam T. Nguyena78b28c2015-03-06 22:30:12 -0800221 EXPECT_EQ("/dev/ubi5_0", utils::MakePartitionName("/dev/ubiblock", 5));
222 EXPECT_EQ("/dev/mtd4", utils::MakePartitionName("/dev/ubiblock", 4));
223 EXPECT_EQ("/dev/ubi3_0", utils::MakePartitionName("/dev/ubiblock", 3));
224 EXPECT_EQ("/dev/mtd2", utils::MakePartitionName("/dev/ubiblock", 2));
225 EXPECT_EQ("/dev/ubi1_0", utils::MakePartitionName("/dev/ubiblock", 1));
226}
227
228TEST(UtilsTest, MakePartitionNameForMountTest) {
229 EXPECT_EQ("/dev/sda4", utils::MakePartitionNameForMount("/dev/sda4"));
230 EXPECT_EQ("/dev/sda123", utils::MakePartitionNameForMount("/dev/sda123"));
231 EXPECT_EQ("/dev/mmcblk2", utils::MakePartitionNameForMount("/dev/mmcblk2"));
232 EXPECT_EQ("/dev/mmcblk0p2",
233 utils::MakePartitionNameForMount("/dev/mmcblk0p2"));
234 EXPECT_EQ("/dev/loop0", utils::MakePartitionNameForMount("/dev/loop0"));
235 EXPECT_EQ("/dev/loop8", utils::MakePartitionNameForMount("/dev/loop8"));
236 EXPECT_EQ("/dev/loop12p2",
237 utils::MakePartitionNameForMount("/dev/loop12p2"));
238 EXPECT_EQ("/dev/ubiblock5_0",
239 utils::MakePartitionNameForMount("/dev/ubiblock5_0"));
240 EXPECT_EQ("/dev/mtd4",
241 utils::MakePartitionNameForMount("/dev/ubi4_0"));
242 EXPECT_EQ("/dev/ubiblock3_0",
243 utils::MakePartitionNameForMount("/dev/ubiblock3"));
244 EXPECT_EQ("/dev/mtd2", utils::MakePartitionNameForMount("/dev/ubi2"));
245 EXPECT_EQ("/dev/ubi1_0",
246 utils::MakePartitionNameForMount("/dev/ubiblock1"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700247}
248
Alex Deymo10875d92014-11-10 21:52:57 -0800249namespace {
250// Compares cpu shares and returns an integer that is less
251// than, equal to or greater than 0 if |shares_lhs| is,
252// respectively, lower than, same as or higher than |shares_rhs|.
253int CompareCpuShares(utils::CpuShares shares_lhs,
254 utils::CpuShares shares_rhs) {
255 return static_cast<int>(shares_lhs) - static_cast<int>(shares_rhs);
256}
257} // namespace
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700258
Alex Deymo10875d92014-11-10 21:52:57 -0800259// Tests the CPU shares enum is in the order we expect it.
Chris Sosa4f8ee272012-11-30 13:01:54 -0800260TEST(UtilsTest, CompareCpuSharesTest) {
Alex Deymo10875d92014-11-10 21:52:57 -0800261 EXPECT_LT(CompareCpuShares(utils::kCpuSharesLow,
262 utils::kCpuSharesNormal), 0);
263 EXPECT_GT(CompareCpuShares(utils::kCpuSharesNormal,
264 utils::kCpuSharesLow), 0);
265 EXPECT_EQ(CompareCpuShares(utils::kCpuSharesNormal,
266 utils::kCpuSharesNormal), 0);
267 EXPECT_GT(CompareCpuShares(utils::kCpuSharesHigh,
268 utils::kCpuSharesNormal), 0);
Darin Petkovc6c135c2010-08-11 13:36:18 -0700269}
270
Darin Petkov5c0a8af2010-08-24 13:39:13 -0700271TEST(UtilsTest, FuzzIntTest) {
272 static const unsigned int kRanges[] = { 0, 1, 2, 20 };
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800273 for (unsigned int range : kRanges) {
Darin Petkov5c0a8af2010-08-24 13:39:13 -0700274 const int kValue = 50;
275 for (int tries = 0; tries < 100; ++tries) {
276 int value = utils::FuzzInt(kValue, range);
277 EXPECT_GE(value, kValue - range / 2);
278 EXPECT_LE(value, kValue + range - range / 2);
279 }
280 }
281}
282
Andrew de los Reyescc92cd32010-10-05 16:56:14 -0700283TEST(UtilsTest, ApplyMapTest) {
284 int initial_values[] = {1, 2, 3, 4, 6};
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800285 vector<int> collection(std::begin(initial_values), std::end(initial_values));
Andrew de los Reyescc92cd32010-10-05 16:56:14 -0700286 EXPECT_EQ(arraysize(initial_values), collection.size());
287 int expected_values[] = {1, 2, 5, 4, 8};
288 map<int, int> value_map;
289 value_map[3] = 5;
290 value_map[6] = 8;
291 value_map[5] = 10;
292
293 utils::ApplyMap(&collection, value_map);
294
295 size_t index = 0;
Alex Deymo020600d2014-11-05 21:05:55 -0800296 for (const int value : collection) {
297 EXPECT_EQ(expected_values[index++], value);
Andrew de los Reyescc92cd32010-10-05 16:56:14 -0700298 }
299}
300
Darin Petkovd3f8c892010-10-12 21:38:45 -0700301TEST(UtilsTest, RunAsRootGetFilesystemSizeTest) {
302 string img;
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700303 EXPECT_TRUE(utils::MakeTempFile("img.XXXXXX", &img, nullptr));
Darin Petkovd3f8c892010-10-12 21:38:45 -0700304 ScopedPathUnlinker img_unlinker(img);
Alex Deymo10875d92014-11-10 21:52:57 -0800305 test_utils::CreateExtImageAtPath(img, nullptr);
Darin Petkovd3f8c892010-10-12 21:38:45 -0700306 // Extend the "partition" holding the file system from 10MiB to 20MiB.
Alex Deymo10875d92014-11-10 21:52:57 -0800307 EXPECT_EQ(0, test_utils::System(base::StringPrintf(
Alex Deymo1f93d032015-03-10 18:58:32 -0700308 "dd if=/dev/zero of=%s seek=20971519 bs=1 count=1 status=none",
Darin Petkovd3f8c892010-10-12 21:38:45 -0700309 img.c_str())));
310 EXPECT_EQ(20 * 1024 * 1024, utils::FileSize(img));
311 int block_count = 0;
312 int block_size = 0;
313 EXPECT_TRUE(utils::GetFilesystemSize(img, &block_count, &block_size));
314 EXPECT_EQ(4096, block_size);
315 EXPECT_EQ(10 * 1024 * 1024 / 4096, block_count);
316}
317
Alex Deymo192393b2014-11-10 15:58:38 -0800318// Squashfs example filesystem, generated with:
319// echo hola>hola
320// mksquashfs hola hola.sqfs -noappend -nopad
321// hexdump hola.sqfs -e '16/1 "%02x, " "\n"'
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800322const uint8_t kSquashfsFile[] = {
Alex Deymo192393b2014-11-10 15:58:38 -0800323 0x68, 0x73, 0x71, 0x73, 0x02, 0x00, 0x00, 0x00, // magic, inodes
324 0x3e, 0x49, 0x61, 0x54, 0x00, 0x00, 0x02, 0x00,
325 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00,
326 0xc0, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, // flags, noids, major, minor
327 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // root_inode
328 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // bytes_used
329 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
331 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
332 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
333 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
334 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335 0x68, 0x6f, 0x6c, 0x61, 0x0a, 0x2c, 0x00, 0x78,
336 0xda, 0x63, 0x62, 0x58, 0xc2, 0xc8, 0xc0, 0xc0,
337 0xc8, 0xd0, 0x6b, 0x91, 0x18, 0x02, 0x64, 0xa0,
338 0x00, 0x56, 0x06, 0x90, 0xcc, 0x7f, 0xb0, 0xbc,
339 0x9d, 0x67, 0x62, 0x08, 0x13, 0x54, 0x1c, 0x44,
340 0x4b, 0x03, 0x31, 0x33, 0x10, 0x03, 0x00, 0xb5,
341 0x87, 0x04, 0x89, 0x16, 0x00, 0x78, 0xda, 0x63,
342 0x60, 0x80, 0x00, 0x46, 0x28, 0xcd, 0xc4, 0xc0,
343 0xcc, 0x90, 0x91, 0x9f, 0x93, 0x08, 0x00, 0x04,
344 0x70, 0x01, 0xab, 0x10, 0x80, 0x60, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
346 0x01, 0x00, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x78,
348 0xda, 0x63, 0x60, 0x80, 0x00, 0x05, 0x28, 0x0d,
349 0x00, 0x01, 0x10, 0x00, 0x21, 0xc5, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x99,
351 0xcd, 0x02, 0x00, 0x88, 0x13, 0x00, 0x00, 0xdd,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
353};
354
355TEST(UtilsTest, GetSquashfs4Size) {
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800356 uint8_t buffer[sizeof(kSquashfsFile)];
Alex Deymo192393b2014-11-10 15:58:38 -0800357 memcpy(buffer, kSquashfsFile, sizeof(kSquashfsFile));
358
359 int block_count = -1;
360 int block_size = -1;
361 // Not enough bytes passed.
362 EXPECT_FALSE(utils::GetSquashfs4Size(buffer, 10, nullptr, nullptr));
363
364 // The whole file system is passed, which is enough for parsing.
365 EXPECT_TRUE(utils::GetSquashfs4Size(buffer, sizeof(kSquashfsFile),
366 &block_count, &block_size));
367 EXPECT_EQ(4096, block_size);
368 EXPECT_EQ(1, block_count);
369
370 // Modify the major version to 5.
371 uint16_t* s_major = reinterpret_cast<uint16_t*>(buffer + 0x1c);
372 *s_major = 5;
373 EXPECT_FALSE(utils::GetSquashfs4Size(buffer, 10, nullptr, nullptr));
374 memcpy(buffer, kSquashfsFile, sizeof(kSquashfsFile));
375
376 // Modify the bytes_used to have 6 blocks.
377 int64_t* bytes_used = reinterpret_cast<int64_t*>(buffer + 0x28);
378 *bytes_used = 4096 * 5 + 1; // 6 "blocks".
379 EXPECT_TRUE(utils::GetSquashfs4Size(buffer, sizeof(kSquashfsFile),
380 &block_count, &block_size));
381 EXPECT_EQ(4096, block_size);
382 EXPECT_EQ(6, block_count);
383}
384
Chris Sosad317e402013-06-12 13:47:09 -0700385TEST(UtilsTest, GetInstallDevTest) {
386 string boot_dev = "/dev/sda5";
387 string install_dev;
388 EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev));
389 EXPECT_EQ(install_dev, "/dev/sda3");
390
391 boot_dev = "/dev/sda3";
392 EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev));
393 EXPECT_EQ(install_dev, "/dev/sda5");
394
395 boot_dev = "/dev/sda12";
396 EXPECT_FALSE(utils::GetInstallDev(boot_dev, &install_dev));
Liam McLoughlin049d1652013-07-31 18:47:46 -0700397
398 boot_dev = "/dev/ubiblock3_0";
399 EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev));
Nam T. Nguyena78b28c2015-03-06 22:30:12 -0800400 EXPECT_EQ(install_dev, "/dev/ubi5_0");
Liam McLoughlin049d1652013-07-31 18:47:46 -0700401
402 boot_dev = "/dev/ubiblock5_0";
403 EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev));
Nam T. Nguyena78b28c2015-03-06 22:30:12 -0800404 EXPECT_EQ(install_dev, "/dev/ubi3_0");
Liam McLoughlin049d1652013-07-31 18:47:46 -0700405
406 boot_dev = "/dev/ubiblock12_0";
407 EXPECT_FALSE(utils::GetInstallDev(boot_dev, &install_dev));
Chris Sosad317e402013-06-12 13:47:09 -0700408}
409
Andrew de los Reyes712b3ac2011-01-07 13:47:52 -0800410namespace {
Alex Deymo032e7722014-03-25 17:53:56 -0700411void GetFileFormatTester(const string& expected,
Ben Chan9abb7632014-08-07 00:10:53 -0700412 const vector<uint8_t>& contents) {
Alex Deymo10875d92014-11-10 21:52:57 -0800413 test_utils::ScopedTempFile file;
Alex Deymo032e7722014-03-25 17:53:56 -0700414 ASSERT_TRUE(utils::WriteFile(file.GetPath().c_str(),
415 reinterpret_cast<const char*>(contents.data()),
416 contents.size()));
417 EXPECT_EQ(expected, utils::GetFileFormat(file.GetPath()));
418}
Alex Deymo10875d92014-11-10 21:52:57 -0800419} // namespace
Alex Deymo032e7722014-03-25 17:53:56 -0700420
421TEST(UtilsTest, GetFileFormatTest) {
422 EXPECT_EQ("File not found.", utils::GetFileFormat("/path/to/nowhere"));
Ben Chan9abb7632014-08-07 00:10:53 -0700423 GetFileFormatTester("data", vector<uint8_t>{1, 2, 3, 4, 5, 6, 7, 8});
424 GetFileFormatTester("ELF", vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46});
Alex Deymo032e7722014-03-25 17:53:56 -0700425
426 // Real tests from cros_installer on different boards.
427 // ELF 32-bit LSB executable, Intel 80386
428 GetFileFormatTester(
429 "ELF 32-bit little-endian x86",
Ben Chan9abb7632014-08-07 00:10:53 -0700430 vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00,
431 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
432 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00,
433 0x90, 0x83, 0x04, 0x08, 0x34, 0x00, 0x00, 0x00});
Alex Deymo032e7722014-03-25 17:53:56 -0700434
Alex Deymoc1711e22014-08-08 13:16:23 -0700435 // ELF 32-bit LSB executable, MIPS
436 GetFileFormatTester(
437 "ELF 32-bit little-endian mips",
438 vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00,
439 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
440 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
441 0xc0, 0x12, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00});
442
Alex Deymo032e7722014-03-25 17:53:56 -0700443 // ELF 32-bit LSB executable, ARM
444 GetFileFormatTester(
445 "ELF 32-bit little-endian arm",
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, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00,
449 0x85, 0x8b, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00});
Alex Deymo032e7722014-03-25 17:53:56 -0700450
451 // ELF 64-bit LSB executable, x86-64
452 GetFileFormatTester(
453 "ELF 64-bit little-endian x86-64",
Ben Chan9abb7632014-08-07 00:10:53 -0700454 vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46, 0x02, 0x01, 0x01, 0x00,
455 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
456 0x02, 0x00, 0x3e, 0x00, 0x01, 0x00, 0x00, 0x00,
457 0xb0, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00});
Alex Deymo032e7722014-03-25 17:53:56 -0700458}
459
460namespace {
Andrew de los Reyes712b3ac2011-01-07 13:47:52 -0800461gboolean TerminateScheduleCrashReporterUploadTest(void* arg) {
462 GMainLoop* loop = reinterpret_cast<GMainLoop*>(arg);
463 g_main_loop_quit(loop);
464 return FALSE; // Don't call this callback again
465}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700466} // namespace
Andrew de los Reyes712b3ac2011-01-07 13:47:52 -0800467
468TEST(UtilsTest, ScheduleCrashReporterUploadTest) {
469 // Not much to test. At least this tests for memory leaks, crashes,
470 // log errors.
471 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
472 utils::ScheduleCrashReporterUpload();
473 g_timeout_add_seconds(1, &TerminateScheduleCrashReporterUploadTest, loop);
474 g_main_loop_run(loop);
475 g_main_loop_unref(loop);
476}
477
David Zeuthen674c3182013-04-18 14:05:20 -0700478TEST(UtilsTest, FormatTimeDeltaTest) {
479 // utils::FormatTimeDelta() is not locale-aware (it's only used for logging
480 // which is not localized) so we only need to test the C locale
481 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromMilliseconds(100)),
482 "0.1s");
483 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(0)),
484 "0s");
485 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(1)),
486 "1s");
487 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(59)),
488 "59s");
489 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(60)),
490 "1m0s");
491 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(61)),
492 "1m1s");
493 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(90)),
494 "1m30s");
495 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(1205)),
496 "20m5s");
497 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(3600)),
498 "1h0m0s");
499 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(3601)),
500 "1h0m1s");
501 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(3661)),
502 "1h1m1s");
503 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(7261)),
504 "2h1m1s");
505 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(86400)),
506 "1d0h0m0s");
507 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(86401)),
508 "1d0h0m1s");
509 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(200000)),
510 "2d7h33m20s");
511 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(200000) +
512 base::TimeDelta::FromMilliseconds(1)),
513 "2d7h33m20.001s");
David Zeuthen973449e2014-08-18 16:18:23 -0400514 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(-1)),
515 "-1s");
David Zeuthen674c3182013-04-18 14:05:20 -0700516}
517
David Zeuthen27a48bc2013-08-06 12:06:29 -0700518TEST(UtilsTest, TimeFromStructTimespecTest) {
519 struct timespec ts;
520
521 // Unix epoch (Thursday 00:00:00 UTC on Jan 1, 1970)
522 ts = (struct timespec) {.tv_sec = 0, .tv_nsec = 0};
523 EXPECT_EQ(base::Time::UnixEpoch(), utils::TimeFromStructTimespec(&ts));
524
525 // 42 ms after the Unix billennium (Sunday 01:46:40 UTC on September 9, 2001)
526 ts = (struct timespec) {.tv_sec = 1000 * 1000 * 1000,
527 .tv_nsec = 42 * 1000 * 1000};
528 base::Time::Exploded exploded = (base::Time::Exploded) {
529 .year = 2001, .month = 9, .day_of_week = 0, .day_of_month = 9,
530 .hour = 1, .minute = 46, .second = 40, .millisecond = 42};
531 EXPECT_EQ(base::Time::FromUTCExploded(exploded),
532 utils::TimeFromStructTimespec(&ts));
533}
534
David Zeuthene7f89172013-10-31 10:21:04 -0700535TEST(UtilsTest, DecodeAndStoreBase64String) {
536 base::FilePath path;
537
538 // Ensure we return false on empty strings or invalid base64.
539 EXPECT_FALSE(utils::DecodeAndStoreBase64String("", &path));
540 EXPECT_FALSE(utils::DecodeAndStoreBase64String("not valid base64", &path));
541
542 // Pass known base64 and check that it matches. This string was generated
543 // the following way:
544 //
545 // $ echo "Update Engine" | base64
546 // VXBkYXRlIEVuZ2luZQo=
547 EXPECT_TRUE(utils::DecodeAndStoreBase64String("VXBkYXRlIEVuZ2luZQo=",
548 &path));
549 ScopedPathUnlinker unlinker(path.value());
550 string expected_contents = "Update Engine\n";
551 string contents;
552 EXPECT_TRUE(utils::ReadFile(path.value(), &contents));
553 EXPECT_EQ(contents, expected_contents);
554 EXPECT_EQ(utils::FileSize(path.value()), expected_contents.size());
555}
556
David Zeuthen639aa362014-02-03 16:23:44 -0800557TEST(UtilsTest, ConvertToOmahaInstallDate) {
558 // The Omaha Epoch starts at Jan 1, 2007 0:00 PST which is a
559 // Monday. In Unix time, this point in time is easily obtained via
560 // the date(1) command like this:
561 //
562 // $ date +"%s" --date="Jan 1, 2007 0:00 PST"
563 const time_t omaha_epoch = 1167638400;
564 int value;
565
566 // Points in time *on and after* the Omaha epoch should not fail.
567 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
568 base::Time::FromTimeT(omaha_epoch), &value));
569 EXPECT_GE(value, 0);
570
571 // Anything before the Omaha epoch should fail. We test it for two points.
572 EXPECT_FALSE(utils::ConvertToOmahaInstallDate(
573 base::Time::FromTimeT(omaha_epoch - 1), &value));
574 EXPECT_FALSE(utils::ConvertToOmahaInstallDate(
575 base::Time::FromTimeT(omaha_epoch - 100*24*3600), &value));
576
577 // Check that we jump from 0 to 7 exactly on the one-week mark, e.g.
578 // on Jan 8, 2007 0:00 PST.
579 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
580 base::Time::FromTimeT(omaha_epoch + 7*24*3600 - 1), &value));
581 EXPECT_EQ(value, 0);
582 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
583 base::Time::FromTimeT(omaha_epoch + 7*24*3600), &value));
584 EXPECT_EQ(value, 7);
585
586 // Check a couple of more values.
587 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
588 base::Time::FromTimeT(omaha_epoch + 10*24*3600), &value));
589 EXPECT_EQ(value, 7);
590 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
591 base::Time::FromTimeT(omaha_epoch + 20*24*3600), &value));
592 EXPECT_EQ(value, 14);
593 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
594 base::Time::FromTimeT(omaha_epoch + 26*24*3600), &value));
595 EXPECT_EQ(value, 21);
596 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
597 base::Time::FromTimeT(omaha_epoch + 29*24*3600), &value));
598 EXPECT_EQ(value, 28);
599
600 // The date Jun 4, 2007 0:00 PDT is a Monday and is hence a point
601 // where the Omaha InstallDate jumps 7 days. Its unix time is
602 // 1180940400. Notably, this is a point in time where Daylight
603 // Savings Time (DST) was is in effect (e.g. it's PDT, not PST).
604 //
605 // Note that as utils::ConvertToOmahaInstallDate() _deliberately_
606 // ignores DST (as it's hard to implement in a thread-safe way using
607 // glibc, see comments in utils.h) we have to fudge by the DST
608 // offset which is one hour. Conveniently, if the function were
609 // someday modified to be DST aware, this test would have to be
610 // modified as well.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700611 const time_t dst_time = 1180940400; // Jun 4, 2007 0:00 PDT.
David Zeuthen639aa362014-02-03 16:23:44 -0800612 const time_t fudge = 3600;
613 int value1, value2;
614 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
615 base::Time::FromTimeT(dst_time + fudge - 1), &value1));
616 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
617 base::Time::FromTimeT(dst_time + fudge), &value2));
618 EXPECT_EQ(value1, value2 - 7);
619}
620
David Zeuthen33bae492014-02-25 16:16:18 -0800621TEST(UtilsTest, WallclockDurationHelper) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700622 FakeSystemState fake_system_state;
David Zeuthen33bae492014-02-25 16:16:18 -0800623 FakeClock fake_clock;
624 base::TimeDelta duration;
625 string state_variable_key = "test-prefs";
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800626 FakePrefs fake_prefs;
David Zeuthen33bae492014-02-25 16:16:18 -0800627
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700628 fake_system_state.set_clock(&fake_clock);
629 fake_system_state.set_prefs(&fake_prefs);
David Zeuthen33bae492014-02-25 16:16:18 -0800630
631 // Initialize wallclock to 1 sec.
632 fake_clock.SetWallclockTime(base::Time::FromInternalValue(1000000));
633
634 // First time called so no previous measurement available.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700635 EXPECT_FALSE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800636 state_variable_key,
637 &duration));
638
639 // Next time, we should get zero since the clock didn't advance.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700640 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800641 state_variable_key,
642 &duration));
643 EXPECT_EQ(duration.InSeconds(), 0);
644
645 // We can also call it as many times as we want with it being
646 // considered a failure.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700647 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800648 state_variable_key,
649 &duration));
650 EXPECT_EQ(duration.InSeconds(), 0);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700651 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800652 state_variable_key,
653 &duration));
654 EXPECT_EQ(duration.InSeconds(), 0);
655
656 // Advance the clock one second, then we should get 1 sec on the
657 // next call and 0 sec on the subsequent call.
658 fake_clock.SetWallclockTime(base::Time::FromInternalValue(2000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700659 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800660 state_variable_key,
661 &duration));
662 EXPECT_EQ(duration.InSeconds(), 1);
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);
667
668 // Advance clock two seconds and we should get 2 sec and then 0 sec.
669 fake_clock.SetWallclockTime(base::Time::FromInternalValue(4000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700670 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800671 state_variable_key,
672 &duration));
673 EXPECT_EQ(duration.InSeconds(), 2);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700674 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800675 state_variable_key,
676 &duration));
677 EXPECT_EQ(duration.InSeconds(), 0);
678
679 // There's a possibility that the wallclock can go backwards (NTP
680 // adjustments, for example) so check that we properly handle this
681 // case.
682 fake_clock.SetWallclockTime(base::Time::FromInternalValue(3000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700683 EXPECT_FALSE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800684 state_variable_key,
685 &duration));
686 fake_clock.SetWallclockTime(base::Time::FromInternalValue(4000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700687 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800688 state_variable_key,
689 &duration));
690 EXPECT_EQ(duration.InSeconds(), 1);
David Zeuthen33bae492014-02-25 16:16:18 -0800691}
692
693TEST(UtilsTest, MonotonicDurationHelper) {
694 int64_t storage = 0;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700695 FakeSystemState fake_system_state;
David Zeuthen33bae492014-02-25 16:16:18 -0800696 FakeClock fake_clock;
697 base::TimeDelta duration;
698
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700699 fake_system_state.set_clock(&fake_clock);
David Zeuthen33bae492014-02-25 16:16:18 -0800700
701 // Initialize monotonic clock to 1 sec.
702 fake_clock.SetMonotonicTime(base::Time::FromInternalValue(1000000));
703
704 // First time called so no previous measurement available.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700705 EXPECT_FALSE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800706 &storage,
707 &duration));
708
709 // Next time, we should get zero since the clock didn't advance.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700710 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800711 &storage,
712 &duration));
713 EXPECT_EQ(duration.InSeconds(), 0);
714
715 // We can also call it as many times as we want with it being
716 // considered a failure.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700717 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800718 &storage,
719 &duration));
720 EXPECT_EQ(duration.InSeconds(), 0);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700721 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800722 &storage,
723 &duration));
724 EXPECT_EQ(duration.InSeconds(), 0);
725
726 // Advance the clock one second, then we should get 1 sec on the
727 // next call and 0 sec on the subsequent call.
728 fake_clock.SetMonotonicTime(base::Time::FromInternalValue(2000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700729 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800730 &storage,
731 &duration));
732 EXPECT_EQ(duration.InSeconds(), 1);
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);
737
738 // Advance clock two seconds and we should get 2 sec and then 0 sec.
739 fake_clock.SetMonotonicTime(base::Time::FromInternalValue(4000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700740 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800741 &storage,
742 &duration));
743 EXPECT_EQ(duration.InSeconds(), 2);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700744 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800745 &storage,
746 &duration));
747 EXPECT_EQ(duration.InSeconds(), 0);
748}
749
David Zeuthenb281f072014-04-02 10:20:19 -0700750TEST(UtilsTest, GetConnectionType) {
751 // Check that expected combinations map to the right value.
752 EXPECT_EQ(metrics::ConnectionType::kUnknown,
753 utils::GetConnectionType(kNetUnknown,
754 NetworkTethering::kUnknown));
755 EXPECT_EQ(metrics::ConnectionType::kEthernet,
756 utils::GetConnectionType(kNetEthernet,
757 NetworkTethering::kUnknown));
758 EXPECT_EQ(metrics::ConnectionType::kWifi,
759 utils::GetConnectionType(kNetWifi,
760 NetworkTethering::kUnknown));
761 EXPECT_EQ(metrics::ConnectionType::kWimax,
762 utils::GetConnectionType(kNetWimax,
763 NetworkTethering::kUnknown));
764 EXPECT_EQ(metrics::ConnectionType::kBluetooth,
765 utils::GetConnectionType(kNetBluetooth,
766 NetworkTethering::kUnknown));
767 EXPECT_EQ(metrics::ConnectionType::kCellular,
768 utils::GetConnectionType(kNetCellular,
769 NetworkTethering::kUnknown));
770 EXPECT_EQ(metrics::ConnectionType::kTetheredEthernet,
771 utils::GetConnectionType(kNetEthernet,
772 NetworkTethering::kConfirmed));
773 EXPECT_EQ(metrics::ConnectionType::kTetheredWifi,
774 utils::GetConnectionType(kNetWifi,
775 NetworkTethering::kConfirmed));
776
777 // Ensure that we don't report tethered ethernet unless it's confirmed.
778 EXPECT_EQ(metrics::ConnectionType::kEthernet,
779 utils::GetConnectionType(kNetEthernet,
780 NetworkTethering::kNotDetected));
781 EXPECT_EQ(metrics::ConnectionType::kEthernet,
782 utils::GetConnectionType(kNetEthernet,
783 NetworkTethering::kSuspected));
784 EXPECT_EQ(metrics::ConnectionType::kEthernet,
785 utils::GetConnectionType(kNetEthernet,
786 NetworkTethering::kUnknown));
787
788 // Ditto for tethered wifi.
789 EXPECT_EQ(metrics::ConnectionType::kWifi,
790 utils::GetConnectionType(kNetWifi,
791 NetworkTethering::kNotDetected));
792 EXPECT_EQ(metrics::ConnectionType::kWifi,
793 utils::GetConnectionType(kNetWifi,
794 NetworkTethering::kSuspected));
795 EXPECT_EQ(metrics::ConnectionType::kWifi,
796 utils::GetConnectionType(kNetWifi,
797 NetworkTethering::kUnknown));
798}
799
Allie Wood78750a42015-02-11 15:42:11 -0800800TEST(UtilsTest, GetMinorVersion) {
801 // Test GetMinorVersion by verifying that it parses the conf file and returns
802 // the correct value.
803 string contents = "PAYLOAD_MINOR_VERSION=1\n";
804 uint32_t minor_version;
805
806 base::ScopedTempDir temp_dir;
807 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
808
809 base::FilePath temp_file("update_engine.conf");
810 base::FilePath filepath = temp_dir.path().Append(temp_file);
811
812 ASSERT_TRUE(test_utils::WriteFileString(filepath.value(), contents.c_str()));
813 ASSERT_TRUE(utils::GetMinorVersion(filepath, &minor_version));
814 ASSERT_EQ(minor_version, 1);
815}
816
Nam T. Nguyen2b67a592014-12-03 14:56:00 -0800817static bool BoolMacroTestHelper() {
818 int i = 1;
819 unsigned int ui = 1;
820 bool b = 1;
821 std::unique_ptr<char> cptr(new char);
822
823 TEST_AND_RETURN_FALSE(i);
824 TEST_AND_RETURN_FALSE(ui);
825 TEST_AND_RETURN_FALSE(b);
826 TEST_AND_RETURN_FALSE(cptr);
827
828 TEST_AND_RETURN_FALSE_ERRNO(i);
829 TEST_AND_RETURN_FALSE_ERRNO(ui);
830 TEST_AND_RETURN_FALSE_ERRNO(b);
831 TEST_AND_RETURN_FALSE_ERRNO(cptr);
832
833 return true;
834}
835
836static void VoidMacroTestHelper(bool* ret) {
837 int i = 1;
838 unsigned int ui = 1;
839 bool b = 1;
840 std::unique_ptr<char> cptr(new char);
841
842 *ret = false;
843
844 TEST_AND_RETURN(i);
845 TEST_AND_RETURN(ui);
846 TEST_AND_RETURN(b);
847 TEST_AND_RETURN(cptr);
848
849 TEST_AND_RETURN_ERRNO(i);
850 TEST_AND_RETURN_ERRNO(ui);
851 TEST_AND_RETURN_ERRNO(b);
852 TEST_AND_RETURN_ERRNO(cptr);
853
854 *ret = true;
855}
856
857TEST(UtilsTest, TestMacros) {
858 bool void_test = false;
859 VoidMacroTestHelper(&void_test);
860 EXPECT_TRUE(void_test);
861
862 EXPECT_TRUE(BoolMacroTestHelper());
863}
864
adlr@google.com3defe6a2009-12-04 20:57:17 +0000865} // namespace chromeos_update_engine