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