// 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.

#ifndef COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_ASYNC_DOCUMENT_SUBRESOURCE_FILTER_TEST_UTILS_H_
#define COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_ASYNC_DOCUMENT_SUBRESOURCE_FILTER_TEST_UTILS_H_

#include "base/bind.h"
#include "base/callback.h"
#include "base/macros.h"
#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h"

namespace subresource_filter {
namespace testing {

// This test class is intended to be used in conjunction with an
// AsyncDocumentSubresourceFilter, and can be used to expect a certain
// activation result occured.
class TestActivationStateCallbackReceiver {
 public:
  TestActivationStateCallbackReceiver();
  ~TestActivationStateCallbackReceiver();

  base::OnceCallback<void(mojom::ActivationState)> GetCallback();
  void WaitForActivationDecision();
  void ExpectReceivedOnce(const mojom::ActivationState& expected_state) const;

  int callback_count() const { return callback_count_; }

 private:
  void Callback(mojom::ActivationState activation_state);

  mojom::ActivationState last_activation_state_;
  int callback_count_ = 0;

  base::Closure quit_closure_;

  DISALLOW_COPY_AND_ASSIGN(TestActivationStateCallbackReceiver);
};

}  // namespace testing
}  // namespace subresource_filter

#endif  // COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_ASYNC_DOCUMENT_SUBRESOURCE_FILTER_TEST_UTILS_H_
