blob: 1397c4de0799b240c36de84c0e27d99ae5e1942e [file] [log] [blame]
adlr@google.com3defe6a2009-12-04 20:57:17 +00001// Copyright (c) 2009 The Chromium Authors. All rights reserved.
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 <stdio.h>
6#include <string>
7#include <gtest/gtest.h>
8#include "update_engine/install_plan.h"
9#include "update_engine/omaha_request_prep_action.h"
10#include "update_engine/test_utils.h"
11#include "update_engine/utils.h"
12
13using std::string;
14
15namespace chromeos_update_engine {
16
17class OmahaRequestPrepActionTest : public ::testing::Test {
18 public:
19 // Return true iff the OmahaResponseHandlerAction succeeded.
20 // if out is non-NULL, it's set w/ the response from the action.
21 bool DoTest(bool force_full_update, UpdateCheckParams* out);
22 static const string kTestDir;
23};
24
25const string OmahaRequestPrepActionTest::kTestDir = "request_prep_action-test";
26
27class OmahaRequestPrepActionProcessorDelegate
28 : public ActionProcessorDelegate {
29 public:
30 OmahaRequestPrepActionProcessorDelegate()
31 : success_(false),
32 success_set_(false) {}
33 void ActionCompleted(ActionProcessor* processor,
34 AbstractAction* action,
35 bool success) {
36 if (action->Type() == OmahaRequestPrepAction::StaticType()) {
37 success_ = success;
38 success_set_ = true;
39 }
40 }
41 bool success_;
42 bool success_set_;
43};
44
45bool OmahaRequestPrepActionTest::DoTest(bool force_full_update,
46 UpdateCheckParams* out) {
47 ActionProcessor processor;
48 OmahaRequestPrepActionProcessorDelegate delegate;
49 processor.set_delegate(&delegate);
50
51 OmahaRequestPrepAction request_prep_action(force_full_update);
52 request_prep_action.set_root(string("./") + kTestDir);
53 ObjectCollectorAction<UpdateCheckParams> collector_action;
54 BondActions(&request_prep_action, &collector_action);
55 processor.EnqueueAction(&request_prep_action);
56 processor.EnqueueAction(&collector_action);
57 processor.StartProcessing();
58 EXPECT_TRUE(!processor.IsRunning())
59 << "Update test to handle non-asynch actions";
60 if (out)
61 *out = collector_action.object();
62 EXPECT_TRUE(delegate.success_set_);
63 return delegate.success_;
64}
65
66namespace {
Andrew de los Reyes970bb282009-12-09 16:34:04 -080067bool IsHexDigit(char c) {
68 return ((c >= '0') && (c <= '9')) ||
69 ((c >= 'a') && (c <= 'f')) ||
70 ((c >= 'A') && (c <= 'F'));
71}
72
73// Returns true iff str is formatted as a GUID. Example GUID:
74// "{2251FFAD-DBAB-4E53-8B3A-18F98BB4EB80}"
75bool IsValidGuid(const string& str) {
76 TEST_AND_RETURN_FALSE(str.size() == 38);
77 TEST_AND_RETURN_FALSE((*str.begin() == '{') && (*str.rbegin() == '}'));
78 for (string::size_type i = 1; i < (str.size() - 1); ++i) {
79 if ((i == 9) || (i == 14) || (i == 19) || (i == 24)) {
80 TEST_AND_RETURN_FALSE(str[i] == '-');
81 } else {
82 TEST_AND_RETURN_FALSE(IsHexDigit(str[i]));
adlr@google.com3defe6a2009-12-04 20:57:17 +000083 }
84 }
85 return true;
86}
87string GetMachineType() {
88 FILE* fp = popen("uname -m", "r");
89 if (!fp)
90 return "";
91 string ret;
92 for (;;) {
93 char buffer[10];
94 size_t r = fread(buffer, 1, sizeof(buffer), fp);
95 if (r == 0)
96 break;
97 ret.insert(ret.begin(), buffer, buffer + r);
98 }
99 // strip trailing '\n' if it exists
100 if ((*ret.rbegin()) == '\n')
101 ret.resize(ret.size() - 1);
102 fclose(fp);
103 return ret;
104}
105} // namespace {}
106
107TEST_F(OmahaRequestPrepActionTest, SimpleTest) {
108 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 Reyes37c20322010-06-30 13:27:19 -0700114 "CHROMEOS_RELEASE_BOARD=arm-generic\n"
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700115 "CHROMEOS_RELEASE_FOO=bar\n"
116 "CHROMEOS_RELEASE_VERSION=0.2.2.3\n"
117 "CHROMEOS_RELEASE_TRACK=footrack"));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000118 UpdateCheckParams out;
119 EXPECT_TRUE(DoTest(false, &out));
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800120 EXPECT_TRUE(IsValidGuid(out.machine_id)) << "id: " << out.machine_id;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000121 // for now we're just using the machine id here
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800122 EXPECT_TRUE(IsValidGuid(out.user_id)) << "id: " << out.user_id;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000123 EXPECT_EQ("Chrome OS", out.os_platform);
124 EXPECT_EQ(string("0.2.2.3_") + GetMachineType(), out.os_sp);
Andrew de los Reyes37c20322010-06-30 13:27:19 -0700125 EXPECT_EQ("arm-generic", out.os_board);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000126 EXPECT_EQ("{87efface-864d-49a5-9bb3-4b050a7c227a}", out.app_id);
127 EXPECT_EQ("0.2.2.3", out.app_version);
128 EXPECT_EQ("en-US", out.app_lang);
129 EXPECT_EQ("footrack", out.app_track);
130 }
131 EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
132}
133
134TEST_F(OmahaRequestPrepActionTest, MissingTrackTest) {
135 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800136 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
137 utils::kStatefulPartition + "/etc"));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000138 {
139 ASSERT_TRUE(WriteFileString(
140 kTestDir + "/etc/lsb-release",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700141 "CHROMEOS_RELEASE_FOO=bar\n"
142 "CHROMEOS_RELEASE_VERSION=0.2.2.3\n"
143 "CHROMEOS_RELEASE_TRXCK=footrack"));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000144 UpdateCheckParams out;
145 EXPECT_TRUE(DoTest(false, &out));
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800146 EXPECT_TRUE(IsValidGuid(out.machine_id));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000147 // for now we're just using the machine id here
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800148 EXPECT_TRUE(IsValidGuid(out.user_id));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000149 EXPECT_EQ("Chrome OS", out.os_platform);
150 EXPECT_EQ(string("0.2.2.3_") + GetMachineType(), out.os_sp);
151 EXPECT_EQ("{87efface-864d-49a5-9bb3-4b050a7c227a}", out.app_id);
152 EXPECT_EQ("0.2.2.3", out.app_version);
153 EXPECT_EQ("en-US", out.app_lang);
154 EXPECT_EQ("", out.app_track);
155 }
156 EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
157}
158
159TEST_F(OmahaRequestPrepActionTest, ConfusingReleaseTest) {
160 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800161 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
162 utils::kStatefulPartition + "/etc"));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000163 {
164 ASSERT_TRUE(WriteFileString(
165 kTestDir + "/etc/lsb-release",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700166 "CHROMEOS_RELEASE_FOO=CHROMEOS_RELEASE_VERSION=1.2.3.4\n"
167 "CHROMEOS_RELEASE_VERSION=0.2.2.3\n"
168 "CHROMEOS_RELEASE_TRXCK=footrack"));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000169 UpdateCheckParams out;
170 EXPECT_TRUE(DoTest(false, &out));
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800171 EXPECT_TRUE(IsValidGuid(out.machine_id)) << out.machine_id;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000172 // for now we're just using the machine id here
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800173 EXPECT_TRUE(IsValidGuid(out.user_id));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000174 EXPECT_EQ("Chrome OS", out.os_platform);
175 EXPECT_EQ(string("0.2.2.3_") + GetMachineType(), out.os_sp);
176 EXPECT_EQ("{87efface-864d-49a5-9bb3-4b050a7c227a}", out.app_id);
177 EXPECT_EQ("0.2.2.3", out.app_version);
178 EXPECT_EQ("en-US", out.app_lang);
179 EXPECT_EQ("", out.app_track);
180 }
181 EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
182}
183
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800184TEST_F(OmahaRequestPrepActionTest, MachineIdPersistsTest) {
185 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
186 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
187 utils::kStatefulPartition + "/etc"));
188 ASSERT_TRUE(WriteFileString(
189 kTestDir + "/etc/lsb-release",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700190 "CHROMEOS_RELEASE_FOO=CHROMEOS_RELEASE_VERSION=1.2.3.4\n"
191 "CHROMEOS_RELEASE_VERSION=0.2.2.3\n"
192 "CHROMEOS_RELEASE_TRXCK=footrack"));
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800193 UpdateCheckParams out1;
194 EXPECT_TRUE(DoTest(false, &out1));
195 string machine_id;
196 EXPECT_TRUE(utils::ReadFileToString(
197 kTestDir +
198 utils::kStatefulPartition + "/etc/omaha_id",
199 &machine_id));
200 EXPECT_EQ(machine_id, out1.machine_id);
201 UpdateCheckParams out2;
202 EXPECT_TRUE(DoTest(false, &out2));
203 EXPECT_EQ(machine_id, out2.machine_id);
204 EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
205}
206
adlr@google.com3defe6a2009-12-04 20:57:17 +0000207} // namespace chromeos_update_engine