// Copyright 2017 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/metrics/environment_recorder.h"

#include "components/metrics/metrics_pref_names.h"
#include "components/metrics/proto/system_profile.pb.h"
#include "components/prefs/testing_pref_service.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace metrics {

class EnvironmentRecorderTest : public testing::Test {
 public:
  EnvironmentRecorderTest() {
    EnvironmentRecorder::RegisterPrefs(prefs_.registry());
  }

  ~EnvironmentRecorderTest() override {}

 protected:
  TestingPrefServiceSimple prefs_;

 private:
  DISALLOW_COPY_AND_ASSIGN(EnvironmentRecorderTest);
};

TEST_F(EnvironmentRecorderTest, LoadEnvironmentFromPrefs) {
  const char* kSystemProfilePref = prefs::kStabilitySavedSystemProfile;
  const char* kSystemProfileHashPref = prefs::kStabilitySavedSystemProfileHash;

  // The pref value is empty, so loading it from prefs should fail.
  {
    EnvironmentRecorder recorder(&prefs_);
    SystemProfileProto system_profile;
    EXPECT_FALSE(recorder.LoadEnvironmentFromPrefs(&system_profile));
    EXPECT_FALSE(system_profile.has_app_version());
  }

  // Do a RecordEnvironment() call and check whether the pref is recorded.
  {
    EnvironmentRecorder recorder(&prefs_);
    SystemProfileProto system_profile;
    system_profile.set_app_version("bogus version");
    std::string serialized_profile =
        recorder.SerializeAndRecordEnvironmentToPrefs(system_profile);
    EXPECT_FALSE(serialized_profile.empty());
    EXPECT_FALSE(prefs_.GetString(kSystemProfilePref).empty());
    EXPECT_FALSE(prefs_.GetString(kSystemProfileHashPref).empty());
  }

  // Load it and check that it has the right value.
  {
    EnvironmentRecorder recorder(&prefs_);
    SystemProfileProto system_profile;
    EXPECT_TRUE(recorder.LoadEnvironmentFromPrefs(&system_profile));
    EXPECT_EQ("bogus version", system_profile.app_version());
    // Ensure that the call did not clear the prefs.
    EXPECT_FALSE(prefs_.GetString(kSystemProfilePref).empty());
    EXPECT_FALSE(prefs_.GetString(kSystemProfileHashPref).empty());
  }

  // Ensure that a non-matching hash results in the pref being invalid.
  {
    // Set the hash to a bad value.
    prefs_.SetString(kSystemProfileHashPref, "deadbeef");
    EnvironmentRecorder recorder(&prefs_);
    SystemProfileProto system_profile;
    EXPECT_FALSE(recorder.LoadEnvironmentFromPrefs(&system_profile));
    EXPECT_FALSE(system_profile.has_app_version());
  }
}

}  // namespace metrics
