// Copyright 2019 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/arc/metrics/stability_metrics_manager.h"

#include "base/test/metrics/histogram_tester.h"
#include "components/arc/arc_prefs.h"
#include "components/prefs/testing_pref_service.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace arc {

class StabilityMetricsManagerTest : public testing::Test {
 protected:
  StabilityMetricsManagerTest() {
    prefs::RegisterLocalStatePrefs(local_state.registry());
    StabilityMetricsManager::Initialize(&local_state);
  }

  ~StabilityMetricsManagerTest() override {
    StabilityMetricsManager::Shutdown();
  }

  static StabilityMetricsManager* manager() {
    return StabilityMetricsManager::Get();
  }

 private:
  TestingPrefServiceSimple local_state;

  DISALLOW_COPY_AND_ASSIGN(StabilityMetricsManagerTest);
};

TEST_F(StabilityMetricsManagerTest, GetArcEnabledState) {
  EXPECT_FALSE(manager()->GetArcEnabledState().has_value());

  manager()->SetArcEnabledState(true);
  EXPECT_EQ(manager()->GetArcEnabledState(), true);

  manager()->SetArcEnabledState(false);
  EXPECT_EQ(manager()->GetArcEnabledState(), false);

  manager()->ResetMetrics();
  EXPECT_FALSE(manager()->GetArcEnabledState().has_value());
}

TEST_F(StabilityMetricsManagerTest, GetArcNativeBridgeType) {
  EXPECT_FALSE(manager()->GetArcNativeBridgeType().has_value());

  for (NativeBridgeType type :
       {NativeBridgeType::UNKNOWN, NativeBridgeType::NONE,
        NativeBridgeType::HOUDINI, NativeBridgeType::NDK_TRANSLATION}) {
    manager()->SetArcNativeBridgeType(type);
    EXPECT_EQ(manager()->GetArcNativeBridgeType(), type);
  }

  manager()->ResetMetrics();
  EXPECT_FALSE(manager()->GetArcNativeBridgeType().has_value());
}

TEST_F(StabilityMetricsManagerTest, RecordEnabledStateToUMA) {
  base::HistogramTester tester;

  manager()->SetArcEnabledState(true);
  manager()->RecordMetricsToUMA();
  tester.ExpectBucketCount("Arc.State", 1, 1);

  manager()->SetArcEnabledState(false);
  manager()->RecordMetricsToUMA();
  tester.ExpectBucketCount("Arc.State", 0, 1);
}

TEST_F(StabilityMetricsManagerTest, RecordNativeBridgeTypeToUMA) {
  base::HistogramTester tester;

  EXPECT_EQ(NativeBridgeType::kMaxValue, NativeBridgeType::NDK_TRANSLATION);
  for (NativeBridgeType type :
       {NativeBridgeType::UNKNOWN, NativeBridgeType::NONE,
        NativeBridgeType::HOUDINI, NativeBridgeType::NDK_TRANSLATION}) {
    manager()->SetArcNativeBridgeType(type);
    manager()->RecordMetricsToUMA();
    tester.ExpectBucketCount("Arc.NativeBridge", static_cast<int>(type), 1);
  }
}

TEST_F(StabilityMetricsManagerTest, ResetMetrics) {
  base::HistogramTester tester;

  manager()->SetArcEnabledState(true);
  manager()->SetArcNativeBridgeType(NativeBridgeType::NONE);
  manager()->RecordMetricsToUMA();
  tester.ExpectBucketCount("Arc.State", 1, 1);
  tester.ExpectBucketCount("Arc.NativeBridge",
                           static_cast<int>(NativeBridgeType::NONE), 1);

  manager()->ResetMetrics();
  manager()->RecordMetricsToUMA();
  // Bucket counts should remain the same.
  tester.ExpectBucketCount("Arc.State", 1, 1);
  tester.ExpectBucketCount("Arc.NativeBridge",
                           static_cast<int>(NativeBridgeType::NONE), 1);
}

}  // namespace arc
