// Copyright 2015 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 LIBPROTOBINDER_BINDER_MANAGER_STUB_H_
#define LIBPROTOBINDER_BINDER_MANAGER_STUB_H_

#include <cstdint>
#include <map>
#include <set>

#include <base/macros.h>
#include <base/memory/linked_ptr.h>

#include "binder_manager.h"  // NOLINT(build/include)

namespace protobinder {

class IInterface;

// Stub implementation of BinderManagerInterface for testing.
class BINDER_EXPORT BinderManagerStub : public BinderManagerInterface {
 public:
  BinderManagerStub();
  ~BinderManagerStub() override;

  // If death notifications have been requested for |proxy|, sends a
  // notification.
  void ReportBinderDeath(BinderProxy* proxy);

  // Ensures that the next CreateTestInterface() call for |proxy| will return
  // |interface|, allowing tests to set their own interfaces for proxies that
  // they've created.
  void SetTestInterface(BinderProxy* proxy, scoped_ptr<IInterface> interface);

  // BinderManagerInterface:
  int Transact(uint32_t handle,
               uint32_t code,
               const Parcel& data,
               Parcel* reply,
               uint32_t flags) override;
  void IncWeakHandle(uint32_t handle) override;
  void DecWeakHandle(uint32_t handle) override;
  void EnterLoop() override;
  bool GetFdForPolling(int* fd) override;
  bool HandleEvent() override;
  void RequestDeathNotification(BinderProxy* proxy) override;
  void ClearDeathNotification(BinderProxy* proxy) override;
  IInterface* CreateTestInterface(const IBinder* binder) override;

 private:
  // Handles of BinderProxy objects that have requested death notifications.
  std::set<uint32_t> handles_requesting_death_notifications_;

  // Maps from BinderProxy handles to test interface objects that should be
  // released and returned in response to CreateTestInterface() calls.
  std::map<uint32_t, linked_ptr<IInterface>> test_interfaces_;

  DISALLOW_COPY_AND_ASSIGN(BinderManagerStub);
};

}  // namespace protobinder

#endif  // LIBPROTOBINDER_BINDER_MANAGER_STUB_H_
