| Index: src/platform/update_engine/omaha_request_prep_action_unittest.cc
 | 
| diff --git a/src/platform/update_engine/omaha_request_prep_action_unittest.cc b/src/platform/update_engine/omaha_request_prep_action_unittest.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..19da5e574edafda447afd05d1734dbf9a166ea2a
 | 
| --- /dev/null
 | 
| +++ b/src/platform/update_engine/omaha_request_prep_action_unittest.cc
 | 
| @@ -0,0 +1,175 @@
 | 
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#include <stdio.h>
 | 
| +#include <string>
 | 
| +#include <gtest/gtest.h>
 | 
| +#include "update_engine/install_plan.h"
 | 
| +#include "update_engine/omaha_request_prep_action.h"
 | 
| +#include "update_engine/test_utils.h"
 | 
| +#include "update_engine/utils.h"
 | 
| +
 | 
| +using std::string;
 | 
| +
 | 
| +namespace chromeos_update_engine {
 | 
| +
 | 
| +class OmahaRequestPrepActionTest : public ::testing::Test {
 | 
| + public:
 | 
| +  // Return true iff the OmahaResponseHandlerAction succeeded.
 | 
| +  // if out is non-NULL, it's set w/ the response from the action.
 | 
| +  bool DoTest(bool force_full_update, UpdateCheckParams* out);
 | 
| +  static const string kTestDir;
 | 
| +};
 | 
| +
 | 
| +const string OmahaRequestPrepActionTest::kTestDir = "request_prep_action-test";
 | 
| +
 | 
| +class OmahaRequestPrepActionProcessorDelegate
 | 
| +    : public ActionProcessorDelegate {
 | 
| + public:
 | 
| +  OmahaRequestPrepActionProcessorDelegate()
 | 
| +      : success_(false),
 | 
| +        success_set_(false) {}
 | 
| +  void ActionCompleted(ActionProcessor* processor,
 | 
| +                       AbstractAction* action,
 | 
| +                       bool success) {
 | 
| +    if (action->Type() == OmahaRequestPrepAction::StaticType()) {
 | 
| +      success_ = success;
 | 
| +      success_set_ = true;
 | 
| +    }
 | 
| +  }
 | 
| +  bool success_;
 | 
| +  bool success_set_;
 | 
| +};
 | 
| +
 | 
| +bool OmahaRequestPrepActionTest::DoTest(bool force_full_update,
 | 
| +                                        UpdateCheckParams* out) {
 | 
| +  ActionProcessor processor;
 | 
| +  OmahaRequestPrepActionProcessorDelegate delegate;
 | 
| +  processor.set_delegate(&delegate);
 | 
| +
 | 
| +  OmahaRequestPrepAction request_prep_action(force_full_update);
 | 
| +  request_prep_action.set_root(string("./") + kTestDir);
 | 
| +  ObjectCollectorAction<UpdateCheckParams> collector_action;
 | 
| +  BondActions(&request_prep_action, &collector_action);
 | 
| +  processor.EnqueueAction(&request_prep_action);
 | 
| +  processor.EnqueueAction(&collector_action);
 | 
| +  processor.StartProcessing();
 | 
| +  EXPECT_TRUE(!processor.IsRunning())
 | 
| +      << "Update test to handle non-asynch actions";
 | 
| +  if (out)
 | 
| +    *out = collector_action.object();
 | 
| +  EXPECT_TRUE(delegate.success_set_);
 | 
| +  return delegate.success_;
 | 
| +}
 | 
| +
 | 
| +namespace {
 | 
| +// Returns true iff str is formatted as a mac address
 | 
| +bool IsValidMac(const string& str) {
 | 
| +  if (str.size() != (3 * 6 - 1))
 | 
| +    return false;
 | 
| +  for (unsigned int i = 0; i < str.size(); i++) {
 | 
| +    char c = str[i];
 | 
| +    switch (i % 3) {
 | 
| +      case 0:  // fall through
 | 
| +      case 1:
 | 
| +        if ((c >= '0') && (c <= '9'))
 | 
| +          break;
 | 
| +        if ((c >= 'a') && (c <= 'f'))
 | 
| +          break;
 | 
| +        if ((c >= 'A') && (c <= 'F'))
 | 
| +          break;
 | 
| +        return false;
 | 
| +      case 2:
 | 
| +        if (c == ':')
 | 
| +          break;
 | 
| +        return false;
 | 
| +    }
 | 
| +  }
 | 
| +  return true;
 | 
| +}
 | 
| +string GetMachineType() {
 | 
| +  FILE* fp = popen("uname -m", "r");
 | 
| +  if (!fp)
 | 
| +    return "";
 | 
| +  string ret;
 | 
| +  for (;;) {
 | 
| +    char buffer[10];
 | 
| +    size_t r = fread(buffer, 1, sizeof(buffer), fp);
 | 
| +    if (r == 0)
 | 
| +      break;
 | 
| +    ret.insert(ret.begin(), buffer, buffer + r);
 | 
| +  }
 | 
| +  // strip trailing '\n' if it exists
 | 
| +  if ((*ret.rbegin()) == '\n')
 | 
| +    ret.resize(ret.size() - 1);
 | 
| +  fclose(fp);
 | 
| +  return ret;
 | 
| +}
 | 
| +}  // namespace {}
 | 
| +
 | 
| +TEST_F(OmahaRequestPrepActionTest, SimpleTest) {
 | 
| +  ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
 | 
| +  {
 | 
| +    ASSERT_TRUE(WriteFileString(
 | 
| +        kTestDir + "/etc/lsb-release",
 | 
| +        "GOOGLE_FOO=bar\nGOOGLE_RELEASE=0.2.2.3\nGOOGLE_TRACK=footrack"));
 | 
| +    UpdateCheckParams out;
 | 
| +    EXPECT_TRUE(DoTest(false, &out));
 | 
| +    EXPECT_TRUE(IsValidMac(out.machine_id));
 | 
| +    // for now we're just using the machine id here
 | 
| +    EXPECT_TRUE(IsValidMac(out.user_id));
 | 
| +    EXPECT_EQ("Chrome OS", out.os_platform);
 | 
| +    EXPECT_EQ(string("0.2.2.3_") + GetMachineType(), out.os_sp);
 | 
| +    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_EQ("footrack", out.app_track);
 | 
| +  }
 | 
| +  EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
 | 
| +}
 | 
| +
 | 
| +TEST_F(OmahaRequestPrepActionTest, MissingTrackTest) {
 | 
| +  ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
 | 
| +  {
 | 
| +    ASSERT_TRUE(WriteFileString(
 | 
| +        kTestDir + "/etc/lsb-release",
 | 
| +        "GOOGLE_FOO=bar\nGOOGLE_RELEASE=0.2.2.3\nGOOGLE_TRXCK=footrack"));
 | 
| +    UpdateCheckParams out;
 | 
| +    EXPECT_TRUE(DoTest(false, &out));
 | 
| +    EXPECT_TRUE(IsValidMac(out.machine_id));
 | 
| +    // for now we're just using the machine id here
 | 
| +    EXPECT_TRUE(IsValidMac(out.user_id));
 | 
| +    EXPECT_EQ("Chrome OS", out.os_platform);
 | 
| +    EXPECT_EQ(string("0.2.2.3_") + GetMachineType(), out.os_sp);
 | 
| +    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_EQ("", out.app_track);
 | 
| +  }
 | 
| +  EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
 | 
| +}
 | 
| +
 | 
| +TEST_F(OmahaRequestPrepActionTest, ConfusingReleaseTest) {
 | 
| +  ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
 | 
| +  {
 | 
| +    ASSERT_TRUE(WriteFileString(
 | 
| +        kTestDir + "/etc/lsb-release",
 | 
| +        "GOOGLE_FOO=GOOGLE_RELEASE=1.2.3.4\n"
 | 
| +        "GOOGLE_RELEASE=0.2.2.3\nGOOGLE_TRXCK=footrack"));
 | 
| +    UpdateCheckParams out;
 | 
| +    EXPECT_TRUE(DoTest(false, &out));
 | 
| +    EXPECT_TRUE(IsValidMac(out.machine_id));
 | 
| +    // for now we're just using the machine id here
 | 
| +    EXPECT_TRUE(IsValidMac(out.user_id));
 | 
| +    EXPECT_EQ("Chrome OS", out.os_platform);
 | 
| +    EXPECT_EQ(string("0.2.2.3_") + GetMachineType(), out.os_sp);
 | 
| +    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_EQ("", out.app_track);
 | 
| +  }
 | 
| +  EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
 | 
| +}
 | 
| +
 | 
| +}  // namespace chromeos_update_engine
 | 
| 
 |