// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef METRICS_METRICS_LIBRARY_MOCK_H_
#define METRICS_METRICS_LIBRARY_MOCK_H_

#include <string>

#include "metrics/metrics_library.h"

#include <gmock/gmock.h>

class MetricsLibraryMock : public MetricsLibraryInterface {
 public:
  // TODO(chromium:940343): Remove this function.
  MOCK_METHOD(void, Init, (), (override));
  MOCK_METHOD(bool,
              SendToUMA,
              (const std::string&, int, int, int, int),
              (override));
  MOCK_METHOD(bool, SendEnumToUMA, (const std::string&, int, int), (override));
  MOCK_METHOD(bool, SendBoolToUMA, (const std::string&, bool), (override));
  MOCK_METHOD(bool, SendSparseToUMA, (const std::string&, int), (override));
  MOCK_METHOD(bool, SendUserActionToUMA, (const std::string&), (override));
  MOCK_METHOD(bool, SendCrashToUMA, (const char* crash_kind), (override));
  MOCK_METHOD(bool, SendCrosEventToUMA, (const std::string& event), (override));
#if USE_METRICS_UPLOADER
  MOCK_METHOD(bool,
              SendRepeatedToUMA,
              (const std::string&, int, int, int, int, int),
              (override));
#endif
  bool AreMetricsEnabled() override { return metrics_enabled_; };
  bool IsGuestMode() override { return guest_mode_; }

  void set_metrics_enabled(bool value) { metrics_enabled_ = value; }
  void set_guest_mode(bool value) { guest_mode_ = value; }

 private:
  bool metrics_enabled_ = true;
  bool guest_mode_ = false;
};

#endif  // METRICS_METRICS_LIBRARY_MOCK_H_
