blob: 53e4428abc41e342d7f791dbc025b1abf90eda3e [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 Vakulenko44cab302014-07-23 13:12:15 -07005#include <errno.h>
Ben Chan9abb7632014-08-07 00:10:53 -07006#include <stdint.h>
adlr@google.com3defe6a2009-12-04 20:57:17 +00007#include <sys/stat.h>
8#include <sys/types.h>
Darin Petkov5c0a8af2010-08-24 13:39:13 -07009
Andrew de los Reyescc92cd32010-10-05 16:56:14 -070010#include <map>
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080011#include <string>
adlr@google.com3defe6a2009-12-04 20:57:17 +000012#include <vector>
Darin Petkov5c0a8af2010-08-24 13:39:13 -070013
Darin Petkov8e447e02013-04-16 16:23:50 +020014#include <base/file_util.h>
Alex Deymoc1711e22014-08-08 13:16:23 -070015#include <base/files/file_path.h>
Alex Vakulenko75039d72014-03-25 12:36:28 -070016#include <base/strings/string_util.h>
17#include <base/strings/stringprintf.h>
Darin Petkovd3f8c892010-10-12 21:38:45 -070018#include <gtest/gtest.h>
19
David Zeuthen33bae492014-02-25 16:16:18 -080020#include "update_engine/fake_clock.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070021#include "update_engine/fake_system_state.h"
David Zeuthen33bae492014-02-25 16:16:18 -080022#include "update_engine/prefs.h"
Darin Petkovd3f8c892010-10-12 21:38:45 -070023#include "update_engine/test_utils.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000024#include "update_engine/utils.h"
25
Andrew de los Reyescc92cd32010-10-05 16:56:14 -070026using std::map;
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080027using std::string;
adlr@google.com3defe6a2009-12-04 20:57:17 +000028using std::vector;
29
30namespace chromeos_update_engine {
31
32class UtilsTest : public ::testing::Test { };
33
Chris Sosac1972482013-04-30 22:31:10 -070034TEST(UtilsTest, CanParseECVersion) {
Chris Sosac1972482013-04-30 22:31:10 -070035 // Should be able to parse and valid key value line.
J. Richard Barnette63137e52013-10-28 10:57:29 -070036 EXPECT_EQ("12345", utils::ParseECVersion("fw_version=12345"));
37 EXPECT_EQ("123456", utils::ParseECVersion(
38 "b=1231a fw_version=123456 a=fasd2"));
39 EXPECT_EQ("12345", utils::ParseECVersion("fw_version=12345"));
40 EXPECT_EQ("00VFA616", utils::ParseECVersion(
Chris Sosac1972482013-04-30 22:31:10 -070041 "vendor=\"sam\" fw_version=\"00VFA616\""));
42
43 // For invalid entries, should return the empty string.
J. Richard Barnette63137e52013-10-28 10:57:29 -070044 EXPECT_EQ("", utils::ParseECVersion("b=1231a fw_version a=fasd2"));
Chris Sosac1972482013-04-30 22:31:10 -070045}
46
J. Richard Barnette30842932013-10-28 15:04:23 -070047
48TEST(UtilsTest, KernelDeviceOfBootDevice) {
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -070049 EXPECT_EQ("", utils::KernelDeviceOfBootDevice(""));
J. Richard Barnette30842932013-10-28 15:04:23 -070050 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("foo"));
51 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda0"));
52 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda1"));
53 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda2"));
54 EXPECT_EQ("/dev/sda2", utils::KernelDeviceOfBootDevice("/dev/sda3"));
55 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda4"));
56 EXPECT_EQ("/dev/sda4", utils::KernelDeviceOfBootDevice("/dev/sda5"));
57 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda6"));
58 EXPECT_EQ("/dev/sda6", utils::KernelDeviceOfBootDevice("/dev/sda7"));
59 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda8"));
60 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/sda9"));
61
62 EXPECT_EQ("/dev/mmcblk0p2",
63 utils::KernelDeviceOfBootDevice("/dev/mmcblk0p3"));
64 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/mmcblk0p4"));
65
66 EXPECT_EQ("/dev/ubi2", utils::KernelDeviceOfBootDevice("/dev/ubi3"));
67 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/ubi4"));
68
69 EXPECT_EQ("/dev/mtdblock2",
70 utils::KernelDeviceOfBootDevice("/dev/ubiblock3_0"));
71 EXPECT_EQ("/dev/mtdblock4",
72 utils::KernelDeviceOfBootDevice("/dev/ubiblock5_0"));
73 EXPECT_EQ("/dev/mtdblock6",
74 utils::KernelDeviceOfBootDevice("/dev/ubiblock7_0"));
75 EXPECT_EQ("", utils::KernelDeviceOfBootDevice("/dev/ubiblock4_0"));
76}
77
78
adlr@google.com3defe6a2009-12-04 20:57:17 +000079TEST(UtilsTest, NormalizePathTest) {
80 EXPECT_EQ("", utils::NormalizePath("", false));
81 EXPECT_EQ("", utils::NormalizePath("", true));
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("foo", utils::NormalizePath("foo", false));
87 EXPECT_EQ("foo", utils::NormalizePath("foo", true));
88 EXPECT_EQ("/foo/", utils::NormalizePath("/foo//", false));
89 EXPECT_EQ("/foo", utils::NormalizePath("/foo//", true));
90 EXPECT_EQ("bar/baz/foo/adlr", utils::NormalizePath("bar/baz//foo/adlr",
91 false));
92 EXPECT_EQ("bar/baz/foo/adlr", utils::NormalizePath("bar/baz//foo/adlr",
93 true));
94 EXPECT_EQ("/bar/baz/foo/adlr/", utils::NormalizePath("/bar/baz//foo/adlr/",
95 false));
96 EXPECT_EQ("/bar/baz/foo/adlr", utils::NormalizePath("/bar/baz//foo/adlr/",
97 true));
98 EXPECT_EQ("\\\\", utils::NormalizePath("\\\\", false));
99 EXPECT_EQ("\\\\", utils::NormalizePath("\\\\", true));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700100 EXPECT_EQ("\\:/;$PATH\n\\",
101 utils::NormalizePath("\\://;$PATH\n\\", false));
102 EXPECT_EQ("\\:/;$PATH\n\\",
103 utils::NormalizePath("\\://;$PATH\n\\", true));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000104 EXPECT_EQ("/spaces s/ ok/s / / /",
105 utils::NormalizePath("/spaces s/ ok/s / / /", false));
106 EXPECT_EQ("/spaces s/ ok/s / / ",
107 utils::NormalizePath("/spaces s/ ok/s / / /", true));
108}
109
110TEST(UtilsTest, ReadFileFailure) {
111 vector<char> empty;
112 EXPECT_FALSE(utils::ReadFile("/this/doesn't/exist", &empty));
113}
114
Darin Petkov8e447e02013-04-16 16:23:50 +0200115TEST(UtilsTest, ReadFileChunk) {
Alex Vakulenko75039d72014-03-25 12:36:28 -0700116 base::FilePath file;
117 EXPECT_TRUE(base::CreateTemporaryFile(&file));
Darin Petkov8e447e02013-04-16 16:23:50 +0200118 ScopedPathUnlinker unlinker(file.value());
119 vector<char> data;
120 const size_t kSize = 1024 * 1024;
121 for (size_t i = 0; i < kSize; i++) {
122 data.push_back(i % 255);
123 }
124 EXPECT_TRUE(utils::WriteFile(file.value().c_str(), &data[0], data.size()));
125 vector<char> in_data;
126 EXPECT_TRUE(utils::ReadFileChunk(file.value().c_str(), kSize, 10, &in_data));
127 EXPECT_TRUE(in_data.empty());
128 EXPECT_TRUE(utils::ReadFileChunk(file.value().c_str(), 0, -1, &in_data));
129 EXPECT_TRUE(data == in_data);
130 in_data.clear();
131 EXPECT_TRUE(utils::ReadFileChunk(file.value().c_str(), 10, 20, &in_data));
132 EXPECT_TRUE(vector<char>(data.begin() + 10, data.begin() + 10 + 20) ==
133 in_data);
134}
135
adlr@google.com3defe6a2009-12-04 20:57:17 +0000136TEST(UtilsTest, ErrnoNumberAsStringTest) {
137 EXPECT_EQ("No such file or directory", utils::ErrnoNumberAsString(ENOENT));
138}
139
140TEST(UtilsTest, StringHasSuffixTest) {
141 EXPECT_TRUE(utils::StringHasSuffix("foo", "foo"));
142 EXPECT_TRUE(utils::StringHasSuffix("foo", "o"));
143 EXPECT_TRUE(utils::StringHasSuffix("", ""));
144 EXPECT_TRUE(utils::StringHasSuffix("abcabc", "abc"));
145 EXPECT_TRUE(utils::StringHasSuffix("adlrwashere", "ere"));
146 EXPECT_TRUE(utils::StringHasSuffix("abcdefgh", "gh"));
147 EXPECT_TRUE(utils::StringHasSuffix("abcdefgh", ""));
148 EXPECT_FALSE(utils::StringHasSuffix("foo", "afoo"));
149 EXPECT_FALSE(utils::StringHasSuffix("", "x"));
150 EXPECT_FALSE(utils::StringHasSuffix("abcdefgh", "fg"));
151 EXPECT_FALSE(utils::StringHasSuffix("abcdefgh", "ab"));
152}
153
154TEST(UtilsTest, StringHasPrefixTest) {
155 EXPECT_TRUE(utils::StringHasPrefix("foo", "foo"));
156 EXPECT_TRUE(utils::StringHasPrefix("foo", "f"));
157 EXPECT_TRUE(utils::StringHasPrefix("", ""));
158 EXPECT_TRUE(utils::StringHasPrefix("abcabc", "abc"));
159 EXPECT_TRUE(utils::StringHasPrefix("adlrwashere", "adl"));
160 EXPECT_TRUE(utils::StringHasPrefix("abcdefgh", "ab"));
161 EXPECT_TRUE(utils::StringHasPrefix("abcdefgh", ""));
162 EXPECT_FALSE(utils::StringHasPrefix("foo", "fooa"));
163 EXPECT_FALSE(utils::StringHasPrefix("", "x"));
164 EXPECT_FALSE(utils::StringHasPrefix("abcdefgh", "bc"));
165 EXPECT_FALSE(utils::StringHasPrefix("abcdefgh", "gh"));
166}
167
adlr@google.com3defe6a2009-12-04 20:57:17 +0000168TEST(UtilsTest, RecursiveUnlinkDirTest) {
Gilad Arnoldb4346a22013-07-16 06:44:45 -0700169 string first_dir_name;
170 ASSERT_TRUE(utils::MakeTempDirectory("RecursiveUnlinkDirTest-a-XXXXXX",
171 &first_dir_name));
172 ASSERT_EQ(0, Chmod(first_dir_name, 0755));
173 string second_dir_name;
174 ASSERT_TRUE(utils::MakeTempDirectory("RecursiveUnlinkDirTest-b-XXXXXX",
175 &second_dir_name));
176 ASSERT_EQ(0, Chmod(second_dir_name, 0755));
177
178 EXPECT_EQ(0, Symlink(string("../") + first_dir_name,
179 second_dir_name + "/link"));
180 EXPECT_EQ(0, System(string("echo hi > ") + second_dir_name + "/file"));
181 EXPECT_EQ(0, Mkdir(second_dir_name + "/dir", 0755));
182 EXPECT_EQ(0, System(string("echo ok > ") + second_dir_name + "/dir/subfile"));
183 EXPECT_TRUE(utils::RecursiveUnlinkDir(second_dir_name));
184 EXPECT_TRUE(utils::FileExists(first_dir_name.c_str()));
185 EXPECT_EQ(0, System(string("rm -rf ") + first_dir_name));
186 EXPECT_FALSE(utils::FileExists(second_dir_name.c_str()));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000187 EXPECT_TRUE(utils::RecursiveUnlinkDir("/something/that/doesnt/exist"));
188}
189
Darin Petkov002b2fe2010-11-22 13:53:22 -0800190TEST(UtilsTest, IsSymlinkTest) {
191 string temp_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800192 EXPECT_TRUE(utils::MakeTempDirectory("symlink-test.XXXXXX", &temp_dir));
Alex Deymo8d925292014-05-21 19:15:25 -0700193 string temp_file = temp_dir + "/temp-file";
Darin Petkov002b2fe2010-11-22 13:53:22 -0800194 EXPECT_TRUE(utils::WriteFile(temp_file.c_str(), "", 0));
Alex Deymo8d925292014-05-21 19:15:25 -0700195 string temp_symlink = temp_dir + "/temp-symlink";
Darin Petkov002b2fe2010-11-22 13:53:22 -0800196 EXPECT_EQ(0, symlink(temp_file.c_str(), temp_symlink.c_str()));
197 EXPECT_FALSE(utils::IsSymlink(temp_dir.c_str()));
198 EXPECT_FALSE(utils::IsSymlink(temp_file.c_str()));
199 EXPECT_TRUE(utils::IsSymlink(temp_symlink.c_str()));
200 EXPECT_FALSE(utils::IsSymlink("/non/existent/path"));
201 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
202}
203
Alex Deymo7dc4c502014-05-20 20:09:58 -0700204TEST(UtilsTest, IsDirTest) {
205 string temp_dir;
206 EXPECT_TRUE(utils::MakeTempDirectory("isdir-test.XXXXXX", &temp_dir));
Alex Deymo8d925292014-05-21 19:15:25 -0700207 string temp_file = temp_dir + "/temp-file";
Alex Deymo7dc4c502014-05-20 20:09:58 -0700208 EXPECT_TRUE(utils::WriteFile(temp_file.c_str(), "", 0));
Alex Deymo8d925292014-05-21 19:15:25 -0700209 string temp_symlink = temp_dir + "/temp-symlink";
Alex Deymo7dc4c502014-05-20 20:09:58 -0700210 EXPECT_EQ(0, symlink(temp_dir.c_str(), temp_symlink.c_str()));
211 EXPECT_TRUE(utils::IsDir(temp_dir.c_str()));
212 EXPECT_FALSE(utils::IsDir(temp_file.c_str()));
213 EXPECT_FALSE(utils::IsDir(temp_symlink.c_str()));
214 EXPECT_FALSE(utils::IsDir("/non/existent/path"));
215 ASSERT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
216}
217
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800218TEST(UtilsTest, GetDiskNameTest) {
219 EXPECT_EQ("/dev/sda", utils::GetDiskName("/dev/sda3"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700220 EXPECT_EQ("/dev/sdp", utils::GetDiskName("/dev/sdp1234"));
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800221 EXPECT_EQ("/dev/mmcblk0", utils::GetDiskName("/dev/mmcblk0p3"));
222 EXPECT_EQ("", utils::GetDiskName("/dev/mmcblk0p"));
223 EXPECT_EQ("", utils::GetDiskName("/dev/sda"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700224 EXPECT_EQ("/dev/ubiblock", utils::GetDiskName("/dev/ubiblock3_2"));
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800225 EXPECT_EQ("", utils::GetDiskName("/dev/foo/bar"));
226 EXPECT_EQ("", utils::GetDiskName("/"));
227 EXPECT_EQ("", utils::GetDiskName(""));
Darin Petkovf74eb652010-08-04 12:08:38 -0700228}
229
230TEST(UtilsTest, SysfsBlockDeviceTest) {
231 EXPECT_EQ("/sys/block/sda", utils::SysfsBlockDevice("/dev/sda"));
232 EXPECT_EQ("", utils::SysfsBlockDevice("/foo/sda"));
233 EXPECT_EQ("", utils::SysfsBlockDevice("/dev/foo/bar"));
234 EXPECT_EQ("", utils::SysfsBlockDevice("/"));
235 EXPECT_EQ("", utils::SysfsBlockDevice("./"));
236 EXPECT_EQ("", utils::SysfsBlockDevice(""));
237}
238
239TEST(UtilsTest, IsRemovableDeviceTest) {
240 EXPECT_FALSE(utils::IsRemovableDevice(""));
241 EXPECT_FALSE(utils::IsRemovableDevice("/dev/non-existent-device"));
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700242}
243
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800244TEST(UtilsTest, GetPartitionNumberTest) {
245 EXPECT_EQ(3, utils::GetPartitionNumber("/dev/sda3"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700246 EXPECT_EQ(3, utils::GetPartitionNumber("/dev/sdz3"));
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800247 EXPECT_EQ(123, utils::GetPartitionNumber("/dev/sda123"));
248 EXPECT_EQ(2, utils::GetPartitionNumber("/dev/mmcblk0p2"));
249 EXPECT_EQ(0, utils::GetPartitionNumber("/dev/mmcblk0p"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700250 EXPECT_EQ(3, utils::GetPartitionNumber("/dev/ubiblock3_2"));
Alex Vakulenko4f5b1442014-02-21 12:19:44 -0800251 EXPECT_EQ(0, utils::GetPartitionNumber(""));
252 EXPECT_EQ(0, utils::GetPartitionNumber("/"));
253 EXPECT_EQ(0, utils::GetPartitionNumber("/dev/"));
254 EXPECT_EQ(0, utils::GetPartitionNumber("/dev/sda"));
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700255 EXPECT_EQ(10, utils::GetPartitionNumber("/dev/loop10"));
256 EXPECT_EQ(11, utils::GetPartitionNumber("/dev/loop28p11"));
257 EXPECT_EQ(10, utils::GetPartitionNumber("/dev/loop10_0"));
258 EXPECT_EQ(11, utils::GetPartitionNumber("/dev/loop28p11_0"));
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700259}
260
Alex Vakulenkof3f85bb2014-03-26 16:36:35 -0700261TEST(UtilsTest, MakePartitionNameTest) {
262 EXPECT_EQ("/dev/sda4", utils::MakePartitionName("/dev/sda", 4));
263 EXPECT_EQ("/dev/sda123", utils::MakePartitionName("/dev/sda", 123));
264 EXPECT_EQ("/dev/mmcblk2", utils::MakePartitionName("/dev/mmcblk", 2));
265 EXPECT_EQ("/dev/mmcblk0p2", utils::MakePartitionName("/dev/mmcblk0", 2));
266 EXPECT_EQ("/dev/loop8", utils::MakePartitionName("/dev/loop", 8));
267 EXPECT_EQ("/dev/loop12p2", utils::MakePartitionName("/dev/loop12", 2));
268 EXPECT_EQ("/dev/ubiblock3_0", utils::MakePartitionName("/dev/ubiblock", 3));
269}
270
271
Chris Sosa4f8ee272012-11-30 13:01:54 -0800272TEST(UtilsTest, CompareCpuSharesTest) {
273 EXPECT_LT(utils::CompareCpuShares(utils::kCpuSharesLow,
274 utils::kCpuSharesNormal), 0);
275 EXPECT_GT(utils::CompareCpuShares(utils::kCpuSharesNormal,
276 utils::kCpuSharesLow), 0);
277 EXPECT_EQ(utils::CompareCpuShares(utils::kCpuSharesNormal,
278 utils::kCpuSharesNormal), 0);
279 EXPECT_GT(utils::CompareCpuShares(utils::kCpuSharesHigh,
280 utils::kCpuSharesNormal), 0);
Darin Petkovc6c135c2010-08-11 13:36:18 -0700281}
282
Darin Petkov5c0a8af2010-08-24 13:39:13 -0700283TEST(UtilsTest, FuzzIntTest) {
284 static const unsigned int kRanges[] = { 0, 1, 2, 20 };
285 for (size_t r = 0; r < arraysize(kRanges); ++r) {
286 unsigned int range = kRanges[r];
287 const int kValue = 50;
288 for (int tries = 0; tries < 100; ++tries) {
289 int value = utils::FuzzInt(kValue, range);
290 EXPECT_GE(value, kValue - range / 2);
291 EXPECT_LE(value, kValue + range - range / 2);
292 }
293 }
294}
295
Andrew de los Reyescc92cd32010-10-05 16:56:14 -0700296TEST(UtilsTest, ApplyMapTest) {
297 int initial_values[] = {1, 2, 3, 4, 6};
298 vector<int> collection(&initial_values[0],
299 initial_values + arraysize(initial_values));
300 EXPECT_EQ(arraysize(initial_values), collection.size());
301 int expected_values[] = {1, 2, 5, 4, 8};
302 map<int, int> value_map;
303 value_map[3] = 5;
304 value_map[6] = 8;
305 value_map[5] = 10;
306
307 utils::ApplyMap(&collection, value_map);
308
309 size_t index = 0;
310 for (vector<int>::iterator it = collection.begin(), e = collection.end();
311 it != e; ++it) {
312 EXPECT_EQ(expected_values[index++], *it);
313 }
314}
315
Darin Petkovd3f8c892010-10-12 21:38:45 -0700316TEST(UtilsTest, RunAsRootGetFilesystemSizeTest) {
317 string img;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800318 EXPECT_TRUE(utils::MakeTempFile("img.XXXXXX", &img, NULL));
Darin Petkovd3f8c892010-10-12 21:38:45 -0700319 ScopedPathUnlinker img_unlinker(img);
320 CreateExtImageAtPath(img, NULL);
321 // Extend the "partition" holding the file system from 10MiB to 20MiB.
322 EXPECT_EQ(0, System(base::StringPrintf(
323 "dd if=/dev/zero of=%s seek=20971519 bs=1 count=1",
324 img.c_str())));
325 EXPECT_EQ(20 * 1024 * 1024, utils::FileSize(img));
326 int block_count = 0;
327 int block_size = 0;
328 EXPECT_TRUE(utils::GetFilesystemSize(img, &block_count, &block_size));
329 EXPECT_EQ(4096, block_size);
330 EXPECT_EQ(10 * 1024 * 1024 / 4096, block_count);
331}
332
Chris Sosad317e402013-06-12 13:47:09 -0700333TEST(UtilsTest, GetInstallDevTest) {
334 string boot_dev = "/dev/sda5";
335 string install_dev;
336 EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev));
337 EXPECT_EQ(install_dev, "/dev/sda3");
338
339 boot_dev = "/dev/sda3";
340 EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev));
341 EXPECT_EQ(install_dev, "/dev/sda5");
342
343 boot_dev = "/dev/sda12";
344 EXPECT_FALSE(utils::GetInstallDev(boot_dev, &install_dev));
Liam McLoughlin049d1652013-07-31 18:47:46 -0700345
346 boot_dev = "/dev/ubiblock3_0";
347 EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev));
348 EXPECT_EQ(install_dev, "/dev/ubiblock5_0");
349
350 boot_dev = "/dev/ubiblock5_0";
351 EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev));
352 EXPECT_EQ(install_dev, "/dev/ubiblock3_0");
353
354 boot_dev = "/dev/ubiblock12_0";
355 EXPECT_FALSE(utils::GetInstallDev(boot_dev, &install_dev));
Chris Sosad317e402013-06-12 13:47:09 -0700356}
357
Andrew de los Reyes712b3ac2011-01-07 13:47:52 -0800358namespace {
Alex Deymo032e7722014-03-25 17:53:56 -0700359void GetFileFormatTester(const string& expected,
Ben Chan9abb7632014-08-07 00:10:53 -0700360 const vector<uint8_t>& contents) {
Alex Deymo032e7722014-03-25 17:53:56 -0700361 ScopedTempFile file;
362 ASSERT_TRUE(utils::WriteFile(file.GetPath().c_str(),
363 reinterpret_cast<const char*>(contents.data()),
364 contents.size()));
365 EXPECT_EQ(expected, utils::GetFileFormat(file.GetPath()));
366}
367}
368
369TEST(UtilsTest, GetFileFormatTest) {
370 EXPECT_EQ("File not found.", utils::GetFileFormat("/path/to/nowhere"));
Ben Chan9abb7632014-08-07 00:10:53 -0700371 GetFileFormatTester("data", vector<uint8_t>{1, 2, 3, 4, 5, 6, 7, 8});
372 GetFileFormatTester("ELF", vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46});
Alex Deymo032e7722014-03-25 17:53:56 -0700373
374 // Real tests from cros_installer on different boards.
375 // ELF 32-bit LSB executable, Intel 80386
376 GetFileFormatTester(
377 "ELF 32-bit little-endian x86",
Ben Chan9abb7632014-08-07 00:10:53 -0700378 vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00,
379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00,
381 0x90, 0x83, 0x04, 0x08, 0x34, 0x00, 0x00, 0x00});
Alex Deymo032e7722014-03-25 17:53:56 -0700382
Alex Deymoc1711e22014-08-08 13:16:23 -0700383 // ELF 32-bit LSB executable, MIPS
384 GetFileFormatTester(
385 "ELF 32-bit little-endian mips",
386 vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00,
387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
388 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
389 0xc0, 0x12, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00});
390
Alex Deymo032e7722014-03-25 17:53:56 -0700391 // ELF 32-bit LSB executable, ARM
392 GetFileFormatTester(
393 "ELF 32-bit little-endian arm",
Ben Chan9abb7632014-08-07 00:10:53 -0700394 vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00,
395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396 0x02, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00,
397 0x85, 0x8b, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00});
Alex Deymo032e7722014-03-25 17:53:56 -0700398
399 // ELF 64-bit LSB executable, x86-64
400 GetFileFormatTester(
401 "ELF 64-bit little-endian x86-64",
Ben Chan9abb7632014-08-07 00:10:53 -0700402 vector<uint8_t>{0x7f, 0x45, 0x4c, 0x46, 0x02, 0x01, 0x01, 0x00,
403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 0x02, 0x00, 0x3e, 0x00, 0x01, 0x00, 0x00, 0x00,
405 0xb0, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00});
Alex Deymo032e7722014-03-25 17:53:56 -0700406}
407
408namespace {
Andrew de los Reyes712b3ac2011-01-07 13:47:52 -0800409gboolean TerminateScheduleCrashReporterUploadTest(void* arg) {
410 GMainLoop* loop = reinterpret_cast<GMainLoop*>(arg);
411 g_main_loop_quit(loop);
412 return FALSE; // Don't call this callback again
413}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700414} // namespace
Andrew de los Reyes712b3ac2011-01-07 13:47:52 -0800415
416TEST(UtilsTest, ScheduleCrashReporterUploadTest) {
417 // Not much to test. At least this tests for memory leaks, crashes,
418 // log errors.
419 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
420 utils::ScheduleCrashReporterUpload();
421 g_timeout_add_seconds(1, &TerminateScheduleCrashReporterUploadTest, loop);
422 g_main_loop_run(loop);
423 g_main_loop_unref(loop);
424}
425
David Zeuthen674c3182013-04-18 14:05:20 -0700426TEST(UtilsTest, FormatTimeDeltaTest) {
427 // utils::FormatTimeDelta() is not locale-aware (it's only used for logging
428 // which is not localized) so we only need to test the C locale
429 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromMilliseconds(100)),
430 "0.1s");
431 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(0)),
432 "0s");
433 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(1)),
434 "1s");
435 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(59)),
436 "59s");
437 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(60)),
438 "1m0s");
439 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(61)),
440 "1m1s");
441 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(90)),
442 "1m30s");
443 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(1205)),
444 "20m5s");
445 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(3600)),
446 "1h0m0s");
447 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(3601)),
448 "1h0m1s");
449 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(3661)),
450 "1h1m1s");
451 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(7261)),
452 "2h1m1s");
453 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(86400)),
454 "1d0h0m0s");
455 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(86401)),
456 "1d0h0m1s");
457 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(200000)),
458 "2d7h33m20s");
459 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(200000) +
460 base::TimeDelta::FromMilliseconds(1)),
461 "2d7h33m20.001s");
462}
463
David Zeuthen27a48bc2013-08-06 12:06:29 -0700464TEST(UtilsTest, TimeFromStructTimespecTest) {
465 struct timespec ts;
466
467 // Unix epoch (Thursday 00:00:00 UTC on Jan 1, 1970)
468 ts = (struct timespec) {.tv_sec = 0, .tv_nsec = 0};
469 EXPECT_EQ(base::Time::UnixEpoch(), utils::TimeFromStructTimespec(&ts));
470
471 // 42 ms after the Unix billennium (Sunday 01:46:40 UTC on September 9, 2001)
472 ts = (struct timespec) {.tv_sec = 1000 * 1000 * 1000,
473 .tv_nsec = 42 * 1000 * 1000};
474 base::Time::Exploded exploded = (base::Time::Exploded) {
475 .year = 2001, .month = 9, .day_of_week = 0, .day_of_month = 9,
476 .hour = 1, .minute = 46, .second = 40, .millisecond = 42};
477 EXPECT_EQ(base::Time::FromUTCExploded(exploded),
478 utils::TimeFromStructTimespec(&ts));
479}
480
David Zeuthene7f89172013-10-31 10:21:04 -0700481TEST(UtilsTest, DecodeAndStoreBase64String) {
482 base::FilePath path;
483
484 // Ensure we return false on empty strings or invalid base64.
485 EXPECT_FALSE(utils::DecodeAndStoreBase64String("", &path));
486 EXPECT_FALSE(utils::DecodeAndStoreBase64String("not valid base64", &path));
487
488 // Pass known base64 and check that it matches. This string was generated
489 // the following way:
490 //
491 // $ echo "Update Engine" | base64
492 // VXBkYXRlIEVuZ2luZQo=
493 EXPECT_TRUE(utils::DecodeAndStoreBase64String("VXBkYXRlIEVuZ2luZQo=",
494 &path));
495 ScopedPathUnlinker unlinker(path.value());
496 string expected_contents = "Update Engine\n";
497 string contents;
498 EXPECT_TRUE(utils::ReadFile(path.value(), &contents));
499 EXPECT_EQ(contents, expected_contents);
500 EXPECT_EQ(utils::FileSize(path.value()), expected_contents.size());
501}
502
David Zeuthen639aa362014-02-03 16:23:44 -0800503TEST(UtilsTest, ConvertToOmahaInstallDate) {
504 // The Omaha Epoch starts at Jan 1, 2007 0:00 PST which is a
505 // Monday. In Unix time, this point in time is easily obtained via
506 // the date(1) command like this:
507 //
508 // $ date +"%s" --date="Jan 1, 2007 0:00 PST"
509 const time_t omaha_epoch = 1167638400;
510 int value;
511
512 // Points in time *on and after* the Omaha epoch should not fail.
513 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
514 base::Time::FromTimeT(omaha_epoch), &value));
515 EXPECT_GE(value, 0);
516
517 // Anything before the Omaha epoch should fail. We test it for two points.
518 EXPECT_FALSE(utils::ConvertToOmahaInstallDate(
519 base::Time::FromTimeT(omaha_epoch - 1), &value));
520 EXPECT_FALSE(utils::ConvertToOmahaInstallDate(
521 base::Time::FromTimeT(omaha_epoch - 100*24*3600), &value));
522
523 // Check that we jump from 0 to 7 exactly on the one-week mark, e.g.
524 // on Jan 8, 2007 0:00 PST.
525 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
526 base::Time::FromTimeT(omaha_epoch + 7*24*3600 - 1), &value));
527 EXPECT_EQ(value, 0);
528 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
529 base::Time::FromTimeT(omaha_epoch + 7*24*3600), &value));
530 EXPECT_EQ(value, 7);
531
532 // Check a couple of more values.
533 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
534 base::Time::FromTimeT(omaha_epoch + 10*24*3600), &value));
535 EXPECT_EQ(value, 7);
536 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
537 base::Time::FromTimeT(omaha_epoch + 20*24*3600), &value));
538 EXPECT_EQ(value, 14);
539 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
540 base::Time::FromTimeT(omaha_epoch + 26*24*3600), &value));
541 EXPECT_EQ(value, 21);
542 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
543 base::Time::FromTimeT(omaha_epoch + 29*24*3600), &value));
544 EXPECT_EQ(value, 28);
545
546 // The date Jun 4, 2007 0:00 PDT is a Monday and is hence a point
547 // where the Omaha InstallDate jumps 7 days. Its unix time is
548 // 1180940400. Notably, this is a point in time where Daylight
549 // Savings Time (DST) was is in effect (e.g. it's PDT, not PST).
550 //
551 // Note that as utils::ConvertToOmahaInstallDate() _deliberately_
552 // ignores DST (as it's hard to implement in a thread-safe way using
553 // glibc, see comments in utils.h) we have to fudge by the DST
554 // offset which is one hour. Conveniently, if the function were
555 // someday modified to be DST aware, this test would have to be
556 // modified as well.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700557 const time_t dst_time = 1180940400; // Jun 4, 2007 0:00 PDT.
David Zeuthen639aa362014-02-03 16:23:44 -0800558 const time_t fudge = 3600;
559 int value1, value2;
560 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
561 base::Time::FromTimeT(dst_time + fudge - 1), &value1));
562 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
563 base::Time::FromTimeT(dst_time + fudge), &value2));
564 EXPECT_EQ(value1, value2 - 7);
565}
566
David Zeuthen33bae492014-02-25 16:16:18 -0800567TEST(UtilsTest, WallclockDurationHelper) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700568 FakeSystemState fake_system_state;
David Zeuthen33bae492014-02-25 16:16:18 -0800569 FakeClock fake_clock;
570 base::TimeDelta duration;
571 string state_variable_key = "test-prefs";
572 string temp_dir;
573 Prefs fake_prefs;
574
575 EXPECT_TRUE(utils::MakeTempDirectory("DurationPrefs.XXXXXX", &temp_dir));
576 fake_prefs.Init(base::FilePath(temp_dir));
577
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700578 fake_system_state.set_clock(&fake_clock);
579 fake_system_state.set_prefs(&fake_prefs);
David Zeuthen33bae492014-02-25 16:16:18 -0800580
581 // Initialize wallclock to 1 sec.
582 fake_clock.SetWallclockTime(base::Time::FromInternalValue(1000000));
583
584 // First time called so no previous measurement available.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700585 EXPECT_FALSE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800586 state_variable_key,
587 &duration));
588
589 // Next time, we should get zero since the clock didn't advance.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700590 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800591 state_variable_key,
592 &duration));
593 EXPECT_EQ(duration.InSeconds(), 0);
594
595 // We can also call it as many times as we want with it being
596 // considered a failure.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700597 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800598 state_variable_key,
599 &duration));
600 EXPECT_EQ(duration.InSeconds(), 0);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700601 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800602 state_variable_key,
603 &duration));
604 EXPECT_EQ(duration.InSeconds(), 0);
605
606 // Advance the clock one second, then we should get 1 sec on the
607 // next call and 0 sec on the subsequent call.
608 fake_clock.SetWallclockTime(base::Time::FromInternalValue(2000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700609 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800610 state_variable_key,
611 &duration));
612 EXPECT_EQ(duration.InSeconds(), 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700613 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800614 state_variable_key,
615 &duration));
616 EXPECT_EQ(duration.InSeconds(), 0);
617
618 // Advance clock two seconds and we should get 2 sec and then 0 sec.
619 fake_clock.SetWallclockTime(base::Time::FromInternalValue(4000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700620 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800621 state_variable_key,
622 &duration));
623 EXPECT_EQ(duration.InSeconds(), 2);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700624 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800625 state_variable_key,
626 &duration));
627 EXPECT_EQ(duration.InSeconds(), 0);
628
629 // There's a possibility that the wallclock can go backwards (NTP
630 // adjustments, for example) so check that we properly handle this
631 // case.
632 fake_clock.SetWallclockTime(base::Time::FromInternalValue(3000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700633 EXPECT_FALSE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800634 state_variable_key,
635 &duration));
636 fake_clock.SetWallclockTime(base::Time::FromInternalValue(4000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700637 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800638 state_variable_key,
639 &duration));
640 EXPECT_EQ(duration.InSeconds(), 1);
641
642 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
643}
644
645TEST(UtilsTest, MonotonicDurationHelper) {
646 int64_t storage = 0;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700647 FakeSystemState fake_system_state;
David Zeuthen33bae492014-02-25 16:16:18 -0800648 FakeClock fake_clock;
649 base::TimeDelta duration;
650
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700651 fake_system_state.set_clock(&fake_clock);
David Zeuthen33bae492014-02-25 16:16:18 -0800652
653 // Initialize monotonic clock to 1 sec.
654 fake_clock.SetMonotonicTime(base::Time::FromInternalValue(1000000));
655
656 // First time called so no previous measurement available.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700657 EXPECT_FALSE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800658 &storage,
659 &duration));
660
661 // Next time, we should get zero since the clock didn't advance.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700662 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800663 &storage,
664 &duration));
665 EXPECT_EQ(duration.InSeconds(), 0);
666
667 // We can also call it as many times as we want with it being
668 // considered a failure.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700669 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800670 &storage,
671 &duration));
672 EXPECT_EQ(duration.InSeconds(), 0);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700673 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800674 &storage,
675 &duration));
676 EXPECT_EQ(duration.InSeconds(), 0);
677
678 // Advance the clock one second, then we should get 1 sec on the
679 // next call and 0 sec on the subsequent call.
680 fake_clock.SetMonotonicTime(base::Time::FromInternalValue(2000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700681 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800682 &storage,
683 &duration));
684 EXPECT_EQ(duration.InSeconds(), 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700685 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800686 &storage,
687 &duration));
688 EXPECT_EQ(duration.InSeconds(), 0);
689
690 // Advance clock two seconds and we should get 2 sec and then 0 sec.
691 fake_clock.SetMonotonicTime(base::Time::FromInternalValue(4000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700692 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800693 &storage,
694 &duration));
695 EXPECT_EQ(duration.InSeconds(), 2);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700696 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800697 &storage,
698 &duration));
699 EXPECT_EQ(duration.InSeconds(), 0);
700}
701
David Zeuthenb281f072014-04-02 10:20:19 -0700702TEST(UtilsTest, GetConnectionType) {
703 // Check that expected combinations map to the right value.
704 EXPECT_EQ(metrics::ConnectionType::kUnknown,
705 utils::GetConnectionType(kNetUnknown,
706 NetworkTethering::kUnknown));
707 EXPECT_EQ(metrics::ConnectionType::kEthernet,
708 utils::GetConnectionType(kNetEthernet,
709 NetworkTethering::kUnknown));
710 EXPECT_EQ(metrics::ConnectionType::kWifi,
711 utils::GetConnectionType(kNetWifi,
712 NetworkTethering::kUnknown));
713 EXPECT_EQ(metrics::ConnectionType::kWimax,
714 utils::GetConnectionType(kNetWimax,
715 NetworkTethering::kUnknown));
716 EXPECT_EQ(metrics::ConnectionType::kBluetooth,
717 utils::GetConnectionType(kNetBluetooth,
718 NetworkTethering::kUnknown));
719 EXPECT_EQ(metrics::ConnectionType::kCellular,
720 utils::GetConnectionType(kNetCellular,
721 NetworkTethering::kUnknown));
722 EXPECT_EQ(metrics::ConnectionType::kTetheredEthernet,
723 utils::GetConnectionType(kNetEthernet,
724 NetworkTethering::kConfirmed));
725 EXPECT_EQ(metrics::ConnectionType::kTetheredWifi,
726 utils::GetConnectionType(kNetWifi,
727 NetworkTethering::kConfirmed));
728
729 // Ensure that we don't report tethered ethernet unless it's confirmed.
730 EXPECT_EQ(metrics::ConnectionType::kEthernet,
731 utils::GetConnectionType(kNetEthernet,
732 NetworkTethering::kNotDetected));
733 EXPECT_EQ(metrics::ConnectionType::kEthernet,
734 utils::GetConnectionType(kNetEthernet,
735 NetworkTethering::kSuspected));
736 EXPECT_EQ(metrics::ConnectionType::kEthernet,
737 utils::GetConnectionType(kNetEthernet,
738 NetworkTethering::kUnknown));
739
740 // Ditto for tethered wifi.
741 EXPECT_EQ(metrics::ConnectionType::kWifi,
742 utils::GetConnectionType(kNetWifi,
743 NetworkTethering::kNotDetected));
744 EXPECT_EQ(metrics::ConnectionType::kWifi,
745 utils::GetConnectionType(kNetWifi,
746 NetworkTethering::kSuspected));
747 EXPECT_EQ(metrics::ConnectionType::kWifi,
748 utils::GetConnectionType(kNetWifi,
749 NetworkTethering::kUnknown));
750}
751
adlr@google.com3defe6a2009-12-04 20:57:17 +0000752} // namespace chromeos_update_engine