blob: 4618bebd44ee07f97d06bc0a05576b4672ebc61b [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;
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700318 EXPECT_TRUE(utils::MakeTempFile("img.XXXXXX", &img, nullptr));
Darin Petkovd3f8c892010-10-12 21:38:45 -0700319 ScopedPathUnlinker img_unlinker(img);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700320 CreateExtImageAtPath(img, nullptr);
Darin Petkovd3f8c892010-10-12 21:38:45 -0700321 // 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");
David Zeuthen973449e2014-08-18 16:18:23 -0400462 EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(-1)),
463 "-1s");
David Zeuthen674c3182013-04-18 14:05:20 -0700464}
465
David Zeuthen27a48bc2013-08-06 12:06:29 -0700466TEST(UtilsTest, TimeFromStructTimespecTest) {
467 struct timespec ts;
468
469 // Unix epoch (Thursday 00:00:00 UTC on Jan 1, 1970)
470 ts = (struct timespec) {.tv_sec = 0, .tv_nsec = 0};
471 EXPECT_EQ(base::Time::UnixEpoch(), utils::TimeFromStructTimespec(&ts));
472
473 // 42 ms after the Unix billennium (Sunday 01:46:40 UTC on September 9, 2001)
474 ts = (struct timespec) {.tv_sec = 1000 * 1000 * 1000,
475 .tv_nsec = 42 * 1000 * 1000};
476 base::Time::Exploded exploded = (base::Time::Exploded) {
477 .year = 2001, .month = 9, .day_of_week = 0, .day_of_month = 9,
478 .hour = 1, .minute = 46, .second = 40, .millisecond = 42};
479 EXPECT_EQ(base::Time::FromUTCExploded(exploded),
480 utils::TimeFromStructTimespec(&ts));
481}
482
David Zeuthene7f89172013-10-31 10:21:04 -0700483TEST(UtilsTest, DecodeAndStoreBase64String) {
484 base::FilePath path;
485
486 // Ensure we return false on empty strings or invalid base64.
487 EXPECT_FALSE(utils::DecodeAndStoreBase64String("", &path));
488 EXPECT_FALSE(utils::DecodeAndStoreBase64String("not valid base64", &path));
489
490 // Pass known base64 and check that it matches. This string was generated
491 // the following way:
492 //
493 // $ echo "Update Engine" | base64
494 // VXBkYXRlIEVuZ2luZQo=
495 EXPECT_TRUE(utils::DecodeAndStoreBase64String("VXBkYXRlIEVuZ2luZQo=",
496 &path));
497 ScopedPathUnlinker unlinker(path.value());
498 string expected_contents = "Update Engine\n";
499 string contents;
500 EXPECT_TRUE(utils::ReadFile(path.value(), &contents));
501 EXPECT_EQ(contents, expected_contents);
502 EXPECT_EQ(utils::FileSize(path.value()), expected_contents.size());
503}
504
David Zeuthen639aa362014-02-03 16:23:44 -0800505TEST(UtilsTest, ConvertToOmahaInstallDate) {
506 // The Omaha Epoch starts at Jan 1, 2007 0:00 PST which is a
507 // Monday. In Unix time, this point in time is easily obtained via
508 // the date(1) command like this:
509 //
510 // $ date +"%s" --date="Jan 1, 2007 0:00 PST"
511 const time_t omaha_epoch = 1167638400;
512 int value;
513
514 // Points in time *on and after* the Omaha epoch should not fail.
515 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
516 base::Time::FromTimeT(omaha_epoch), &value));
517 EXPECT_GE(value, 0);
518
519 // Anything before the Omaha epoch should fail. We test it for two points.
520 EXPECT_FALSE(utils::ConvertToOmahaInstallDate(
521 base::Time::FromTimeT(omaha_epoch - 1), &value));
522 EXPECT_FALSE(utils::ConvertToOmahaInstallDate(
523 base::Time::FromTimeT(omaha_epoch - 100*24*3600), &value));
524
525 // Check that we jump from 0 to 7 exactly on the one-week mark, e.g.
526 // on Jan 8, 2007 0:00 PST.
527 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
528 base::Time::FromTimeT(omaha_epoch + 7*24*3600 - 1), &value));
529 EXPECT_EQ(value, 0);
530 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
531 base::Time::FromTimeT(omaha_epoch + 7*24*3600), &value));
532 EXPECT_EQ(value, 7);
533
534 // Check a couple of more values.
535 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
536 base::Time::FromTimeT(omaha_epoch + 10*24*3600), &value));
537 EXPECT_EQ(value, 7);
538 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
539 base::Time::FromTimeT(omaha_epoch + 20*24*3600), &value));
540 EXPECT_EQ(value, 14);
541 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
542 base::Time::FromTimeT(omaha_epoch + 26*24*3600), &value));
543 EXPECT_EQ(value, 21);
544 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
545 base::Time::FromTimeT(omaha_epoch + 29*24*3600), &value));
546 EXPECT_EQ(value, 28);
547
548 // The date Jun 4, 2007 0:00 PDT is a Monday and is hence a point
549 // where the Omaha InstallDate jumps 7 days. Its unix time is
550 // 1180940400. Notably, this is a point in time where Daylight
551 // Savings Time (DST) was is in effect (e.g. it's PDT, not PST).
552 //
553 // Note that as utils::ConvertToOmahaInstallDate() _deliberately_
554 // ignores DST (as it's hard to implement in a thread-safe way using
555 // glibc, see comments in utils.h) we have to fudge by the DST
556 // offset which is one hour. Conveniently, if the function were
557 // someday modified to be DST aware, this test would have to be
558 // modified as well.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700559 const time_t dst_time = 1180940400; // Jun 4, 2007 0:00 PDT.
David Zeuthen639aa362014-02-03 16:23:44 -0800560 const time_t fudge = 3600;
561 int value1, value2;
562 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
563 base::Time::FromTimeT(dst_time + fudge - 1), &value1));
564 EXPECT_TRUE(utils::ConvertToOmahaInstallDate(
565 base::Time::FromTimeT(dst_time + fudge), &value2));
566 EXPECT_EQ(value1, value2 - 7);
567}
568
David Zeuthen33bae492014-02-25 16:16:18 -0800569TEST(UtilsTest, WallclockDurationHelper) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700570 FakeSystemState fake_system_state;
David Zeuthen33bae492014-02-25 16:16:18 -0800571 FakeClock fake_clock;
572 base::TimeDelta duration;
573 string state_variable_key = "test-prefs";
574 string temp_dir;
575 Prefs fake_prefs;
576
577 EXPECT_TRUE(utils::MakeTempDirectory("DurationPrefs.XXXXXX", &temp_dir));
578 fake_prefs.Init(base::FilePath(temp_dir));
579
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700580 fake_system_state.set_clock(&fake_clock);
581 fake_system_state.set_prefs(&fake_prefs);
David Zeuthen33bae492014-02-25 16:16:18 -0800582
583 // Initialize wallclock to 1 sec.
584 fake_clock.SetWallclockTime(base::Time::FromInternalValue(1000000));
585
586 // First time called so no previous measurement available.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700587 EXPECT_FALSE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800588 state_variable_key,
589 &duration));
590
591 // Next time, we should get zero since the clock didn't advance.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700592 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800593 state_variable_key,
594 &duration));
595 EXPECT_EQ(duration.InSeconds(), 0);
596
597 // We can also call it as many times as we want with it being
598 // considered a failure.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700599 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800600 state_variable_key,
601 &duration));
602 EXPECT_EQ(duration.InSeconds(), 0);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700603 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800604 state_variable_key,
605 &duration));
606 EXPECT_EQ(duration.InSeconds(), 0);
607
608 // Advance the clock one second, then we should get 1 sec on the
609 // next call and 0 sec on the subsequent call.
610 fake_clock.SetWallclockTime(base::Time::FromInternalValue(2000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700611 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800612 state_variable_key,
613 &duration));
614 EXPECT_EQ(duration.InSeconds(), 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700615 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800616 state_variable_key,
617 &duration));
618 EXPECT_EQ(duration.InSeconds(), 0);
619
620 // Advance clock two seconds and we should get 2 sec and then 0 sec.
621 fake_clock.SetWallclockTime(base::Time::FromInternalValue(4000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700622 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800623 state_variable_key,
624 &duration));
625 EXPECT_EQ(duration.InSeconds(), 2);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700626 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800627 state_variable_key,
628 &duration));
629 EXPECT_EQ(duration.InSeconds(), 0);
630
631 // There's a possibility that the wallclock can go backwards (NTP
632 // adjustments, for example) so check that we properly handle this
633 // case.
634 fake_clock.SetWallclockTime(base::Time::FromInternalValue(3000000));
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 fake_clock.SetWallclockTime(base::Time::FromInternalValue(4000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700639 EXPECT_TRUE(utils::WallclockDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800640 state_variable_key,
641 &duration));
642 EXPECT_EQ(duration.InSeconds(), 1);
643
644 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
645}
646
647TEST(UtilsTest, MonotonicDurationHelper) {
648 int64_t storage = 0;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700649 FakeSystemState fake_system_state;
David Zeuthen33bae492014-02-25 16:16:18 -0800650 FakeClock fake_clock;
651 base::TimeDelta duration;
652
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700653 fake_system_state.set_clock(&fake_clock);
David Zeuthen33bae492014-02-25 16:16:18 -0800654
655 // Initialize monotonic clock to 1 sec.
656 fake_clock.SetMonotonicTime(base::Time::FromInternalValue(1000000));
657
658 // First time called so no previous measurement available.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700659 EXPECT_FALSE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800660 &storage,
661 &duration));
662
663 // Next time, we should get zero since the clock didn't advance.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700664 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800665 &storage,
666 &duration));
667 EXPECT_EQ(duration.InSeconds(), 0);
668
669 // We can also call it as many times as we want with it being
670 // considered a failure.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700671 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800672 &storage,
673 &duration));
674 EXPECT_EQ(duration.InSeconds(), 0);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700675 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800676 &storage,
677 &duration));
678 EXPECT_EQ(duration.InSeconds(), 0);
679
680 // Advance the clock one second, then we should get 1 sec on the
681 // next call and 0 sec on the subsequent call.
682 fake_clock.SetMonotonicTime(base::Time::FromInternalValue(2000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700683 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800684 &storage,
685 &duration));
686 EXPECT_EQ(duration.InSeconds(), 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700687 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800688 &storage,
689 &duration));
690 EXPECT_EQ(duration.InSeconds(), 0);
691
692 // Advance clock two seconds and we should get 2 sec and then 0 sec.
693 fake_clock.SetMonotonicTime(base::Time::FromInternalValue(4000000));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700694 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800695 &storage,
696 &duration));
697 EXPECT_EQ(duration.InSeconds(), 2);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700698 EXPECT_TRUE(utils::MonotonicDurationHelper(&fake_system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800699 &storage,
700 &duration));
701 EXPECT_EQ(duration.InSeconds(), 0);
702}
703
David Zeuthenb281f072014-04-02 10:20:19 -0700704TEST(UtilsTest, GetConnectionType) {
705 // Check that expected combinations map to the right value.
706 EXPECT_EQ(metrics::ConnectionType::kUnknown,
707 utils::GetConnectionType(kNetUnknown,
708 NetworkTethering::kUnknown));
709 EXPECT_EQ(metrics::ConnectionType::kEthernet,
710 utils::GetConnectionType(kNetEthernet,
711 NetworkTethering::kUnknown));
712 EXPECT_EQ(metrics::ConnectionType::kWifi,
713 utils::GetConnectionType(kNetWifi,
714 NetworkTethering::kUnknown));
715 EXPECT_EQ(metrics::ConnectionType::kWimax,
716 utils::GetConnectionType(kNetWimax,
717 NetworkTethering::kUnknown));
718 EXPECT_EQ(metrics::ConnectionType::kBluetooth,
719 utils::GetConnectionType(kNetBluetooth,
720 NetworkTethering::kUnknown));
721 EXPECT_EQ(metrics::ConnectionType::kCellular,
722 utils::GetConnectionType(kNetCellular,
723 NetworkTethering::kUnknown));
724 EXPECT_EQ(metrics::ConnectionType::kTetheredEthernet,
725 utils::GetConnectionType(kNetEthernet,
726 NetworkTethering::kConfirmed));
727 EXPECT_EQ(metrics::ConnectionType::kTetheredWifi,
728 utils::GetConnectionType(kNetWifi,
729 NetworkTethering::kConfirmed));
730
731 // Ensure that we don't report tethered ethernet unless it's confirmed.
732 EXPECT_EQ(metrics::ConnectionType::kEthernet,
733 utils::GetConnectionType(kNetEthernet,
734 NetworkTethering::kNotDetected));
735 EXPECT_EQ(metrics::ConnectionType::kEthernet,
736 utils::GetConnectionType(kNetEthernet,
737 NetworkTethering::kSuspected));
738 EXPECT_EQ(metrics::ConnectionType::kEthernet,
739 utils::GetConnectionType(kNetEthernet,
740 NetworkTethering::kUnknown));
741
742 // Ditto for tethered wifi.
743 EXPECT_EQ(metrics::ConnectionType::kWifi,
744 utils::GetConnectionType(kNetWifi,
745 NetworkTethering::kNotDetected));
746 EXPECT_EQ(metrics::ConnectionType::kWifi,
747 utils::GetConnectionType(kNetWifi,
748 NetworkTethering::kSuspected));
749 EXPECT_EQ(metrics::ConnectionType::kWifi,
750 utils::GetConnectionType(kNetWifi,
751 NetworkTethering::kUnknown));
752}
753
adlr@google.com3defe6a2009-12-04 20:57:17 +0000754} // namespace chromeos_update_engine