// 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/proximity_auth/proximity_auth_profile_pref_manager.h"

#include <algorithm>
#include <memory>
#include <string>
#include <vector>

#include "base/macros.h"
#include "components/prefs/testing_pref_service.h"
#include "components/proximity_auth/proximity_auth_local_state_pref_manager.h"
#include "components/proximity_auth/proximity_auth_pref_names.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace proximity_auth {
namespace {

const char kUserEmail[] = "testuser@example.com";

const int64_t kPasswordEntryTimestampMs1 = 123456789L;
const int64_t kPasswordEntryTimestampMs2 = 987654321L;

const int64_t kPromotionCheckTimestampMs1 = 1111111111L;
const int64_t kPromotionCheckTimestampMs2 = 2222222222L;

const ProximityAuthPrefManager::ProximityThreshold kProximityThreshold1 =
    ProximityAuthPrefManager::ProximityThreshold::kFar;
const ProximityAuthPrefManager::ProximityThreshold kProximityThreshold2 =
    ProximityAuthPrefManager::ProximityThreshold::kVeryFar;

}  //  namespace

class ProximityAuthProfilePrefManagerTest : public testing::Test {
 protected:
  ProximityAuthProfilePrefManagerTest() {}

  void SetUp() override {
    ProximityAuthProfilePrefManager::RegisterPrefs(pref_service_.registry());
  }

  sync_preferences::TestingPrefServiceSyncable pref_service_;

 private:
  DISALLOW_COPY_AND_ASSIGN(ProximityAuthProfilePrefManagerTest);
};

TEST_F(ProximityAuthProfilePrefManagerTest, IsEasyUnlockAllowed) {
  ProximityAuthProfilePrefManager pref_manager(&pref_service_);
  EXPECT_TRUE(pref_manager.IsEasyUnlockAllowed());

  // Simulating setting kEasyUnlockAllowed pref through enterprise policy.
  pref_service_.SetBoolean(prefs::kEasyUnlockAllowed, false);
  EXPECT_FALSE(pref_manager.IsEasyUnlockAllowed());
}

TEST_F(ProximityAuthProfilePrefManagerTest, IsEasyUnlockEnabled) {
  ProximityAuthProfilePrefManager pref_manager(&pref_service_);
  EXPECT_FALSE(pref_manager.IsEasyUnlockEnabled());

  pref_manager.SetIsEasyUnlockEnabled(true);
  EXPECT_TRUE(pref_manager.IsEasyUnlockEnabled());

  pref_manager.SetIsEasyUnlockEnabled(false);
  EXPECT_FALSE(pref_manager.IsEasyUnlockEnabled());
}

TEST_F(ProximityAuthProfilePrefManagerTest, LastPasswordEntryTimestamp) {
  ProximityAuthProfilePrefManager pref_manager(&pref_service_);
  EXPECT_EQ(0L, pref_manager.GetLastPasswordEntryTimestampMs());
  pref_manager.SetLastPasswordEntryTimestampMs(kPasswordEntryTimestampMs1);
  EXPECT_EQ(kPasswordEntryTimestampMs1,
            pref_manager.GetLastPasswordEntryTimestampMs());
  pref_manager.SetLastPasswordEntryTimestampMs(kPasswordEntryTimestampMs2);
  EXPECT_EQ(kPasswordEntryTimestampMs2,
            pref_manager.GetLastPasswordEntryTimestampMs());
}

TEST_F(ProximityAuthProfilePrefManagerTest, LastPromotionCheckTimestamp) {
  ProximityAuthProfilePrefManager pref_manager(&pref_service_);
  EXPECT_EQ(0L, pref_manager.GetLastPromotionCheckTimestampMs());
  pref_manager.SetLastPromotionCheckTimestampMs(kPromotionCheckTimestampMs1);
  EXPECT_EQ(kPromotionCheckTimestampMs1,
            pref_manager.GetLastPromotionCheckTimestampMs());
  pref_manager.SetLastPromotionCheckTimestampMs(kPromotionCheckTimestampMs2);
  EXPECT_EQ(kPromotionCheckTimestampMs2,
            pref_manager.GetLastPromotionCheckTimestampMs());
}

TEST_F(ProximityAuthProfilePrefManagerTest, PromotionShownCount) {
  ProximityAuthProfilePrefManager pref_manager(&pref_service_);
  EXPECT_EQ(0, pref_manager.GetPromotionShownCount());
  pref_manager.SetPromotionShownCount(1);
  EXPECT_EQ(1, pref_manager.GetPromotionShownCount());
  pref_manager.SetPromotionShownCount(2);
  EXPECT_EQ(2, pref_manager.GetPromotionShownCount());
}

TEST_F(ProximityAuthProfilePrefManagerTest, ProximityThreshold) {
  ProximityAuthProfilePrefManager pref_manager(&pref_service_);
  EXPECT_EQ(1, pref_manager.GetProximityThreshold());
  pref_manager.SetProximityThreshold(kProximityThreshold1);
  EXPECT_EQ(kProximityThreshold1, pref_manager.GetProximityThreshold());
  pref_manager.SetProximityThreshold(kProximityThreshold2);
  EXPECT_EQ(kProximityThreshold2, pref_manager.GetProximityThreshold());
}

TEST_F(ProximityAuthProfilePrefManagerTest, IsChromeOSLoginEnabled) {
  ProximityAuthProfilePrefManager pref_manager(&pref_service_);
  EXPECT_TRUE(pref_manager.IsChromeOSLoginEnabled());

  pref_manager.SetIsChromeOSLoginEnabled(false);
  EXPECT_FALSE(pref_manager.IsChromeOSLoginEnabled());

  pref_manager.SetIsChromeOSLoginEnabled(true);
  EXPECT_TRUE(pref_manager.IsChromeOSLoginEnabled());
}

TEST_F(ProximityAuthProfilePrefManagerTest, SyncsToLocalPrefOnChange) {
  ProximityAuthProfilePrefManager profile_pref_manager(&pref_service_);

  TestingPrefServiceSimple local_state;
  AccountId account_id = AccountId::FromUserEmail(kUserEmail);
  ProximityAuthLocalStatePrefManager::RegisterPrefs(local_state.registry());
  profile_pref_manager.StartSyncingToLocalState(&local_state, account_id);

  // Use the local state pref manager to verify that prefs are synced correctly.
  ProximityAuthLocalStatePrefManager local_pref_manager(&local_state);
  local_pref_manager.SetActiveUser(account_id);

  profile_pref_manager.SetIsChromeOSLoginEnabled(true);
  profile_pref_manager.SetIsEasyUnlockEnabled(true);
  profile_pref_manager.SetProximityThreshold(kProximityThreshold1);
  EXPECT_TRUE(local_pref_manager.IsChromeOSLoginEnabled());
  EXPECT_TRUE(local_pref_manager.IsEasyUnlockEnabled());
  EXPECT_EQ(kProximityThreshold1, local_pref_manager.GetProximityThreshold());

  profile_pref_manager.SetIsChromeOSLoginEnabled(false);
  profile_pref_manager.SetIsEasyUnlockEnabled(false);
  profile_pref_manager.SetProximityThreshold(kProximityThreshold2);
  EXPECT_FALSE(local_pref_manager.IsChromeOSLoginEnabled());
  EXPECT_FALSE(local_pref_manager.IsEasyUnlockEnabled());
  EXPECT_EQ(kProximityThreshold2, local_pref_manager.GetProximityThreshold());

  // Test changing the kEasyUnlockAllowed pref value directly (e.g. through
  // enterprise policy).
  EXPECT_TRUE(local_pref_manager.IsEasyUnlockAllowed());
  pref_service_.SetBoolean(prefs::kEasyUnlockAllowed, false);
  EXPECT_FALSE(profile_pref_manager.IsEasyUnlockAllowed());
  EXPECT_FALSE(local_pref_manager.IsEasyUnlockAllowed());
}

}  // namespace proximity_auth
