| Mike Frysinger | 8155d08 | 2012-04-06 15:23:18 -0400 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. | 
| adlr@google.com | 3defe6a | 2009-12-04 20:57:17 +0000 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be | 
 | 3 | // found in the LICENSE file. | 
 | 4 |  | 
 | 5 | #include <sys/stat.h> | 
 | 6 | #include <sys/types.h> | 
 | 7 | #include <errno.h> | 
| Darin Petkov | 5c0a8af | 2010-08-24 13:39:13 -0700 | [diff] [blame] | 8 |  | 
| Andrew de los Reyes | cc92cd3 | 2010-10-05 16:56:14 -0700 | [diff] [blame] | 9 | #include <map> | 
| Andrew de los Reyes | 4fe15d0 | 2009-12-10 19:01:36 -0800 | [diff] [blame] | 10 | #include <string> | 
| adlr@google.com | 3defe6a | 2009-12-04 20:57:17 +0000 | [diff] [blame] | 11 | #include <vector> | 
| Darin Petkov | 5c0a8af | 2010-08-24 13:39:13 -0700 | [diff] [blame] | 12 |  | 
| Darin Petkov | 8e447e0 | 2013-04-16 16:23:50 +0200 | [diff] [blame] | 13 | #include <base/file_path.h> | 
 | 14 | #include <base/file_util.h> | 
| Darin Petkov | d3f8c89 | 2010-10-12 21:38:45 -0700 | [diff] [blame] | 15 | #include <base/string_util.h> | 
| Mike Frysinger | 8155d08 | 2012-04-06 15:23:18 -0400 | [diff] [blame] | 16 | #include <base/stringprintf.h> | 
| Darin Petkov | d3f8c89 | 2010-10-12 21:38:45 -0700 | [diff] [blame] | 17 | #include <gtest/gtest.h> | 
 | 18 |  | 
 | 19 | #include "update_engine/test_utils.h" | 
| adlr@google.com | 3defe6a | 2009-12-04 20:57:17 +0000 | [diff] [blame] | 20 | #include "update_engine/utils.h" | 
 | 21 |  | 
| Andrew de los Reyes | cc92cd3 | 2010-10-05 16:56:14 -0700 | [diff] [blame] | 22 | using std::map; | 
| Andrew de los Reyes | 4fe15d0 | 2009-12-10 19:01:36 -0800 | [diff] [blame] | 23 | using std::string; | 
| adlr@google.com | 3defe6a | 2009-12-04 20:57:17 +0000 | [diff] [blame] | 24 | using std::vector; | 
 | 25 |  | 
 | 26 | namespace chromeos_update_engine { | 
 | 27 |  | 
 | 28 | class UtilsTest : public ::testing::Test { }; | 
 | 29 |  | 
| Darin Petkov | 33d3064 | 2010-08-04 10:18:57 -0700 | [diff] [blame] | 30 | TEST(UtilsTest, IsOfficialBuild) { | 
 | 31 |   // Pretty lame test... | 
 | 32 |   EXPECT_TRUE(utils::IsOfficialBuild()); | 
 | 33 | } | 
 | 34 |  | 
| Darin Petkov | c91dd6b | 2011-01-10 12:31:34 -0800 | [diff] [blame] | 35 | TEST(UtilsTest, IsNormalBootMode) { | 
 | 36 |   // Pretty lame test... | 
| Darin Petkov | 44d98d9 | 2011-03-21 16:08:11 -0700 | [diff] [blame] | 37 |   EXPECT_TRUE(utils::IsNormalBootMode()); | 
| Darin Petkov | c91dd6b | 2011-01-10 12:31:34 -0800 | [diff] [blame] | 38 | } | 
 | 39 |  | 
| Chris Sosa | c197248 | 2013-04-30 22:31:10 -0700 | [diff] [blame] | 40 | TEST(UtilsTest, CanParseECVersion) { | 
 | 41 |   // Chroot won't have an ec version. | 
 | 42 |   EXPECT_EQ("", utils::GetECVersion(NULL)); | 
 | 43 |  | 
 | 44 |   // Should be able to parse and valid key value line. | 
 | 45 |   EXPECT_EQ("12345", utils::GetECVersion("fw_version=12345")); | 
 | 46 |   EXPECT_EQ("123456", utils::GetECVersion("b=1231a fw_version=123456 a=fasd2")); | 
 | 47 |   EXPECT_EQ("12345", utils::GetECVersion("fw_version=12345")); | 
 | 48 |   EXPECT_EQ("00VFA616", utils::GetECVersion( | 
 | 49 |       "vendor=\"sam\" fw_version=\"00VFA616\"")); | 
 | 50 |  | 
 | 51 |   // For invalid entries, should return the empty string. | 
 | 52 |   EXPECT_EQ("", utils::GetECVersion("b=1231a fw_version a=fasd2")); | 
 | 53 | } | 
 | 54 |  | 
| adlr@google.com | 3defe6a | 2009-12-04 20:57:17 +0000 | [diff] [blame] | 55 | TEST(UtilsTest, NormalizePathTest) { | 
 | 56 |   EXPECT_EQ("", utils::NormalizePath("", false)); | 
 | 57 |   EXPECT_EQ("", utils::NormalizePath("", true)); | 
 | 58 |   EXPECT_EQ("/", utils::NormalizePath("/", false)); | 
 | 59 |   EXPECT_EQ("", utils::NormalizePath("/", true)); | 
 | 60 |   EXPECT_EQ("/", utils::NormalizePath("//", false)); | 
 | 61 |   EXPECT_EQ("", utils::NormalizePath("//", true)); | 
 | 62 |   EXPECT_EQ("foo", utils::NormalizePath("foo", false)); | 
 | 63 |   EXPECT_EQ("foo", utils::NormalizePath("foo", true)); | 
 | 64 |   EXPECT_EQ("/foo/", utils::NormalizePath("/foo//", false)); | 
 | 65 |   EXPECT_EQ("/foo", utils::NormalizePath("/foo//", true)); | 
 | 66 |   EXPECT_EQ("bar/baz/foo/adlr", utils::NormalizePath("bar/baz//foo/adlr", | 
 | 67 |                                                      false)); | 
 | 68 |   EXPECT_EQ("bar/baz/foo/adlr", utils::NormalizePath("bar/baz//foo/adlr", | 
 | 69 |                                                      true)); | 
 | 70 |   EXPECT_EQ("/bar/baz/foo/adlr/", utils::NormalizePath("/bar/baz//foo/adlr/", | 
 | 71 |                                                        false)); | 
 | 72 |   EXPECT_EQ("/bar/baz/foo/adlr", utils::NormalizePath("/bar/baz//foo/adlr/", | 
 | 73 |                                                       true)); | 
 | 74 |   EXPECT_EQ("\\\\", utils::NormalizePath("\\\\", false)); | 
 | 75 |   EXPECT_EQ("\\\\", utils::NormalizePath("\\\\", true)); | 
 | 76 |   EXPECT_EQ("\\:/;$PATH\n\\", utils::NormalizePath("\\://;$PATH\n\\", false)); | 
 | 77 |   EXPECT_EQ("\\:/;$PATH\n\\", utils::NormalizePath("\\://;$PATH\n\\", true)); | 
 | 78 |   EXPECT_EQ("/spaces s/ ok/s / / /", | 
 | 79 |             utils::NormalizePath("/spaces s/ ok/s / / /", false)); | 
 | 80 |   EXPECT_EQ("/spaces s/ ok/s / / ", | 
 | 81 |             utils::NormalizePath("/spaces s/ ok/s / / /", true)); | 
 | 82 | } | 
 | 83 |  | 
 | 84 | TEST(UtilsTest, ReadFileFailure) { | 
 | 85 |   vector<char> empty; | 
 | 86 |   EXPECT_FALSE(utils::ReadFile("/this/doesn't/exist", &empty)); | 
 | 87 | } | 
 | 88 |  | 
| Darin Petkov | 8e447e0 | 2013-04-16 16:23:50 +0200 | [diff] [blame] | 89 | TEST(UtilsTest, ReadFileChunk) { | 
 | 90 |   FilePath file; | 
 | 91 |   EXPECT_TRUE(file_util::CreateTemporaryFile(&file)); | 
 | 92 |   ScopedPathUnlinker unlinker(file.value()); | 
 | 93 |   vector<char> data; | 
 | 94 |   const size_t kSize = 1024 * 1024; | 
 | 95 |   for (size_t i = 0; i < kSize; i++) { | 
 | 96 |     data.push_back(i % 255); | 
 | 97 |   } | 
 | 98 |   EXPECT_TRUE(utils::WriteFile(file.value().c_str(), &data[0], data.size())); | 
 | 99 |   vector<char> in_data; | 
 | 100 |   EXPECT_TRUE(utils::ReadFileChunk(file.value().c_str(), kSize, 10, &in_data)); | 
 | 101 |   EXPECT_TRUE(in_data.empty()); | 
 | 102 |   EXPECT_TRUE(utils::ReadFileChunk(file.value().c_str(), 0, -1, &in_data)); | 
 | 103 |   EXPECT_TRUE(data == in_data); | 
 | 104 |   in_data.clear(); | 
 | 105 |   EXPECT_TRUE(utils::ReadFileChunk(file.value().c_str(), 10, 20, &in_data)); | 
 | 106 |   EXPECT_TRUE(vector<char>(data.begin() + 10, data.begin() + 10 + 20) == | 
 | 107 |               in_data); | 
 | 108 | } | 
 | 109 |  | 
| adlr@google.com | 3defe6a | 2009-12-04 20:57:17 +0000 | [diff] [blame] | 110 | TEST(UtilsTest, ErrnoNumberAsStringTest) { | 
 | 111 |   EXPECT_EQ("No such file or directory", utils::ErrnoNumberAsString(ENOENT)); | 
 | 112 | } | 
 | 113 |  | 
 | 114 | TEST(UtilsTest, StringHasSuffixTest) { | 
 | 115 |   EXPECT_TRUE(utils::StringHasSuffix("foo", "foo")); | 
 | 116 |   EXPECT_TRUE(utils::StringHasSuffix("foo", "o")); | 
 | 117 |   EXPECT_TRUE(utils::StringHasSuffix("", "")); | 
 | 118 |   EXPECT_TRUE(utils::StringHasSuffix("abcabc", "abc")); | 
 | 119 |   EXPECT_TRUE(utils::StringHasSuffix("adlrwashere", "ere")); | 
 | 120 |   EXPECT_TRUE(utils::StringHasSuffix("abcdefgh", "gh")); | 
 | 121 |   EXPECT_TRUE(utils::StringHasSuffix("abcdefgh", "")); | 
 | 122 |   EXPECT_FALSE(utils::StringHasSuffix("foo", "afoo")); | 
 | 123 |   EXPECT_FALSE(utils::StringHasSuffix("", "x")); | 
 | 124 |   EXPECT_FALSE(utils::StringHasSuffix("abcdefgh", "fg")); | 
 | 125 |   EXPECT_FALSE(utils::StringHasSuffix("abcdefgh", "ab")); | 
 | 126 | } | 
 | 127 |  | 
 | 128 | TEST(UtilsTest, StringHasPrefixTest) { | 
 | 129 |   EXPECT_TRUE(utils::StringHasPrefix("foo", "foo")); | 
 | 130 |   EXPECT_TRUE(utils::StringHasPrefix("foo", "f")); | 
 | 131 |   EXPECT_TRUE(utils::StringHasPrefix("", "")); | 
 | 132 |   EXPECT_TRUE(utils::StringHasPrefix("abcabc", "abc")); | 
 | 133 |   EXPECT_TRUE(utils::StringHasPrefix("adlrwashere", "adl")); | 
 | 134 |   EXPECT_TRUE(utils::StringHasPrefix("abcdefgh", "ab")); | 
 | 135 |   EXPECT_TRUE(utils::StringHasPrefix("abcdefgh", "")); | 
 | 136 |   EXPECT_FALSE(utils::StringHasPrefix("foo", "fooa")); | 
 | 137 |   EXPECT_FALSE(utils::StringHasPrefix("", "x")); | 
 | 138 |   EXPECT_FALSE(utils::StringHasPrefix("abcdefgh", "bc")); | 
 | 139 |   EXPECT_FALSE(utils::StringHasPrefix("abcdefgh", "gh")); | 
 | 140 | } | 
 | 141 |  | 
| adlr@google.com | 3defe6a | 2009-12-04 20:57:17 +0000 | [diff] [blame] | 142 | TEST(UtilsTest, RecursiveUnlinkDirTest) { | 
| Gilad Arnold | b4346a2 | 2013-07-16 06:44:45 -0700 | [diff] [blame] | 143 |   string first_dir_name; | 
 | 144 |   ASSERT_TRUE(utils::MakeTempDirectory("RecursiveUnlinkDirTest-a-XXXXXX", | 
 | 145 |                                        &first_dir_name)); | 
 | 146 |   ASSERT_EQ(0, Chmod(first_dir_name, 0755)); | 
 | 147 |   string second_dir_name; | 
 | 148 |   ASSERT_TRUE(utils::MakeTempDirectory("RecursiveUnlinkDirTest-b-XXXXXX", | 
 | 149 |                                        &second_dir_name)); | 
 | 150 |   ASSERT_EQ(0, Chmod(second_dir_name, 0755)); | 
 | 151 |  | 
 | 152 |   EXPECT_EQ(0, Symlink(string("../") + first_dir_name, | 
 | 153 |                        second_dir_name + "/link")); | 
 | 154 |   EXPECT_EQ(0, System(string("echo hi > ") + second_dir_name + "/file")); | 
 | 155 |   EXPECT_EQ(0, Mkdir(second_dir_name + "/dir", 0755)); | 
 | 156 |   EXPECT_EQ(0, System(string("echo ok > ") + second_dir_name + "/dir/subfile")); | 
 | 157 |   EXPECT_TRUE(utils::RecursiveUnlinkDir(second_dir_name)); | 
 | 158 |   EXPECT_TRUE(utils::FileExists(first_dir_name.c_str())); | 
 | 159 |   EXPECT_EQ(0, System(string("rm -rf ") + first_dir_name)); | 
 | 160 |   EXPECT_FALSE(utils::FileExists(second_dir_name.c_str())); | 
| adlr@google.com | 3defe6a | 2009-12-04 20:57:17 +0000 | [diff] [blame] | 161 |   EXPECT_TRUE(utils::RecursiveUnlinkDir("/something/that/doesnt/exist")); | 
 | 162 | } | 
 | 163 |  | 
| Darin Petkov | 002b2fe | 2010-11-22 13:53:22 -0800 | [diff] [blame] | 164 | TEST(UtilsTest, IsSymlinkTest) { | 
 | 165 |   string temp_dir; | 
 | 166 |   EXPECT_TRUE(utils::MakeTempDirectory("/tmp/symlink-test.XXXXXX", &temp_dir)); | 
 | 167 |   string temp_file = temp_dir + "temp-file"; | 
 | 168 |   EXPECT_TRUE(utils::WriteFile(temp_file.c_str(), "", 0)); | 
 | 169 |   string temp_symlink = temp_dir + "temp-symlink"; | 
 | 170 |   EXPECT_EQ(0, symlink(temp_file.c_str(), temp_symlink.c_str())); | 
 | 171 |   EXPECT_FALSE(utils::IsSymlink(temp_dir.c_str())); | 
 | 172 |   EXPECT_FALSE(utils::IsSymlink(temp_file.c_str())); | 
 | 173 |   EXPECT_TRUE(utils::IsSymlink(temp_symlink.c_str())); | 
 | 174 |   EXPECT_FALSE(utils::IsSymlink("/non/existent/path")); | 
 | 175 |   EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); | 
 | 176 | } | 
 | 177 |  | 
| adlr@google.com | 3defe6a | 2009-12-04 20:57:17 +0000 | [diff] [blame] | 178 | TEST(UtilsTest, TempFilenameTest) { | 
 | 179 |   const string original = "/foo.XXXXXX"; | 
 | 180 |   const string result = utils::TempFilename(original); | 
 | 181 |   EXPECT_EQ(original.size(), result.size()); | 
 | 182 |   EXPECT_TRUE(utils::StringHasPrefix(result, "/foo.")); | 
 | 183 |   EXPECT_FALSE(utils::StringHasSuffix(result, "XXXXXX")); | 
 | 184 | } | 
 | 185 |  | 
| Andrew de los Reyes | f971443 | 2010-05-04 10:21:23 -0700 | [diff] [blame] | 186 | TEST(UtilsTest, RootDeviceTest) { | 
 | 187 |   EXPECT_EQ("/dev/sda", utils::RootDevice("/dev/sda3")); | 
 | 188 |   EXPECT_EQ("/dev/mmc0", utils::RootDevice("/dev/mmc0p3")); | 
| Darin Petkov | f74eb65 | 2010-08-04 12:08:38 -0700 | [diff] [blame] | 189 |   EXPECT_EQ("", utils::RootDevice("/dev/foo/bar")); | 
 | 190 |   EXPECT_EQ("", utils::RootDevice("/")); | 
 | 191 |   EXPECT_EQ("", utils::RootDevice("")); | 
 | 192 | } | 
 | 193 |  | 
 | 194 | TEST(UtilsTest, SysfsBlockDeviceTest) { | 
 | 195 |   EXPECT_EQ("/sys/block/sda", utils::SysfsBlockDevice("/dev/sda")); | 
 | 196 |   EXPECT_EQ("", utils::SysfsBlockDevice("/foo/sda")); | 
 | 197 |   EXPECT_EQ("", utils::SysfsBlockDevice("/dev/foo/bar")); | 
 | 198 |   EXPECT_EQ("", utils::SysfsBlockDevice("/")); | 
 | 199 |   EXPECT_EQ("", utils::SysfsBlockDevice("./")); | 
 | 200 |   EXPECT_EQ("", utils::SysfsBlockDevice("")); | 
 | 201 | } | 
 | 202 |  | 
 | 203 | TEST(UtilsTest, IsRemovableDeviceTest) { | 
 | 204 |   EXPECT_FALSE(utils::IsRemovableDevice("")); | 
 | 205 |   EXPECT_FALSE(utils::IsRemovableDevice("/dev/non-existent-device")); | 
| Andrew de los Reyes | f971443 | 2010-05-04 10:21:23 -0700 | [diff] [blame] | 206 | } | 
 | 207 |  | 
 | 208 | TEST(UtilsTest, PartitionNumberTest) { | 
 | 209 |   EXPECT_EQ("3", utils::PartitionNumber("/dev/sda3")); | 
 | 210 |   EXPECT_EQ("3", utils::PartitionNumber("/dev/mmc0p3")); | 
 | 211 | } | 
 | 212 |  | 
| Chris Sosa | 4f8ee27 | 2012-11-30 13:01:54 -0800 | [diff] [blame] | 213 | TEST(UtilsTest, CompareCpuSharesTest) { | 
 | 214 |   EXPECT_LT(utils::CompareCpuShares(utils::kCpuSharesLow, | 
 | 215 |                                     utils::kCpuSharesNormal), 0); | 
 | 216 |   EXPECT_GT(utils::CompareCpuShares(utils::kCpuSharesNormal, | 
 | 217 |                                     utils::kCpuSharesLow), 0); | 
 | 218 |   EXPECT_EQ(utils::CompareCpuShares(utils::kCpuSharesNormal, | 
 | 219 |                                     utils::kCpuSharesNormal), 0); | 
 | 220 |   EXPECT_GT(utils::CompareCpuShares(utils::kCpuSharesHigh, | 
 | 221 |                                     utils::kCpuSharesNormal), 0); | 
| Darin Petkov | c6c135c | 2010-08-11 13:36:18 -0700 | [diff] [blame] | 222 | } | 
 | 223 |  | 
| Darin Petkov | 5c0a8af | 2010-08-24 13:39:13 -0700 | [diff] [blame] | 224 | TEST(UtilsTest, FuzzIntTest) { | 
 | 225 |   static const unsigned int kRanges[] = { 0, 1, 2, 20 }; | 
 | 226 |   for (size_t r = 0; r < arraysize(kRanges); ++r) { | 
 | 227 |     unsigned int range = kRanges[r]; | 
 | 228 |     const int kValue = 50; | 
 | 229 |     for (int tries = 0; tries < 100; ++tries) { | 
 | 230 |       int value = utils::FuzzInt(kValue, range); | 
 | 231 |       EXPECT_GE(value, kValue - range / 2); | 
 | 232 |       EXPECT_LE(value, kValue + range - range / 2); | 
 | 233 |     } | 
 | 234 |   } | 
 | 235 | } | 
 | 236 |  | 
| Andrew de los Reyes | cc92cd3 | 2010-10-05 16:56:14 -0700 | [diff] [blame] | 237 | TEST(UtilsTest, ApplyMapTest) { | 
 | 238 |   int initial_values[] = {1, 2, 3, 4, 6}; | 
 | 239 |   vector<int> collection(&initial_values[0], | 
 | 240 |                          initial_values + arraysize(initial_values)); | 
 | 241 |   EXPECT_EQ(arraysize(initial_values), collection.size()); | 
 | 242 |   int expected_values[] = {1, 2, 5, 4, 8}; | 
 | 243 |   map<int, int> value_map; | 
 | 244 |   value_map[3] = 5; | 
 | 245 |   value_map[6] = 8; | 
 | 246 |   value_map[5] = 10; | 
 | 247 |  | 
 | 248 |   utils::ApplyMap(&collection, value_map); | 
 | 249 |  | 
 | 250 |   size_t index = 0; | 
 | 251 |   for (vector<int>::iterator it = collection.begin(), e = collection.end(); | 
 | 252 |        it != e; ++it) { | 
 | 253 |     EXPECT_EQ(expected_values[index++], *it); | 
 | 254 |   } | 
 | 255 | } | 
 | 256 |  | 
| Darin Petkov | d3f8c89 | 2010-10-12 21:38:45 -0700 | [diff] [blame] | 257 | TEST(UtilsTest, RunAsRootGetFilesystemSizeTest) { | 
 | 258 |   string img; | 
 | 259 |   EXPECT_TRUE(utils::MakeTempFile("/tmp/img.XXXXXX", &img, NULL)); | 
 | 260 |   ScopedPathUnlinker img_unlinker(img); | 
 | 261 |   CreateExtImageAtPath(img, NULL); | 
 | 262 |   // Extend the "partition" holding the file system from 10MiB to 20MiB. | 
 | 263 |   EXPECT_EQ(0, System(base::StringPrintf( | 
 | 264 |       "dd if=/dev/zero of=%s seek=20971519 bs=1 count=1", | 
 | 265 |       img.c_str()))); | 
 | 266 |   EXPECT_EQ(20 * 1024 * 1024, utils::FileSize(img)); | 
 | 267 |   int block_count = 0; | 
 | 268 |   int block_size = 0; | 
 | 269 |   EXPECT_TRUE(utils::GetFilesystemSize(img, &block_count, &block_size)); | 
 | 270 |   EXPECT_EQ(4096, block_size); | 
 | 271 |   EXPECT_EQ(10 * 1024 * 1024 / 4096, block_count); | 
 | 272 | } | 
 | 273 |  | 
| Chris Sosa | d317e40 | 2013-06-12 13:47:09 -0700 | [diff] [blame] | 274 | TEST(UtilsTest, GetInstallDevTest) { | 
 | 275 |   string boot_dev = "/dev/sda5"; | 
 | 276 |   string install_dev; | 
 | 277 |   EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev)); | 
 | 278 |   EXPECT_EQ(install_dev, "/dev/sda3"); | 
 | 279 |  | 
 | 280 |   boot_dev = "/dev/sda3"; | 
 | 281 |   EXPECT_TRUE(utils::GetInstallDev(boot_dev, &install_dev)); | 
 | 282 |   EXPECT_EQ(install_dev, "/dev/sda5"); | 
 | 283 |  | 
 | 284 |   boot_dev = "/dev/sda12"; | 
 | 285 |   EXPECT_FALSE(utils::GetInstallDev(boot_dev, &install_dev)); | 
 | 286 | } | 
 | 287 |  | 
| Andrew de los Reyes | 712b3ac | 2011-01-07 13:47:52 -0800 | [diff] [blame] | 288 | namespace { | 
 | 289 | gboolean  TerminateScheduleCrashReporterUploadTest(void* arg) { | 
 | 290 |   GMainLoop* loop = reinterpret_cast<GMainLoop*>(arg); | 
 | 291 |   g_main_loop_quit(loop); | 
 | 292 |   return FALSE;  // Don't call this callback again | 
 | 293 | } | 
 | 294 | }  // namespace {} | 
 | 295 |  | 
 | 296 | TEST(UtilsTest, ScheduleCrashReporterUploadTest) { | 
 | 297 |   // Not much to test. At least this tests for memory leaks, crashes, | 
 | 298 |   // log errors. | 
 | 299 |   GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE); | 
 | 300 |   utils::ScheduleCrashReporterUpload(); | 
 | 301 |   g_timeout_add_seconds(1, &TerminateScheduleCrashReporterUploadTest, loop); | 
 | 302 |   g_main_loop_run(loop); | 
 | 303 |   g_main_loop_unref(loop); | 
 | 304 | } | 
 | 305 |  | 
| David Zeuthen | 674c318 | 2013-04-18 14:05:20 -0700 | [diff] [blame] | 306 | TEST(UtilsTest, FormatTimeDeltaTest) { | 
 | 307 |   // utils::FormatTimeDelta() is not locale-aware (it's only used for logging | 
 | 308 |   // which is not localized) so we only need to test the C locale | 
 | 309 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromMilliseconds(100)), | 
 | 310 |             "0.1s"); | 
 | 311 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(0)), | 
 | 312 |             "0s"); | 
 | 313 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(1)), | 
 | 314 |             "1s"); | 
 | 315 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(59)), | 
 | 316 |             "59s"); | 
 | 317 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(60)), | 
 | 318 |             "1m0s"); | 
 | 319 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(61)), | 
 | 320 |             "1m1s"); | 
 | 321 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(90)), | 
 | 322 |             "1m30s"); | 
 | 323 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(1205)), | 
 | 324 |             "20m5s"); | 
 | 325 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(3600)), | 
 | 326 |             "1h0m0s"); | 
 | 327 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(3601)), | 
 | 328 |             "1h0m1s"); | 
 | 329 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(3661)), | 
 | 330 |             "1h1m1s"); | 
 | 331 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(7261)), | 
 | 332 |             "2h1m1s"); | 
 | 333 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(86400)), | 
 | 334 |             "1d0h0m0s"); | 
 | 335 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(86401)), | 
 | 336 |             "1d0h0m1s"); | 
 | 337 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(200000)), | 
 | 338 |             "2d7h33m20s"); | 
 | 339 |   EXPECT_EQ(utils::FormatTimeDelta(base::TimeDelta::FromSeconds(200000) + | 
 | 340 |                                    base::TimeDelta::FromMilliseconds(1)), | 
 | 341 |             "2d7h33m20.001s"); | 
 | 342 | } | 
 | 343 |  | 
| adlr@google.com | 3defe6a | 2009-12-04 20:57:17 +0000 | [diff] [blame] | 344 | }  // namespace chromeos_update_engine |