AU: pass whether or not we can tolerate a delta to the server
BUG=4848
TEST=attached unittests
Review URL: http://codereview.chromium.org/3017006
diff --git a/omaha_request_action.cc b/omaha_request_action.cc
index 9d53a4e..6f9a790 100644
--- a/omaha_request_action.cc
+++ b/omaha_request_action.cc
@@ -88,7 +88,8 @@
XmlEncode(params.app_version) + "\" "
"lang=\"" + XmlEncode(params.app_lang) + "\" track=\"" +
XmlEncode(params.app_track) + "\" board=\"" +
- XmlEncode(params.os_board) + "\">\n" + body +
+ XmlEncode(params.os_board) + "\" delta_okay=\"" +
+ (params.delta_okay ? "true" : "false") + "\">\n" + body +
" </o:app>\n"
"</o:gupdate>\n";
}
diff --git a/omaha_request_action_unittest.cc b/omaha_request_action_unittest.cc
index cc37d7a..dedb972 100755
--- a/omaha_request_action_unittest.cc
+++ b/omaha_request_action_unittest.cc
@@ -189,6 +189,7 @@
"0.1.0.0",
"en-US",
"unittest",
+ false, // delta okay
""); // url
OmahaResponse response;
ASSERT_TRUE(
@@ -211,6 +212,7 @@
"0.1.0.0",
"en-US",
"unittest_track",
+ false, // delta okay
""); // url
OmahaResponse response;
ASSERT_TRUE(
@@ -248,6 +250,7 @@
"0.1.0.0",
"en-US",
"unittest",
+ false, // delta okay
""); // url
const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
@@ -279,6 +282,7 @@
"0.1.0.0",
"en-US",
"unittest_track",
+ false, // delta okay
"http://url");
OmahaResponse response;
ASSERT_FALSE(
@@ -301,6 +305,7 @@
"0.1.0.0",
"en-US",
"unittest_track",
+ false, // delta okay
"http://url");
OmahaResponse response;
ASSERT_FALSE(TestUpdateCheck(
@@ -326,6 +331,7 @@
"0.1.0.0",
"en-US",
"unittest_track",
+ false, // delta okay
"http://url");
OmahaResponse response;
ASSERT_FALSE(TestUpdateCheck(
@@ -351,6 +357,7 @@
"0.1.0.0",
"en-US",
"unittest_track",
+ false, // delta okay
"http://url");
OmahaResponse response;
ASSERT_FALSE(TestUpdateCheck(
@@ -376,6 +383,7 @@
"0.1.0.0",
"en-US",
"unittest_track",
+ false, // delta okay
"http://url");
OmahaResponse response;
ASSERT_TRUE(TestUpdateCheck(params,
@@ -437,6 +445,7 @@
"0.1.0.0",
"en-US",
"unittest",
+ false, // delta okay
"http://url");
string http_response("doesn't matter");
GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
@@ -475,6 +484,7 @@
"0.1.0.0",
"en-US",
"unittest_track",
+ false, // delta okay
"http://url");
OmahaResponse response;
ASSERT_FALSE(
@@ -505,6 +515,7 @@
"0.1.0.0",
"en-US",
"unittest_track",
+ false, // delta okay
"http://url");
OmahaResponse response;
ASSERT_TRUE(
@@ -536,6 +547,7 @@
"0.1.0.0",
"en-US",
"unittest_track",
+ false, // delta okay
"http://url");
OmahaResponse response;
ASSERT_TRUE(
@@ -568,6 +580,7 @@
"0.1.0.0",
"en-US",
"unittest_track",
+ false, // delta okay
"http://url");
OmahaResponse response;
ASSERT_FALSE(TestUpdateCheck(params,
@@ -595,6 +608,7 @@
"0.1.0.0",
"en-US",
"unittest_track",
+ false, // delta okay
"http://url");
TestEvent(params,
new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
@@ -626,6 +640,7 @@
"0.1.0.0",
"en-US",
"unittest_track",
+ false, // delta okay
"http://url");
OmahaRequestAction update_check_action(
@@ -645,4 +660,34 @@
EXPECT_TRUE(event_action.IsEvent());
}
+TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
+ for (int i = 0; i < 2; i++) {
+ bool delta_okay = i == 1;
+ const char* delta_okay_str = delta_okay ? "true" : "false";
+ vector<char> post_data;
+ OmahaRequestParams params("machine_id",
+ "user_id",
+ OmahaRequestParams::kOsPlatform,
+ OmahaRequestParams::kOsVersion,
+ "service_pack",
+ "x86-generic",
+ OmahaRequestParams::kAppId,
+ "0.1.0.0",
+ "en-US",
+ "unittest_track",
+ delta_okay,
+ "http://url");
+ ASSERT_FALSE(TestUpdateCheck(params,
+ "invalid xml>",
+ false,
+ NULL,
+ &post_data));
+ // convert post_data to string
+ string post_str(&post_data[0], post_data.size());
+ EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
+ string::npos)
+ << "i = " << i;
+ }
+}
+
} // namespace chromeos_update_engine
diff --git a/omaha_request_params.cc b/omaha_request_params.cc
index 502f7b0..1ab6f2c 100644
--- a/omaha_request_params.cc
+++ b/omaha_request_params.cc
@@ -38,6 +38,14 @@
app_id = OmahaRequestParams::kAppId;
app_lang = "en-US";
app_track = GetLsbValue("CHROMEOS_RELEASE_TRACK", "");
+ struct stat stbuf;
+
+ // Deltas are only okay if the /.nodelta file does not exist.
+ // If we don't know (i.e. stat() returns some unexpected error),
+ // then err on the side of caution and say deltas are not okay
+ delta_okay = (stat((root_ + "/.nodelta").c_str(), &stbuf) < 0) &&
+ (errno == ENOENT);
+
update_url = GetLsbValue("CHROMEOS_AUSERVER",
OmahaRequestParams::kUpdateUrl);
return true;
diff --git a/omaha_request_params.h b/omaha_request_params.h
index 136c60a..fb4196e 100644
--- a/omaha_request_params.h
+++ b/omaha_request_params.h
@@ -29,6 +29,7 @@
const std::string& in_app_version,
const std::string& in_app_lang,
const std::string& in_app_track,
+ const bool in_delta_okay,
const std::string& in_update_url)
: machine_id(in_machine_id),
user_id(in_user_id),
@@ -40,6 +41,7 @@
app_version(in_app_version),
app_lang(in_app_lang),
app_track(in_app_track),
+ delta_okay(in_delta_okay),
update_url(in_update_url) {}
std::string machine_id;
@@ -52,6 +54,7 @@
std::string app_version;
std::string app_lang;
std::string app_track;
+ bool delta_okay; // If this client can accept a delta
std::string update_url;
diff --git a/omaha_request_params_unittest.cc b/omaha_request_params_unittest.cc
index 54d8dbd..200b23b 100644
--- a/omaha_request_params_unittest.cc
+++ b/omaha_request_params_unittest.cc
@@ -98,6 +98,7 @@
EXPECT_EQ("{87efface-864d-49a5-9bb3-4b050a7c227a}", out.app_id);
EXPECT_EQ("0.2.2.3", out.app_version);
EXPECT_EQ("en-US", out.app_lang);
+ EXPECT_TRUE(out.delta_okay);
EXPECT_EQ("footrack", out.app_track);
}
EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
@@ -176,4 +177,20 @@
EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
}
+TEST_F(OmahaRequestDeviceParamsTest, NoDeltasTest) {
+ ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
+ ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
+ utils::kStatefulPartition + "/etc"));
+ ASSERT_TRUE(WriteFileString(
+ kTestDir + "/etc/lsb-release",
+ "CHROMEOS_RELEASE_FOO=CHROMEOS_RELEASE_VERSION=1.2.3.4\n"
+ "CHROMEOS_RELEASE_VERSION=0.2.2.3\n"
+ "CHROMEOS_RELEASE_TRXCK=footrack"));
+ ASSERT_TRUE(WriteFileString(kTestDir + "/.nodelta", ""));
+ OmahaRequestParams out;
+ EXPECT_TRUE(DoTest(&out));
+ EXPECT_FALSE(out.delta_okay);
+ EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
+}
+
} // namespace chromeos_update_engine