// Copyright 2015 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 <string>

#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_task_environment.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/signin/core/browser/signin_investigator.h"
#include "components/signin/core/browser/signin_metrics.h"
#include "components/signin/core/browser/signin_pref_names.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "services/identity/public/cpp/identity_test_environment.h"
#include "testing/gtest/include/gtest/gtest.h"

using signin_metrics::AccountEquality;

namespace {
const char kSameEmail[] = "user1@domain.com";
const char kDifferentEmail[] = "user2@domain.com";
const char kSameId[] = "1";
const char kDifferentId[] = "2";
const char kEmptyId[] = "";

class FakeProvider : public SigninInvestigator::DependencyProvider {
 public:
  FakeProvider(const std::string& last_email, const std::string& last_id)
      : identity_test_env_(/*test_url_loader_factory=*/nullptr, &prefs_) {
    prefs_.SetString(prefs::kGoogleServicesLastUsername, last_email);
    prefs_.SetString(prefs::kGoogleServicesLastAccountId, last_id);
  }
  PrefService* GetPrefs() override { return &prefs_; }

 private:
  base::test::ScopedTaskEnvironment task_environment_;
  sync_preferences::TestingPrefServiceSyncable prefs_;
  identity::IdentityTestEnvironment identity_test_env_;
};
}  // namespace

class SigninInvestigatorTest : public testing::Test {
 protected:
  void AssertAccountEquality(const std::string& email,
                             const std::string& id,
                             bool equals_expectated,
                             AccountEquality histogram_expected) {
    FakeProvider provider(email, id);
    SigninInvestigator investigator(kSameEmail, kSameId, &provider);
    AssertAccountEquality(&investigator, equals_expectated, histogram_expected);
  }

  void AssertAccountEquality(SigninInvestigator* investigator,
                             bool equals_expectated,
                             AccountEquality histogram_expected) {
    base::HistogramTester histogram_tester;
    bool equals_actual = investigator->AreAccountsEqualWithFallback();
    ASSERT_EQ(equals_expectated, equals_actual);
    histogram_tester.ExpectUniqueSample(
        "Signin.AccountEquality", static_cast<int>(histogram_expected), 1);
  }

  void AssertInvestigatedScenario(const std::string& email,
                                  const std::string& id,
                                  InvestigatedScenario expected) {
    base::HistogramTester histogram_tester;
    FakeProvider provider(email, id);
    SigninInvestigator investigator(kSameEmail, kSameId, &provider);
    InvestigatedScenario actual = investigator.Investigate();
    ASSERT_EQ(expected, actual);
    histogram_tester.ExpectUniqueSample("Signin.InvestigatedScenario",
                                        static_cast<int>(expected), 1);
  }
};

TEST_F(SigninInvestigatorTest, EqualitySameEmailsSameIds) {
  AssertAccountEquality(kSameEmail, kSameId, true, AccountEquality::BOTH_EQUAL);
}

TEST_F(SigninInvestigatorTest, EqualitySameEmailsDifferentIds) {
  AssertAccountEquality(kSameEmail, kDifferentId, false,
                        AccountEquality::ONLY_SAME_EMAIL);
}

TEST_F(SigninInvestigatorTest, EqualityDifferentEmailsSameIds) {
  AssertAccountEquality(kDifferentEmail, kSameId, true,
                        AccountEquality::ONLY_SAME_ID);
}

TEST_F(SigninInvestigatorTest, EqualityDifferentEmailsDifferentIds) {
  AssertAccountEquality(kDifferentEmail, kDifferentId, false,
                        AccountEquality::BOTH_DIFFERENT);
}

TEST_F(SigninInvestigatorTest, EqualitySameEmailFallback) {
  AssertAccountEquality(kSameEmail, kEmptyId, true,
                        AccountEquality::EMAIL_FALLBACK);
}

TEST_F(SigninInvestigatorTest, EqualityDifferentEmailFallback) {
  AssertAccountEquality(kDifferentEmail, kEmptyId, false,
                        AccountEquality::EMAIL_FALLBACK);
}

TEST_F(SigninInvestigatorTest, EqualitySameEmailFallbackEmptyCurrentId) {
  FakeProvider provider(kSameEmail, kDifferentId);
  SigninInvestigator investigator(kSameEmail, kEmptyId, &provider);
  AssertAccountEquality(&investigator, true, AccountEquality::EMAIL_FALLBACK);
}

TEST_F(SigninInvestigatorTest, EqualityDifferentEmailFallbackEmptyCurrentId) {
  FakeProvider provider(kDifferentId, kDifferentId);
  SigninInvestigator investigator(kSameEmail, kEmptyId, &provider);
  AssertAccountEquality(&investigator, false, AccountEquality::EMAIL_FALLBACK);
}

TEST_F(SigninInvestigatorTest, InvestigateSameAccount) {
  AssertInvestigatedScenario(kSameEmail, kSameId,
                             InvestigatedScenario::SAME_ACCOUNT);
}

TEST_F(SigninInvestigatorTest, InvestigateUpgrade) {
  AssertInvestigatedScenario("", "", InvestigatedScenario::UPGRADE_LOW_RISK);
}

TEST_F(SigninInvestigatorTest, InvestigateDifferentAccount) {
  AssertInvestigatedScenario(kDifferentEmail, kDifferentId,
                             InvestigatedScenario::DIFFERENT_ACCOUNT);
}
