Only disable update downloads over expensive connections, not all transfers.
Previous to this CL, all network traffic was disabled from the update engine
if an update wasn't allowed. Instead, in this CL, we switch to only disable
the update application portion (downloading and applying the payload). This
is done by moving the detection logic from the mechanism (the network fetcher)
to the user of said mechanism i.e. the omaha request/response actions.
I have done a little refactoring of the unittests to make this CL easier to
test and found 1 bug in the http_fetcher_unittests where we weren't sending
either the right URL or handling a server not existing correctly.
This CL comes with one caveat:
Technically in the previous impl if a download started over wifi then got
disconnected / retried and bounced to a different connection type that
we couldn't update over, we'd stop the update. This would no longer be true
here if the http_fetcher recovered seamlessly.
BUG=chromium:379832
TEST=Unittests
Change-Id: I6b1a76e4c030d4e384e8ba0b519424a35406aafb
Reviewed-on: https://chromium-review.googlesource.com/202435
Tested-by: Chris Sosa <[email protected]>
Reviewed-by: David Zeuthen <[email protected]>
Commit-Queue: Chris Sosa <[email protected]>
diff --git a/omaha_request_action_unittest.cc b/omaha_request_action_unittest.cc
index 9de0e9f..e371103 100644
--- a/omaha_request_action_unittest.cc
+++ b/omaha_request_action_unittest.cc
@@ -10,10 +10,12 @@
#include <base/strings/string_util.h>
#include <base/strings/stringprintf.h>
#include <base/time/time.h>
+#include <chromeos/dbus/service_constants.h>
#include "gtest/gtest.h"
#include "update_engine/action_pipe.h"
#include "update_engine/constants.h"
+#include "update_engine/mock_connection_manager.h"
#include "update_engine/mock_http_fetcher.h"
#include "update_engine/omaha_hash_calculator.h"
#include "update_engine/omaha_request_action.h"
@@ -212,6 +214,7 @@
// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
// used. |payload_state| may be NULL, in which case a local mock is used.
// |p2p_manager| may be NULL, in which case a local mock is used.
+// |connection_manager| may be NULL, in which case a local mock is used.
// out_response may be NULL. If |fail_http_response_code| is non-negative,
// the transfer will fail with that code. |ping_only| is passed through to the
// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
@@ -225,6 +228,7 @@
bool TestUpdateCheck(PrefsInterface* prefs,
PayloadStateInterface *payload_state,
P2PManager *p2p_manager,
+ ConnectionManager *connection_manager,
OmahaRequestParams& params,
const string& http_response,
int fail_http_response_code,
@@ -249,6 +253,8 @@
fake_system_state.set_payload_state(payload_state);
if (p2p_manager)
fake_system_state.set_p2p_manager(p2p_manager);
+ if (connection_manager)
+ fake_system_state.set_connection_manager(connection_manager);
fake_system_state.set_request_params(¶ms);
OmahaRequestAction action(&fake_system_state,
NULL,
@@ -327,6 +333,7 @@
TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
GetNoUpdateResponse(OmahaRequestParams::kAppId),
-1,
@@ -346,6 +353,7 @@
TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
GetUpdateResponse(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -384,6 +392,7 @@
TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetUpdateResponse(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -406,6 +415,82 @@
EXPECT_FALSE(response.update_exists);
}
+TEST(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
+ OmahaResponse response;
+ // Set up a connection manager that doesn't allow a valid update over
+ // the current ethernet connection.
+ MockConnectionManager mock_cm(NULL);
+ EXPECT_CALL(mock_cm, GetConnectionProperties(_,_,_))
+ .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetEthernet),
+ SetArgumentPointee<2>(NetworkTethering::kUnknown),
+ Return(true)));
+ EXPECT_CALL(mock_cm, IsUpdateAllowedOver(kNetEthernet, _))
+ .WillRepeatedly(Return(false));
+ EXPECT_CALL(mock_cm, StringForConnectionType(kNetEthernet))
+ .WillRepeatedly(Return(shill::kTypeEthernet));
+
+ ASSERT_FALSE(
+ TestUpdateCheck(NULL, // prefs
+ NULL, // payload_state
+ NULL, // p2p_manager
+ &mock_cm, // connection_manager
+ kDefaultTestParams,
+ GetUpdateResponse(OmahaRequestParams::kAppId,
+ "1.2.3.4", // version
+ "http://more/info",
+ "true", // prompt
+ "http://code/base/", // dl url
+ "file.signed", // file name
+ "HASH1234=", // checksum
+ "false", // needs admin
+ "123", // size
+ ""), // deadline
+ -1,
+ false, // ping_only
+ kErrorCodeOmahaUpdateIgnoredPerPolicy,
+ metrics::CheckResult::kUpdateAvailable,
+ metrics::CheckReaction::kIgnored,
+ metrics::DownloadErrorCode::kUnset,
+ &response,
+ NULL));
+ EXPECT_FALSE(response.update_exists);
+}
+
+TEST(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
+ string rollback_version = "1234.0.0";
+ OmahaResponse response;
+
+ MockPayloadState mock_payload_state;
+ EXPECT_CALL(mock_payload_state, GetRollbackVersion())
+ .WillRepeatedly(Return(rollback_version));
+
+ ASSERT_FALSE(
+ TestUpdateCheck(NULL, // prefs
+ &mock_payload_state, // payload_state
+ NULL, // p2p_manager
+ NULL, // connection_manager
+ kDefaultTestParams,
+ GetUpdateResponse(OmahaRequestParams::kAppId,
+ rollback_version, // version
+ "http://more/info",
+ "true", // prompt
+ "http://code/base/", // dl url
+ "file.signed", // file name
+ "HASH1234=", // checksum
+ "false", // needs admin
+ "123", // size
+ ""), // deadline
+ -1,
+ false, // ping_only
+ kErrorCodeOmahaUpdateIgnoredPerPolicy,
+ metrics::CheckResult::kUpdateAvailable,
+ metrics::CheckReaction::kIgnored,
+ metrics::DownloadErrorCode::kUnset,
+ &response,
+ NULL));
+ EXPECT_FALSE(response.update_exists);
+}
+
TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
OmahaResponse response;
OmahaRequestParams params = kDefaultTestParams;
@@ -414,6 +499,7 @@
TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetNoUpdateResponse(OmahaRequestParams::kAppId),
-1,
@@ -447,6 +533,7 @@
TestUpdateCheck(&prefs, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -478,6 +565,7 @@
TestUpdateCheck(&prefs, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -527,6 +615,7 @@
TestUpdateCheck(&prefs, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -576,6 +665,7 @@
TestUpdateCheck(&prefs, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -626,6 +716,7 @@
&prefs, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -679,6 +770,7 @@
&prefs, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -714,6 +806,7 @@
TestUpdateCheck(&prefs, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -765,6 +858,7 @@
&prefs, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -802,6 +896,7 @@
TestUpdateCheck(&prefs, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -859,6 +954,7 @@
TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
"invalid xml>",
-1,
@@ -878,6 +974,7 @@
TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
"",
-1,
@@ -897,6 +994,7 @@
NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
"<daystart elapsed_seconds=\"100\"/>"
@@ -920,6 +1018,7 @@
NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
"<daystart elapsed_seconds=\"100\"/>"
@@ -943,6 +1042,7 @@
NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
"<daystart elapsed_seconds=\"100\"/>"
@@ -984,6 +1084,7 @@
ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
input_response,
-1,
@@ -1081,6 +1182,7 @@
TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
"invalid xml>",
-1,
@@ -1109,6 +1211,7 @@
TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
GetUpdateResponse(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -1140,6 +1243,7 @@
TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
GetUpdateResponse(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -1173,6 +1277,7 @@
ASSERT_FALSE(TestUpdateCheck(&prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
"invalid xml>",
-1,
@@ -1209,6 +1314,7 @@
ASSERT_FALSE(TestUpdateCheck(&prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
"invalid xml>",
-1,
@@ -1324,6 +1430,7 @@
ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
"invalid xml>",
-1,
@@ -1371,6 +1478,7 @@
ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
"invalid xml>",
-1,
@@ -1431,6 +1539,7 @@
TestUpdateCheck(&prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
GetNoUpdateResponse(OmahaRequestParams::kAppId),
-1,
@@ -1473,6 +1582,7 @@
TestUpdateCheck(&prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
GetNoUpdateResponse(OmahaRequestParams::kAppId),
-1,
@@ -1507,6 +1617,7 @@
TestUpdateCheck(&prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
GetNoUpdateResponse(OmahaRequestParams::kAppId),
-1,
@@ -1542,6 +1653,7 @@
TestUpdateCheck(&prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
GetNoUpdateResponse(OmahaRequestParams::kAppId),
-1,
@@ -1571,6 +1683,7 @@
TestUpdateCheck(&prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
GetNoUpdateResponse(OmahaRequestParams::kAppId),
-1,
@@ -1606,6 +1719,7 @@
TestUpdateCheck(&prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
"protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
@@ -1645,6 +1759,7 @@
TestUpdateCheck(&prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
"protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
@@ -1670,6 +1785,7 @@
TestUpdateCheck(&prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
"protocol=\"3.0\"><daystart blah=\"200\"/>"
@@ -1695,6 +1811,7 @@
TestUpdateCheck(&prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
"protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
@@ -1715,6 +1832,7 @@
ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
"invalid xml>",
-1,
@@ -1737,6 +1855,7 @@
TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
"",
501,
@@ -1757,6 +1876,7 @@
TestUpdateCheck(NULL, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
"",
1500,
@@ -1791,6 +1911,7 @@
&prefs, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -1826,6 +1947,7 @@
TestUpdateCheck(&prefs, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -1877,6 +1999,7 @@
&prefs, // prefs
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -1940,6 +2063,7 @@
ASSERT_FALSE(TestUpdateCheck(&prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
"invalid xml>",
-1,
@@ -1990,6 +2114,7 @@
ASSERT_FALSE(TestUpdateCheck(&prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
params,
"invalid xml>",
-1,
@@ -2040,6 +2165,7 @@
TestUpdateCheck(NULL, // prefs
&mock_payload_state,
&mock_p2p_manager,
+ NULL, // connection_manager
request_params,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version
@@ -2164,6 +2290,7 @@
TestUpdateCheck(prefs,
NULL, // payload_state
NULL, // p2p_manager
+ NULL, // connection_manager
kDefaultTestParams,
GetUpdateResponse2(OmahaRequestParams::kAppId,
"1.2.3.4", // version