AU: add an interactive flag to Omaha requests
Such a flag can be used to distinguish between user-initiated
(interactive) checks and those that are due to background scheduling. In
the former case, we may want to suppress the probabilistic throttling
that's commonly used with latest releases. This CL piggybacks the new
functionality on top of an existing dataflow used for distinguishing
between interactive / scheduled checks, only it pushes it further so it
is evident in the Omaha request as well.
Comes with a unit test for ensuring that the Omaha flag is set as
expected.
BUG=chromium-os:26594
TEST=Dbus initiated checks correctly tainted
Change-Id: Ia2b3ff5ce3a866c64e453557028b8cbd92c1a258
Reviewed-on: https://gerrit.chromium.org/gerrit/41081
Commit-Queue: Gilad Arnold <garnold@chromium.org>
Reviewed-by: Gilad Arnold <garnold@chromium.org>
Tested-by: Gilad Arnold <garnold@chromium.org>
diff --git a/omaha_request_action.cc b/omaha_request_action.cc
index e994335..c1eb795 100644
--- a/omaha_request_action.cc
+++ b/omaha_request_action.cc
@@ -178,7 +178,9 @@
XmlEncode(params.app_track) + "\" board=\"" +
XmlEncode(params.os_board) + "\" hardware_class=\"" +
XmlEncode(params.hardware_class) + "\" delta_okay=\"" +
- (params.delta_okay ? "true" : "false") + "\">\n" + body +
+ (params.delta_okay ? "true" : "false") +
+ "\" userinitiated=\"" + (params.interactive ? "true" : "false") +
+ "\">\n" + body +
" </app>\n"
"</request>\n";
}
diff --git a/omaha_request_action_unittest.cc b/omaha_request_action_unittest.cc
index 69d5895..276f189 100644
--- a/omaha_request_action_unittest.cc
+++ b/omaha_request_action_unittest.cc
@@ -50,6 +50,7 @@
"unittest",
"OEM MODEL 09235 7471",
false, // delta okay
+ false, // interactive
"http://url",
false, // update_disabled
""); // target_version_prefix);
@@ -820,6 +821,7 @@
"unittest_track<",
"<OEM MODEL>",
false, // delta okay
+ false, // interactive
"http://url",
false, // update_disabled
""); // target_version_prefix
@@ -1031,6 +1033,7 @@
"unittest_track",
"OEM MODEL REV 1234",
delta_okay,
+ false, // interactive
"http://url",
false, // update_disabled
""); // target_version_prefix
@@ -1050,6 +1053,42 @@
}
}
+TEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
+ for (int i = 0; i < 2; i++) {
+ bool interactive = i == 1;
+ const char* interactive_str = interactive ? "true" : "false";
+ vector<char> post_data;
+ OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
+ OmahaRequestParams::kOsVersion,
+ "service_pack",
+ "x86-generic",
+ OmahaRequestParams::kAppId,
+ "0.1.0.0",
+ "en-US",
+ "unittest_track",
+ "OEM MODEL REV 1234",
+ true, // delta_okay
+ interactive,
+ "http://url",
+ false, // update_disabled
+ ""); // target_version_prefix
+ ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
+ params,
+ "invalid xml>",
+ -1,
+ false, // ping_only
+ kActionCodeOmahaRequestXMLParseError,
+ NULL,
+ &post_data));
+ // convert post_data to string
+ string post_str(&post_data[0], post_data.size());
+ EXPECT_NE(post_str.find(StringPrintf(" userinitiated=\"%s\"",
+ interactive_str)),
+ string::npos)
+ << "i = " << i;
+ }
+}
+
TEST(OmahaRequestActionTest, OmahaEventTest) {
OmahaEvent default_event;
EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
diff --git a/omaha_request_params.cc b/omaha_request_params.cc
index d857297..46cd5aa 100644
--- a/omaha_request_params.cc
+++ b/omaha_request_params.cc
@@ -41,7 +41,8 @@
bool OmahaRequestDeviceParams::Init(const std::string& in_app_version,
const std::string& in_update_url,
- const std::string& in_release_track) {
+ const std::string& in_release_track,
+ bool in_interactive) {
bool stateful_override = !ShouldLockDown();
os_platform = OmahaRequestParams::kOsPlatform;
os_version = OmahaRequestParams::kOsVersion;
@@ -99,6 +100,10 @@
NULL,
stateful_override) :
in_update_url;
+
+ // Set the interactive flag accordingly.
+ interactive = in_interactive;
+
return true;
}
@@ -122,7 +127,7 @@
bool OmahaRequestDeviceParams::SetDeviceTrack(const std::string& track) {
OmahaRequestDeviceParams params;
- TEST_AND_RETURN_FALSE(params.Init("", "", ""));
+ TEST_AND_RETURN_FALSE(params.Init("", "", "", false));
return params.SetTrack(track);
}
@@ -130,7 +135,7 @@
OmahaRequestDeviceParams params;
// Note that params.app_track is an empty string if the value in
// lsb-release file is invalid. See Init() for details.
- return params.Init("", "", "") ? params.app_track : "";
+ return params.Init("", "", "", false) ? params.app_track : "";
}
string OmahaRequestDeviceParams::GetLsbValue(const string& key,
diff --git a/omaha_request_params.h b/omaha_request_params.h
index ea8bab0..f38978c 100644
--- a/omaha_request_params.h
+++ b/omaha_request_params.h
@@ -31,6 +31,7 @@
os_version(kOsVersion),
app_id(kAppId),
delta_okay(true),
+ interactive(false),
update_disabled(false),
wall_clock_based_wait_enabled(false),
update_check_count_wait_enabled(false),
@@ -47,6 +48,7 @@
const std::string& in_app_track,
const std::string& in_hardware_class,
bool in_delta_okay,
+ bool in_interactive,
const std::string& in_update_url,
bool in_update_disabled,
const std::string& in_target_version_prefix)
@@ -60,6 +62,7 @@
app_track(in_app_track),
hardware_class(in_hardware_class),
delta_okay(in_delta_okay),
+ interactive(in_interactive),
update_url(in_update_url),
update_disabled(in_update_disabled),
target_version_prefix(in_target_version_prefix),
@@ -78,6 +81,7 @@
std::string app_track;
std::string hardware_class; // Hardware Qualification ID of the client
bool delta_okay; // If this client can accept a delta
+ bool interactive; // Whether this is a user-initiated update check
std::string update_url;
@@ -111,7 +115,8 @@
// of the parameter. Returns true on success, false otherwise.
bool Init(const std::string& in_app_version,
const std::string& in_update_url,
- const std::string& in_release_track);
+ const std::string& in_release_track,
+ bool in_interactive);
// Permanently changes the release track to |track|. Returns true on success,
// false otherwise.
diff --git a/omaha_request_params_unittest.cc b/omaha_request_params_unittest.cc
index 8908311..f3a1832 100644
--- a/omaha_request_params_unittest.cc
+++ b/omaha_request_params_unittest.cc
@@ -47,7 +47,7 @@
bool OmahaRequestDeviceParamsTest::DoTest(OmahaRequestParams* out,
const string& app_version,
const string& omaha_url) {
- bool success = params_.Init(app_version, omaha_url, "");
+ bool success = params_.Init(app_version, omaha_url, "", false);
if (out)
*out = params_;
return success;
@@ -318,7 +318,7 @@
OmahaRequestDeviceParams params;
params.set_root(string("./") + kTestDir);
params.SetLockDown(false);
- EXPECT_TRUE(params.Init("", "", ""));
+ EXPECT_TRUE(params.Init("", "", "", false));
params.SetTrack("zootrack");
}
OmahaRequestParams out;
@@ -343,7 +343,7 @@
OmahaRequestDeviceParams params;
params.set_root(string("./") + kTestDir);
params.SetLockDown(false);
- EXPECT_TRUE(params.Init("", "", ""));
+ EXPECT_TRUE(params.Init("", "", "", false));
params.SetTrack("zootrack");
}
OmahaRequestParams out;
@@ -364,7 +364,7 @@
OmahaRequestDeviceParams params;
params.set_root(string("./") + kTestDir);
params.SetLockDown(true);
- EXPECT_TRUE(params.Init("", "", ""));
+ EXPECT_TRUE(params.Init("", "", "", false));
params.SetTrack("zootrack");
}
OmahaRequestParams out;
@@ -425,15 +425,15 @@
"CHROMEOS_AUSERVER=http://www.google.com"));
params_.SetLockDown(true);
// Passed-in value for release channel should be used.
- params_.Init("", "", "beta-channel");
+ params_.Init("", "", "beta-channel", false);
EXPECT_EQ("beta-channel", params_.app_track);
// When passed-in value is invalid, value from lsb-release should be used.
- params_.Init("", "", "foo-channel");
+ params_.Init("", "", "foo-channel", false);
EXPECT_EQ("dev-channel", params_.app_track);
// When passed-in value is empty, value from lsb-release should be used.
- params_.Init("", "", "");
+ params_.Init("", "", "", false);
EXPECT_EQ("dev-channel", params_.app_track);
}
diff --git a/update_attempter.cc b/update_attempter.cc
index 569b626..b2cbe4c 100644
--- a/update_attempter.cc
+++ b/update_attempter.cc
@@ -242,7 +242,8 @@
if (!omaha_request_params_.Init(app_version,
omaha_url_to_use,
- release_track)) {
+ release_track,
+ interactive)) {
LOG(ERROR) << "Unable to initialize Omaha request device params.";
return false;
}