blob: 200b23b4abb672551fc8fc3ca6266a3be5cd4365 [file] [log] [blame]
Darin Petkova4a8a8c2010-07-15 22:21:12 -07001// Copyright (c) 2010 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
5#include <stdio.h>
6#include <string>
7#include <gtest/gtest.h>
8#include "update_engine/install_plan.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -07009#include "update_engine/omaha_request_params.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000010#include "update_engine/test_utils.h"
11#include "update_engine/utils.h"
12
13using std::string;
14
15namespace chromeos_update_engine {
16
Darin Petkova4a8a8c2010-07-15 22:21:12 -070017class OmahaRequestDeviceParamsTest : public ::testing::Test {
adlr@google.com3defe6a2009-12-04 20:57:17 +000018 public:
Darin Petkova4a8a8c2010-07-15 22:21:12 -070019 // Return true iff the OmahaRequestDeviceParams::Init succeeded. If
20 // out is non-NULL, it's set w/ the generated data.
21 bool DoTest(OmahaRequestParams* out);
adlr@google.com3defe6a2009-12-04 20:57:17 +000022 static const string kTestDir;
23};
24
Darin Petkova4a8a8c2010-07-15 22:21:12 -070025const string OmahaRequestDeviceParamsTest::kTestDir =
26 "omaha_request_device_params-test";
adlr@google.com3defe6a2009-12-04 20:57:17 +000027
Darin Petkova4a8a8c2010-07-15 22:21:12 -070028bool OmahaRequestDeviceParamsTest::DoTest(OmahaRequestParams* out) {
29 OmahaRequestDeviceParams params;
30 params.set_root(string("./") + kTestDir);
31 bool success = params.Init();
adlr@google.com3defe6a2009-12-04 20:57:17 +000032 if (out)
Darin Petkova4a8a8c2010-07-15 22:21:12 -070033 *out = params;
34 return success;
adlr@google.com3defe6a2009-12-04 20:57:17 +000035}
36
37namespace {
Andrew de los Reyes970bb282009-12-09 16:34:04 -080038bool IsHexDigit(char c) {
39 return ((c >= '0') && (c <= '9')) ||
40 ((c >= 'a') && (c <= 'f')) ||
41 ((c >= 'A') && (c <= 'F'));
42}
Darin Petkov6a5b3222010-07-13 14:55:28 -070043
Andrew de los Reyes970bb282009-12-09 16:34:04 -080044// Returns true iff str is formatted as a GUID. Example GUID:
45// "{2251FFAD-DBAB-4E53-8B3A-18F98BB4EB80}"
46bool IsValidGuid(const string& str) {
47 TEST_AND_RETURN_FALSE(str.size() == 38);
48 TEST_AND_RETURN_FALSE((*str.begin() == '{') && (*str.rbegin() == '}'));
49 for (string::size_type i = 1; i < (str.size() - 1); ++i) {
50 if ((i == 9) || (i == 14) || (i == 19) || (i == 24)) {
51 TEST_AND_RETURN_FALSE(str[i] == '-');
52 } else {
53 TEST_AND_RETURN_FALSE(IsHexDigit(str[i]));
adlr@google.com3defe6a2009-12-04 20:57:17 +000054 }
55 }
56 return true;
57}
Darin Petkova4a8a8c2010-07-15 22:21:12 -070058
adlr@google.com3defe6a2009-12-04 20:57:17 +000059string GetMachineType() {
60 FILE* fp = popen("uname -m", "r");
61 if (!fp)
62 return "";
63 string ret;
64 for (;;) {
65 char buffer[10];
66 size_t r = fread(buffer, 1, sizeof(buffer), fp);
67 if (r == 0)
68 break;
69 ret.insert(ret.begin(), buffer, buffer + r);
70 }
71 // strip trailing '\n' if it exists
72 if ((*ret.rbegin()) == '\n')
73 ret.resize(ret.size() - 1);
74 fclose(fp);
75 return ret;
76}
77} // namespace {}
78
Darin Petkova4a8a8c2010-07-15 22:21:12 -070079TEST_F(OmahaRequestDeviceParamsTest, SimpleTest) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000080 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
Andrew de los Reyes970bb282009-12-09 16:34:04 -080081 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
82 utils::kStatefulPartition + "/etc"));
adlr@google.com3defe6a2009-12-04 20:57:17 +000083 {
84 ASSERT_TRUE(WriteFileString(
85 kTestDir + "/etc/lsb-release",
Andrew de los Reyes37c20322010-06-30 13:27:19 -070086 "CHROMEOS_RELEASE_BOARD=arm-generic\n"
Andrew de los Reyesf9714432010-05-04 10:21:23 -070087 "CHROMEOS_RELEASE_FOO=bar\n"
88 "CHROMEOS_RELEASE_VERSION=0.2.2.3\n"
89 "CHROMEOS_RELEASE_TRACK=footrack"));
Darin Petkov6a5b3222010-07-13 14:55:28 -070090 OmahaRequestParams out;
Darin Petkova4a8a8c2010-07-15 22:21:12 -070091 EXPECT_TRUE(DoTest(&out));
Andrew de los Reyes970bb282009-12-09 16:34:04 -080092 EXPECT_TRUE(IsValidGuid(out.machine_id)) << "id: " << out.machine_id;
adlr@google.com3defe6a2009-12-04 20:57:17 +000093 // for now we're just using the machine id here
Andrew de los Reyes970bb282009-12-09 16:34:04 -080094 EXPECT_TRUE(IsValidGuid(out.user_id)) << "id: " << out.user_id;
adlr@google.com3defe6a2009-12-04 20:57:17 +000095 EXPECT_EQ("Chrome OS", out.os_platform);
96 EXPECT_EQ(string("0.2.2.3_") + GetMachineType(), out.os_sp);
Andrew de los Reyes37c20322010-06-30 13:27:19 -070097 EXPECT_EQ("arm-generic", out.os_board);
adlr@google.com3defe6a2009-12-04 20:57:17 +000098 EXPECT_EQ("{87efface-864d-49a5-9bb3-4b050a7c227a}", out.app_id);
99 EXPECT_EQ("0.2.2.3", out.app_version);
100 EXPECT_EQ("en-US", out.app_lang);
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700101 EXPECT_TRUE(out.delta_okay);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000102 EXPECT_EQ("footrack", out.app_track);
103 }
104 EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
105}
106
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700107TEST_F(OmahaRequestDeviceParamsTest, MissingTrackTest) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000108 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800109 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
110 utils::kStatefulPartition + "/etc"));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000111 {
112 ASSERT_TRUE(WriteFileString(
113 kTestDir + "/etc/lsb-release",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700114 "CHROMEOS_RELEASE_FOO=bar\n"
115 "CHROMEOS_RELEASE_VERSION=0.2.2.3\n"
116 "CHROMEOS_RELEASE_TRXCK=footrack"));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700117 OmahaRequestParams out;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700118 EXPECT_TRUE(DoTest(&out));
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800119 EXPECT_TRUE(IsValidGuid(out.machine_id));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000120 // for now we're just using the machine id here
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800121 EXPECT_TRUE(IsValidGuid(out.user_id));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000122 EXPECT_EQ("Chrome OS", out.os_platform);
123 EXPECT_EQ(string("0.2.2.3_") + GetMachineType(), out.os_sp);
124 EXPECT_EQ("{87efface-864d-49a5-9bb3-4b050a7c227a}", out.app_id);
125 EXPECT_EQ("0.2.2.3", out.app_version);
126 EXPECT_EQ("en-US", out.app_lang);
127 EXPECT_EQ("", out.app_track);
128 }
129 EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
130}
131
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700132TEST_F(OmahaRequestDeviceParamsTest, ConfusingReleaseTest) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000133 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800134 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
135 utils::kStatefulPartition + "/etc"));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000136 {
137 ASSERT_TRUE(WriteFileString(
138 kTestDir + "/etc/lsb-release",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700139 "CHROMEOS_RELEASE_FOO=CHROMEOS_RELEASE_VERSION=1.2.3.4\n"
140 "CHROMEOS_RELEASE_VERSION=0.2.2.3\n"
141 "CHROMEOS_RELEASE_TRXCK=footrack"));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700142 OmahaRequestParams out;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700143 EXPECT_TRUE(DoTest(&out));
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800144 EXPECT_TRUE(IsValidGuid(out.machine_id)) << out.machine_id;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000145 // for now we're just using the machine id here
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800146 EXPECT_TRUE(IsValidGuid(out.user_id));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000147 EXPECT_EQ("Chrome OS", out.os_platform);
148 EXPECT_EQ(string("0.2.2.3_") + GetMachineType(), out.os_sp);
149 EXPECT_EQ("{87efface-864d-49a5-9bb3-4b050a7c227a}", out.app_id);
150 EXPECT_EQ("0.2.2.3", out.app_version);
151 EXPECT_EQ("en-US", out.app_lang);
152 EXPECT_EQ("", out.app_track);
153 }
154 EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
155}
156
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700157TEST_F(OmahaRequestDeviceParamsTest, MachineIdPersistsTest) {
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800158 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
159 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
160 utils::kStatefulPartition + "/etc"));
161 ASSERT_TRUE(WriteFileString(
162 kTestDir + "/etc/lsb-release",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700163 "CHROMEOS_RELEASE_FOO=CHROMEOS_RELEASE_VERSION=1.2.3.4\n"
164 "CHROMEOS_RELEASE_VERSION=0.2.2.3\n"
165 "CHROMEOS_RELEASE_TRXCK=footrack"));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700166 OmahaRequestParams out1;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700167 EXPECT_TRUE(DoTest(&out1));
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800168 string machine_id;
169 EXPECT_TRUE(utils::ReadFileToString(
170 kTestDir +
171 utils::kStatefulPartition + "/etc/omaha_id",
172 &machine_id));
173 EXPECT_EQ(machine_id, out1.machine_id);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700174 OmahaRequestParams out2;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700175 EXPECT_TRUE(DoTest(&out2));
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800176 EXPECT_EQ(machine_id, out2.machine_id);
177 EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
178}
179
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700180TEST_F(OmahaRequestDeviceParamsTest, NoDeltasTest) {
181 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
182 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
183 utils::kStatefulPartition + "/etc"));
184 ASSERT_TRUE(WriteFileString(
185 kTestDir + "/etc/lsb-release",
186 "CHROMEOS_RELEASE_FOO=CHROMEOS_RELEASE_VERSION=1.2.3.4\n"
187 "CHROMEOS_RELEASE_VERSION=0.2.2.3\n"
188 "CHROMEOS_RELEASE_TRXCK=footrack"));
189 ASSERT_TRUE(WriteFileString(kTestDir + "/.nodelta", ""));
190 OmahaRequestParams out;
191 EXPECT_TRUE(DoTest(&out));
192 EXPECT_FALSE(out.delta_okay);
193 EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
194}
195
adlr@google.com3defe6a2009-12-04 20:57:17 +0000196} // namespace chromeos_update_engine