p2p: Use p2p for updates

This is the main patch for enabling use of p2p for consuming and/or
sharing updates via p2p. Refer to the ddoc and other documentation for
how this works.

BUG=chromium:260426,chromium:273110
TEST=New unit tests + unit tests pass + manual testing
Change-Id: I6bc3bddae1e041ccc176969a651396e8e89cb3f0
Reviewed-on: https://chromium-review.googlesource.com/64829
Reviewed-by: David Zeuthen <zeuthen@chromium.org>
Commit-Queue: David Zeuthen <zeuthen@chromium.org>
Tested-by: David Zeuthen <zeuthen@chromium.org>
diff --git a/omaha_request_action_unittest.cc b/omaha_request_action_unittest.cc
index cb305f7..428a286 100644
--- a/omaha_request_action_unittest.cc
+++ b/omaha_request_action_unittest.cc
@@ -58,8 +58,10 @@
     false,  // delta okay
     false,  // interactive
     "http://url",
-    false, // update_disabled
-    ""); // target_version_prefix);
+    false,  // update_disabled
+    "",     // target_version_prefix
+    false,  // use_p2p_for_downloading
+    false); // use_p2p_for_sharing
 
 string GetNoUpdateResponse(const string& app_id) {
   return string(
@@ -79,7 +81,9 @@
                           const string& needsadmin,
                           const string& size,
                           const string& deadline,
-                          const string& max_days_to_scatter) {
+                          const string& max_days_to_scatter,
+                          bool disable_p2p_for_downloading,
+                          bool disable_p2p_for_sharing) {
   string response =
       "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
       "protocol=\"3.0\">"
@@ -99,6 +103,9 @@
       "sha256=\"" + hash + "\" "
       "needsadmin=\"" + needsadmin + "\" " +
       (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
+      (disable_p2p_for_downloading ?
+          "DisableP2PForDownloading=\"true\" " : "") +
+      (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
       "/></actions></manifest></updatecheck></app></response>";
   LOG(INFO) << "Response = " << response;
   return response;
@@ -124,7 +131,9 @@
                             needsadmin,
                             size,
                             deadline,
-                            "7");
+                            "7",
+                            false,  // disable_p2p_for_downloading
+                            false); // disable_p2p_for sharing
 }
 
 class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
@@ -196,12 +205,16 @@
 
 // Returns true iff an output response was obtained from the
 // OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
-// used. out_response may be NULL. If |fail_http_response_code| is non-negative,
+// 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.
+// 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
 // post-data received by the mock HttpFetcher is returned.
 bool TestUpdateCheck(PrefsInterface* prefs,
-                     OmahaRequestParams params,
+                     PayloadStateInterface *payload_state,
+                     P2PManager *p2p_manager,
+                     OmahaRequestParams& params,
                      const string& http_response,
                      int fail_http_response_code,
                      bool ping_only,
@@ -218,6 +231,10 @@
   MockSystemState mock_system_state;
   if (prefs)
     mock_system_state.set_prefs(prefs);
+  if (payload_state)
+    mock_system_state.set_payload_state(payload_state);
+  if (p2p_manager)
+    mock_system_state.set_p2p_manager(p2p_manager);
   mock_system_state.set_request_params(&params);
   OmahaRequestAction action(&mock_system_state,
                             NULL,
@@ -276,6 +293,8 @@
   OmahaResponse response;
   ASSERT_TRUE(
       TestUpdateCheck(NULL,  // prefs
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       GetNoUpdateResponse(OmahaRequestParams::kAppId),
                       -1,
@@ -290,6 +309,8 @@
   OmahaResponse response;
   ASSERT_TRUE(
       TestUpdateCheck(NULL,  // prefs
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       GetUpdateResponse(OmahaRequestParams::kAppId,
                                         "1.2.3.4",  // version
@@ -323,6 +344,8 @@
   params.set_update_disabled(true);
   ASSERT_FALSE(
       TestUpdateCheck(NULL,  // prefs
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       params,
                       GetUpdateResponse(OmahaRequestParams::kAppId,
                                         "1.2.3.4",  // version
@@ -348,6 +371,8 @@
   params.set_update_disabled(true);
   ASSERT_TRUE(
       TestUpdateCheck(NULL,  // prefs
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       params,
                       GetNoUpdateResponse(OmahaRequestParams::kAppId),
                       -1,
@@ -376,6 +401,8 @@
 
   ASSERT_FALSE(
       TestUpdateCheck(&prefs,  // prefs
+                      NULL,    // payload_state
+                      NULL,    // p2p_manager
                       params,
                       GetUpdateResponse2(OmahaRequestParams::kAppId,
                                          "1.2.3.4",  // version
@@ -387,7 +414,9 @@
                                          "false",  // needs admin
                                          "123",  // size
                                          "",  // deadline
-                                         "7"), // max days to scatter
+                                         "7", // max days to scatter
+                                         false,  // disable_p2p_for_downloading
+                                         false), // disable_p2p_for sharing
                       -1,
                       false,  // ping_only
                       kErrorCodeOmahaUpdateDeferredPerPolicy,
@@ -399,6 +428,8 @@
   params.set_interactive(true);
   ASSERT_TRUE(
       TestUpdateCheck(&prefs,  // prefs
+                      NULL,    // payload_state
+                      NULL,    // p2p_manager
                       params,
                       GetUpdateResponse2(OmahaRequestParams::kAppId,
                                          "1.2.3.4",  // version
@@ -410,7 +441,9 @@
                                          "false",  // needs admin
                                          "123",  // size
                                          "",  // deadline
-                                         "7"), // max days to scatter
+                                         "7", // max days to scatter
+                                         false,  // disable_p2p_for_downloading
+                                         false), // disable_p2p_for sharing
                       -1,
                       false,  // ping_only
                       kErrorCodeSuccess,
@@ -440,6 +473,8 @@
 
   ASSERT_TRUE(
       TestUpdateCheck(&prefs,  // prefs
+                      NULL,    // payload_state
+                      NULL,    // p2p_manager
                       params,
                       GetUpdateResponse2(OmahaRequestParams::kAppId,
                                          "1.2.3.4",  // version
@@ -451,7 +486,9 @@
                                          "false",  // needs admin
                                          "123",  // size
                                          "",  // deadline
-                                         "7"), // max days to scatter
+                                         "7", // max days to scatter
+                                         false,  // disable_p2p_for_downloading
+                                         false), // disable_p2p_for sharing
                       -1,
                       false,  // ping_only
                       kErrorCodeSuccess,
@@ -481,6 +518,8 @@
 
   ASSERT_TRUE(
       TestUpdateCheck(&prefs,  // prefs
+                      NULL,    // payload_state
+                      NULL,    // p2p_manager
                       params,
                       GetUpdateResponse2(OmahaRequestParams::kAppId,
                                          "1.2.3.4",  // version
@@ -492,7 +531,9 @@
                                          "false",  // needs admin
                                          "123",  // size
                                          "",  // deadline
-                                         "0"), // max days to scatter
+                                         "0", // max days to scatter
+                                         false,  // disable_p2p_for_downloading
+                                         false), // disable_p2p_for sharing
                       -1,
                       false,  // ping_only
                       kErrorCodeSuccess,
@@ -523,6 +564,8 @@
 
   ASSERT_TRUE(TestUpdateCheck(
                       &prefs,  // prefs
+                      NULL,    // payload_state
+                      NULL,    // p2p_manager
                       params,
                       GetUpdateResponse2(OmahaRequestParams::kAppId,
                                          "1.2.3.4",  // version
@@ -534,7 +577,9 @@
                                          "false",  // needs admin
                                          "123",  // size
                                          "",  // deadline
-                                         "7"), // max days to scatter
+                                         "7", // max days to scatter
+                                         false,  // disable_p2p_for_downloading
+                                         false), // disable_p2p_for sharing
                       -1,
                       false,  // ping_only
                       kErrorCodeSuccess,
@@ -568,6 +613,8 @@
 
   ASSERT_FALSE(TestUpdateCheck(
                       &prefs,  // prefs
+                      NULL,    // payload_state
+                      NULL,    // p2p_manager
                       params,
                       GetUpdateResponse2(OmahaRequestParams::kAppId,
                                          "1.2.3.4",  // version
@@ -579,7 +626,9 @@
                                          "false",  // needs admin
                                          "123",  // size
                                          "",  // deadline
-                                         "7"), // max days to scatter
+                                         "7", // max days to scatter
+                                         false,  // disable_p2p_for_downloading
+                                         false), // disable_p2p_for sharing
                       -1,
                       false,  // ping_only
                       kErrorCodeOmahaUpdateDeferredPerPolicy,
@@ -595,6 +644,8 @@
   params.set_interactive(true);
   ASSERT_TRUE(
       TestUpdateCheck(&prefs,  // prefs
+                      NULL,    // payload_state
+                      NULL,    // p2p_manager
                       params,
                       GetUpdateResponse2(OmahaRequestParams::kAppId,
                                          "1.2.3.4",  // version
@@ -606,7 +657,9 @@
                                          "false",  // needs admin
                                          "123",  // size
                                          "",  // deadline
-                                         "7"), // max days to scatter
+                                         "7", // max days to scatter
+                                         false,  // disable_p2p_for_downloading
+                                         false), // disable_p2p_for sharing
                       -1,
                       false,  // ping_only
                       kErrorCodeSuccess,
@@ -638,6 +691,8 @@
 
   ASSERT_FALSE(TestUpdateCheck(
                       &prefs,  // prefs
+                      NULL,    // payload_state
+                      NULL,    // p2p_manager
                       params,
                       GetUpdateResponse2(OmahaRequestParams::kAppId,
                                          "1.2.3.4",  // version
@@ -649,7 +704,9 @@
                                          "false",  // needs admin
                                          "123",  // size
                                          "",  // deadline
-                                         "7"), // max days to scatter
+                                         "7", // max days to scatter
+                                         false,  // disable_p2p_for_downloading
+                                         false), // disable_p2p_for sharing
                       -1,
                       false,  // ping_only
                       kErrorCodeOmahaUpdateDeferredPerPolicy,
@@ -667,6 +724,8 @@
   params.set_interactive(true);
   ASSERT_TRUE(
       TestUpdateCheck(&prefs,  // prefs
+                      NULL,    // payload_state
+                      NULL,    // p2p_manager
                       params,
                       GetUpdateResponse2(OmahaRequestParams::kAppId,
                                          "1.2.3.4",  // version
@@ -678,7 +737,9 @@
                                          "false",  // needs admin
                                          "123",  // size
                                          "",  // deadline
-                                         "7"), // max days to scatter
+                                         "7", // max days to scatter
+                                         false,  // disable_p2p_for_downloading
+                                         false), // disable_p2p_for sharing
                       -1,
                       false,  // ping_only
                       kErrorCodeSuccess,
@@ -716,6 +777,8 @@
   OmahaResponse response;
   ASSERT_FALSE(
       TestUpdateCheck(NULL,  // prefs
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       "invalid xml>",
                       -1,
@@ -730,6 +793,8 @@
   OmahaResponse response;
   ASSERT_FALSE(
       TestUpdateCheck(NULL,  // prefs
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       "",
                       -1,
@@ -744,6 +809,8 @@
   OmahaResponse response;
   ASSERT_FALSE(TestUpdateCheck(
       NULL,  // prefs
+      NULL,  // payload_state
+      NULL,  // p2p_manager
       kDefaultTestParams,
       "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
       "<daystart elapsed_seconds=\"100\"/>"
@@ -762,6 +829,8 @@
   OmahaResponse response;
   ASSERT_FALSE(TestUpdateCheck(
       NULL,  // prefs
+      NULL,  // payload_state
+      NULL,  // p2p_manager
       kDefaultTestParams,
       "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
       "<daystart elapsed_seconds=\"100\"/>"
@@ -780,6 +849,8 @@
   OmahaResponse response;
   ASSERT_FALSE(TestUpdateCheck(
       NULL,  // prefs
+      NULL,  // payload_state
+      NULL,  // p2p_manager
       kDefaultTestParams,
       "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
       "<daystart elapsed_seconds=\"100\"/>"
@@ -816,6 +887,8 @@
 
   OmahaResponse response;
   ASSERT_TRUE(TestUpdateCheck(NULL,  // prefs
+                              NULL,  // payload_state
+                              NULL,  // p2p_manager
                               kDefaultTestParams,
                               input_response,
                               -1,
@@ -901,11 +974,15 @@
                             false,  // delta okay
                             false,  // interactive
                             "http://url",
-                            false,   // update_disabled
-                            "");  // target_version_prefix
+                            false,  // update_disabled
+                            "",     // target_version_prefix
+                            false,  // use_p2p_for_downloading
+                            false); // use_p2p_for_sharing
   OmahaResponse response;
   ASSERT_FALSE(
       TestUpdateCheck(NULL,  // prefs
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       params,
                       "invalid xml>",
                       -1,
@@ -929,6 +1006,8 @@
   OmahaResponse response;
   ASSERT_TRUE(
       TestUpdateCheck(NULL,  // prefs
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       GetUpdateResponse(OmahaRequestParams::kAppId,
                                         "1.2.3.4",  // version
@@ -955,6 +1034,8 @@
   OmahaResponse response;
   ASSERT_TRUE(
       TestUpdateCheck(NULL,  // prefs
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       GetUpdateResponse(OmahaRequestParams::kAppId,
                                         "1.2.3.4",  // version
@@ -983,6 +1064,8 @@
       .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
   EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
   ASSERT_FALSE(TestUpdateCheck(&prefs,
+                               NULL,  // payload_state
+                               NULL,  // p2p_manager
                                kDefaultTestParams,
                                "invalid xml>",
                                -1,
@@ -1014,6 +1097,8 @@
   OmahaRequestParams params = kDefaultTestParams;
   params.set_update_disabled(true);
   ASSERT_FALSE(TestUpdateCheck(&prefs,
+                               NULL,  // payload_state
+                               NULL,  // p2p_manager
                                params,
                                "invalid xml>",
                                -1,
@@ -1119,9 +1204,13 @@
                               delta_okay,
                               false,  // interactive
                               "http://url",
-                              false, // update_disabled
-                              "");   // target_version_prefix
+                              false,  // update_disabled
+                              "",     // target_version_prefix
+                              false,  // use_p2p_for_downloading
+                              false); // use_p2p_for_sharing
     ASSERT_FALSE(TestUpdateCheck(NULL,  // prefs
+                                 NULL,  // payload_state
+                                 NULL,  // p2p_manager
                                  params,
                                  "invalid xml>",
                                  -1,
@@ -1155,12 +1244,16 @@
                               "OEM MODEL REV 1234",
                               "ChromeOSFirmware.1.0",
                               "EC100",
-                              true,  // delta_okay
+                              true,   // delta_okay
                               interactive,
                               "http://url",
-                              false, // update_disabled
-                              "");   // target_version_prefix
+                              false,  // update_disabled
+                              "",     // target_version_prefix
+                              false,  // use_p2p_for_downloading
+                              false); // use_p2p_for_sharing
     ASSERT_FALSE(TestUpdateCheck(NULL,  // prefs
+                                 NULL,  // payload_state
+                                 NULL,  // p2p_manager
                                  params,
                                  "invalid xml>",
                                  -1,
@@ -1211,6 +1304,8 @@
     vector<char> post_data;
     ASSERT_TRUE(
         TestUpdateCheck(&prefs,
+                        NULL,  // payload_state
+                        NULL,  // p2p_manager
                         kDefaultTestParams,
                         GetNoUpdateResponse(OmahaRequestParams::kAppId),
                         -1,
@@ -1243,6 +1338,8 @@
   vector<char> post_data;
   ASSERT_TRUE(
       TestUpdateCheck(&prefs,
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       GetNoUpdateResponse(OmahaRequestParams::kAppId),
                       -1,
@@ -1267,6 +1364,8 @@
   vector<char> post_data;
   ASSERT_TRUE(
       TestUpdateCheck(&prefs,
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       GetNoUpdateResponse(OmahaRequestParams::kAppId),
                       -1,
@@ -1292,6 +1391,8 @@
   vector<char> post_data;
   ASSERT_TRUE(
       TestUpdateCheck(&prefs,
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       GetNoUpdateResponse(OmahaRequestParams::kAppId),
                       -1,
@@ -1316,6 +1417,8 @@
   vector<char> post_data;
   EXPECT_TRUE(
       TestUpdateCheck(&prefs,
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       GetNoUpdateResponse(OmahaRequestParams::kAppId),
                       -1,
@@ -1341,6 +1444,8 @@
   vector<char> post_data;
   ASSERT_TRUE(
       TestUpdateCheck(&prefs,
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
                       "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
@@ -1373,6 +1478,8 @@
       .WillOnce(Return(true));
   ASSERT_TRUE(
       TestUpdateCheck(&prefs,
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
                       "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
@@ -1391,6 +1498,8 @@
   EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
   ASSERT_TRUE(
       TestUpdateCheck(&prefs,
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
                       "protocol=\"3.0\"><daystart blah=\"200\"/>"
@@ -1409,6 +1518,8 @@
   EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
   ASSERT_TRUE(
       TestUpdateCheck(&prefs,
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
                       "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
@@ -1424,6 +1535,8 @@
 TEST(OmahaRequestActionTest, NoUniqueIDTest) {
   vector<char> post_data;
   ASSERT_FALSE(TestUpdateCheck(NULL,  // prefs
+                               NULL,  // payload_state
+                               NULL,  // p2p_manager
                                kDefaultTestParams,
                                "invalid xml>",
                                -1,
@@ -1441,6 +1554,8 @@
   OmahaResponse response;
   ASSERT_FALSE(
       TestUpdateCheck(NULL,  // prefs
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       "",
                       501,
@@ -1456,6 +1571,8 @@
   OmahaResponse response;
   ASSERT_FALSE(
       TestUpdateCheck(NULL,  // prefs
+                      NULL,  // payload_state
+                      NULL,  // p2p_manager
                       kDefaultTestParams,
                       "",
                       1500,
@@ -1485,6 +1602,8 @@
 
   ASSERT_FALSE(TestUpdateCheck(
                       &prefs,  // prefs
+                      NULL,    // payload_state
+                      NULL,    // p2p_manager
                       params,
                       GetUpdateResponse2(OmahaRequestParams::kAppId,
                                          "1.2.3.4",  // version
@@ -1496,7 +1615,9 @@
                                          "false",  // needs admin
                                          "123",  // size
                                          "",  // deadline
-                                         "7"), // max days to scatter
+                                         "7", // max days to scatter
+                                         false,  // disable_p2p_for_downloading
+                                         false), // disable_p2p_for sharing
                       -1,
                       false,  // ping_only
                       kErrorCodeOmahaUpdateDeferredPerPolicy,
@@ -1512,6 +1633,8 @@
   params.set_interactive(true);
   ASSERT_TRUE(
       TestUpdateCheck(&prefs,  // prefs
+                      NULL,    // payload_state
+                      NULL,    // p2p_manager
                       params,
                       GetUpdateResponse2(OmahaRequestParams::kAppId,
                                          "1.2.3.4",  // version
@@ -1523,7 +1646,9 @@
                                          "false",  // needs admin
                                          "123",  // size
                                          "",  // deadline
-                                         "7"), // max days to scatter
+                                         "7", // max days to scatter
+                                         false,  // disable_p2p_for_downloading
+                                         false), // disable_p2p_for sharing
                       -1,
                       false,  // ping_only
                       kErrorCodeSuccess,
@@ -1555,6 +1680,8 @@
   ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
   ASSERT_TRUE(TestUpdateCheck(
                       &prefs,  // prefs
+                      NULL,    // payload_state
+                      NULL,    // p2p_manager
                       params,
                       GetUpdateResponse2(OmahaRequestParams::kAppId,
                                          "1.2.3.4",  // version
@@ -1566,7 +1693,9 @@
                                          "false",  // needs admin
                                          "123",  // size
                                          "",  // deadline
-                                         "7"), // max days to scatter
+                                         "7", // max days to scatter
+                                         false,  // disable_p2p_for_downloading
+                                         false), // disable_p2p_for sharing
                       -1,
                       false,  // ping_only
                       kErrorCodeSuccess,
@@ -1610,6 +1739,8 @@
   EXPECT_TRUE(params.to_more_stable_channel());
   EXPECT_TRUE(params.is_powerwash_allowed());
   ASSERT_FALSE(TestUpdateCheck(&prefs,
+                               NULL,    // payload_state
+                               NULL,    // p2p_manager
                                params,
                                "invalid xml>",
                                -1,
@@ -1655,6 +1786,8 @@
   EXPECT_FALSE(params.to_more_stable_channel());
   EXPECT_FALSE(params.is_powerwash_allowed());
   ASSERT_FALSE(TestUpdateCheck(&prefs,
+                               NULL,    // payload_state
+                               NULL,    // p2p_manager
                                params,
                                "invalid xml>",
                                -1,
@@ -1673,4 +1806,145 @@
   ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
 }
 
+void P2PTest(bool initial_allow_p2p_for_downloading,
+             bool initial_allow_p2p_for_sharing,
+             bool omaha_disable_p2p_for_downloading,
+             bool omaha_disable_p2p_for_sharing,
+             bool payload_state_allow_p2p_attempt,
+             bool expect_p2p_client_lookup,
+             const string& p2p_client_result_url,
+             bool expected_allow_p2p_for_downloading,
+             bool expected_allow_p2p_for_sharing,
+             const string& expected_p2p_url) {
+  OmahaResponse response;
+  OmahaRequestParams request_params = kDefaultTestParams;
+  request_params.set_use_p2p_for_downloading(initial_allow_p2p_for_downloading);
+  request_params.set_use_p2p_for_sharing(initial_allow_p2p_for_sharing);
+
+  MockPayloadState mock_payload_state;
+  EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
+      .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
+  MockP2PManager mock_p2p_manager;
+  mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
+
+  EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, _, _))
+      .Times(expect_p2p_client_lookup ? 1 : 0);
+
+  ASSERT_TRUE(
+      TestUpdateCheck(NULL,  // prefs
+                      &mock_payload_state,
+                      &mock_p2p_manager,
+                      request_params,
+                      GetUpdateResponse2(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
+                                         "7", // max days to scatter
+                                         omaha_disable_p2p_for_downloading,
+                                         omaha_disable_p2p_for_sharing),
+                      -1,
+                      false,  // ping_only
+                      kErrorCodeSuccess,
+                      &response,
+                      NULL));
+  EXPECT_TRUE(response.update_exists);
+
+  EXPECT_EQ(response.disable_p2p_for_downloading,
+            omaha_disable_p2p_for_downloading);
+  EXPECT_EQ(response.disable_p2p_for_sharing,
+            omaha_disable_p2p_for_sharing);
+
+  EXPECT_EQ(request_params.use_p2p_for_downloading(),
+            expected_allow_p2p_for_downloading);
+
+  EXPECT_EQ(request_params.use_p2p_for_sharing(),
+            expected_allow_p2p_for_sharing);
+
+  EXPECT_EQ(request_params.p2p_url(), expected_p2p_url);
+}
+
+TEST(OmahaRequestActionTest, P2PWithPeer) {
+  P2PTest(true,                  // initial_allow_p2p_for_downloading
+          true,                  // initial_allow_p2p_for_sharing
+          false,                 // omaha_disable_p2p_for_downloading
+          false,                 // omaha_disable_p2p_for_sharing
+          true,                  // payload_state_allow_p2p_attempt
+          true,                  // expect_p2p_client_lookup
+          "http://1.3.5.7/p2p",  // p2p_client_result_url
+          true,                  // expected_allow_p2p_for_downloading
+          true,                  // expected_allow_p2p_for_sharing
+          "http://1.3.5.7/p2p"); // expected_p2p_url
+}
+
+TEST(OmahaRequestActionTest, P2PWithoutPeer) {
+  P2PTest(true,                  // initial_allow_p2p_for_downloading
+          true,                  // initial_allow_p2p_for_sharing
+          false,                 // omaha_disable_p2p_for_downloading
+          false,                 // omaha_disable_p2p_for_sharing
+          true,                  // payload_state_allow_p2p_attempt
+          true,                  // expect_p2p_client_lookup
+          "",                    // p2p_client_result_url
+          false,                 // expected_allow_p2p_for_downloading
+          true,                  // expected_allow_p2p_for_sharing
+          "");                   // expected_p2p_url
+}
+
+TEST(OmahaRequestActionTest, P2PDownloadNotAllowed) {
+  P2PTest(false,                 // initial_allow_p2p_for_downloading
+          true,                  // initial_allow_p2p_for_sharing
+          false,                 // omaha_disable_p2p_for_downloading
+          false,                 // omaha_disable_p2p_for_sharing
+          true,                  // payload_state_allow_p2p_attempt
+          false,                 // expect_p2p_client_lookup
+          "unset",               // p2p_client_result_url
+          false,                 // expected_allow_p2p_for_downloading
+          true,                  // expected_allow_p2p_for_sharing
+          "");                   // expected_p2p_url
+}
+
+TEST(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
+  P2PTest(true,                  // initial_allow_p2p_for_downloading
+          true,                  // initial_allow_p2p_for_sharing
+          true,                  // omaha_disable_p2p_for_downloading
+          false,                 // omaha_disable_p2p_for_sharing
+          true,                  // payload_state_allow_p2p_attempt
+          false,                 // expect_p2p_client_lookup
+          "unset",               // p2p_client_result_url
+          false,                 // expected_allow_p2p_for_downloading
+          true,                  // expected_allow_p2p_for_sharing
+          "");                   // expected_p2p_url
+}
+
+TEST(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
+  P2PTest(true,                  // initial_allow_p2p_for_downloading
+          true,                  // initial_allow_p2p_for_sharing
+          false,                 // omaha_disable_p2p_for_downloading
+          true,                  // omaha_disable_p2p_for_sharing
+          true,                  // payload_state_allow_p2p_attempt
+          true,                  // expect_p2p_client_lookup
+          "http://1.3.5.7/p2p",  // p2p_client_result_url
+          true,                  // expected_allow_p2p_for_downloading
+          false,                 // expected_allow_p2p_for_sharing
+          "http://1.3.5.7/p2p"); // expected_p2p_url
+}
+
+TEST(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
+  P2PTest(true,                  // initial_allow_p2p_for_downloading
+          true,                  // initial_allow_p2p_for_sharing
+          true,                  // omaha_disable_p2p_for_downloading
+          true,                  // omaha_disable_p2p_for_sharing
+          true,                  // payload_state_allow_p2p_attempt
+          false,                 // expect_p2p_client_lookup
+          "unset",               // p2p_client_result_url
+          false,                 // expected_allow_p2p_for_downloading
+          false,                 // expected_allow_p2p_for_sharing
+          "");                   // expected_p2p_url
+}
+
 }  // namespace chromeos_update_engine