// Copyright 2016 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 "components/update_client/updater_state.h"

#include "base/macros.h"
#include "base/time/time.h"
#include "base/version.h"
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace update_client {

class UpdaterStateTest : public testing::Test {
 public:
  UpdaterStateTest() {}
  ~UpdaterStateTest() override {}

 private:
  DISALLOW_COPY_AND_ASSIGN(UpdaterStateTest);
};

TEST_F(UpdaterStateTest, Serialize) {
  UpdaterState updater_state(false);

  updater_state.updater_name_ = "the updater";
  updater_state.updater_version_ = base::Version("1.0");
  updater_state.last_autoupdate_started_ = base::Time::NowFromSystemTime();
  updater_state.last_checked_ = base::Time::NowFromSystemTime();
  updater_state.is_enterprise_managed_ = false;
  updater_state.is_autoupdate_check_enabled_ = true;
  updater_state.update_policy_ = 1;

  auto attributes = updater_state.BuildAttributes();

  // Sanity check all members.
  EXPECT_STREQ("the updater", attributes.at("name").c_str());
  EXPECT_STREQ("1.0", attributes.at("version").c_str());
  EXPECT_STREQ("0", attributes.at("laststarted").c_str());
  EXPECT_STREQ("0", attributes.at("lastchecked").c_str());
  EXPECT_STREQ("0", attributes.at("domainjoined").c_str());
  EXPECT_STREQ("1", attributes.at("autoupdatecheckenabled").c_str());
  EXPECT_STREQ("1", attributes.at("updatepolicy").c_str());

#if defined(GOOGLE_CHROME_BUILD)
#if defined(OS_WIN)
  // The value of "ismachine".
  EXPECT_STREQ("0", UpdaterState::GetState(false)->at("ismachine").c_str());
  EXPECT_STREQ("1", UpdaterState::GetState(true)->at("ismachine").c_str());

  // The name of the Windows updater for Chrome.
  EXPECT_STREQ("Omaha", UpdaterState::GetState(false)->at("name").c_str());
#elif defined(OS_MACOSX) && !defined(OS_IOS)
  // MacOS does not serialize "ismachine".
  EXPECT_EQ(0UL, UpdaterState::GetState(false)->count("ismachine"));
  EXPECT_EQ(0UL, UpdaterState::GetState(true)->count("ismachine"));
  EXPECT_STREQ("Keystone", UpdaterState::GetState(false)->at("name").c_str());
#endif  // OS_WIN
#endif  // GOOGLE_CHROME_BUILD

  // Tests some of the remaining values.
  updater_state = UpdaterState(false);

  // Don't serialize an invalid version if it could not be read.
  updater_state.updater_version_ = base::Version();
  attributes = updater_state.BuildAttributes();
  EXPECT_EQ(0u, attributes.count("version"));

  updater_state.updater_version_ = base::Version("0.0.0.0");
  attributes = updater_state.BuildAttributes();
  EXPECT_STREQ("0.0.0.0", attributes.at("version").c_str());

  updater_state.last_autoupdate_started_ =
      base::Time::NowFromSystemTime() - base::TimeDelta::FromDays(15);
  attributes = updater_state.BuildAttributes();
  EXPECT_STREQ("408", attributes.at("laststarted").c_str());

  updater_state.last_autoupdate_started_ =
      base::Time::NowFromSystemTime() - base::TimeDelta::FromDays(90);
  attributes = updater_state.BuildAttributes();
  EXPECT_STREQ("1344", attributes.at("laststarted").c_str());

  // Don't serialize the time if it could not be read.
  updater_state.last_autoupdate_started_ = base::Time();
  attributes = updater_state.BuildAttributes();
  EXPECT_EQ(0u, attributes.count("laststarted"));

  updater_state.last_checked_ =
      base::Time::NowFromSystemTime() - base::TimeDelta::FromDays(15);
  attributes = updater_state.BuildAttributes();
  EXPECT_STREQ("408", attributes.at("lastchecked").c_str());

  updater_state.last_checked_ =
      base::Time::NowFromSystemTime() - base::TimeDelta::FromDays(90);
  attributes = updater_state.BuildAttributes();
  EXPECT_STREQ("1344", attributes.at("lastchecked").c_str());

  // Don't serialize the time if it could not be read (the value is invalid).
  updater_state.last_checked_ = base::Time();
  attributes = updater_state.BuildAttributes();
  EXPECT_EQ(0u, attributes.count("lastchecked"));

  updater_state.is_enterprise_managed_ = true;
  attributes = updater_state.BuildAttributes();
  EXPECT_STREQ("1", attributes.at("domainjoined").c_str());

  updater_state.is_autoupdate_check_enabled_ = false;
  attributes = updater_state.BuildAttributes();
  EXPECT_STREQ("0", attributes.at("autoupdatecheckenabled").c_str());

  updater_state.update_policy_ = 0;
  attributes = updater_state.BuildAttributes();
  EXPECT_STREQ("0", attributes.at("updatepolicy").c_str());

  updater_state.update_policy_ = -1;
  attributes = updater_state.BuildAttributes();
  EXPECT_STREQ("-1", attributes.at("updatepolicy").c_str());
}

}  // namespace update_client
