AU: Implement switching of tracks through SetTrack.

On official images, update engine allows updating the track
only to dev-channel or beta-channel. The track is verified
both at setting and at getting time.

BUG=8104
TEST=unit test; tested on device

Change-Id: Ic81d4e3a9e09554d2239ee5c7a6c78e4dfe30d19

Review URL: http://codereview.chromium.org/4103002
diff --git a/omaha_request_params.h b/omaha_request_params.h
index 551a3a3..d7d2493 100644
--- a/omaha_request_params.h
+++ b/omaha_request_params.h
@@ -7,7 +7,8 @@
 
 #include <string>
 
-#include "base/basictypes.h"
+#include <base/basictypes.h>
+#include <gtest/gtest_prod.h>  // for FRIEND_TEST
 
 // This gathers local system information and prepares info used by the
 // Omaha request action.
@@ -55,6 +56,8 @@
 
   std::string update_url;
 
+  static const char kUpdateTrackKey[];
+
   // Suggested defaults
   static const char* const kAppId;
   static const char* const kOsPlatform;
@@ -64,7 +67,7 @@
 
 class OmahaRequestDeviceParams : public OmahaRequestParams {
  public:
-  OmahaRequestDeviceParams() {}
+  OmahaRequestDeviceParams();
 
   // Initializes all the data in the object. Non-empty
   // |in_app_version| or |in_update_url| prevents automatic detection
@@ -72,15 +75,40 @@
   bool Init(const std::string& in_app_version,
             const std::string& in_update_url);
 
+  // Permanently changes the release track to |track|. Returns true on success,
+  // false otherwise.
+  bool SetTrack(const std::string& track);
+  static bool SetDeviceTrack(const std::string& track);
+
   // For unit-tests.
   void set_root(const std::string& root) { root_ = root; }
 
+  // Force build type for testing purposes.
+  void SetBuildTypeOfficial(bool is_official);
+
  private:
+  FRIEND_TEST(OmahaRequestDeviceParamsTest, IsValidTrackTest);
+
+  // Use a validator that is a non-static member of this class so that its
+  // inputs can be mocked in unit tests (e.g., build type for IsValidTrack).
+  typedef bool(OmahaRequestDeviceParams::*ValueValidator)(
+      const std::string&) const;
+
+  // Returns true if this is an official build, false otherwise.
+  bool IsOfficialBuild() const;
+
+  // Returns true if |track| is a valid track, false otherwise. This method
+  // restricts the track value only if the image is official (see
+  // IsOfficialBuild).
+  bool IsValidTrack(const std::string& track) const;
+
   // Fetches the value for a given key from
-  // /mnt/stateful_partition/etc/lsb-release if possible. Failing that,
-  // it looks for the key in /etc/lsb-release.
+  // /mnt/stateful_partition/etc/lsb-release if possible. Failing that, it looks
+  // for the key in /etc/lsb-release. If |validator| is non-NULL, uses it to
+  // validate and ignore invalid valies.
   std::string GetLsbValue(const std::string& key,
-                          const std::string& default_value) const;
+                          const std::string& default_value,
+                          ValueValidator validator) const;
 
   // Gets the machine type (e.g. "i686").
   std::string GetMachineType() const;
@@ -92,6 +120,10 @@
   // When reading files, prepend root_ to the paths. Useful for testing.
   std::string root_;
 
+  // Force build type for testing purposes.
+  bool force_build_type_;
+  bool forced_official_build_;
+
   DISALLOW_COPY_AND_ASSIGN(OmahaRequestDeviceParams);
 };