blob: 01eed9a06a2ed3f212e88bac5a6254de54f027b8 [file] [log] [blame]
// 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 <memory>
#include <set>
#include <base/macros.h>
#include "binder_manager.h" // NOLINT(build/include)
namespace protobinder {
class BinderHost;
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_handle|, sends a
// notification.
void ReportBinderDeath(uint32_t proxy_handle);
// Ensures that the next CreateTestInterface() call for a BinderProxy
// identified by |proxy_handle| will return |interface|, allowing tests to set
// their own interfaces for handles that they've created. 0 may be passed to
// set the interface that will be returned if a null proxy is passed.
void SetTestInterface(uint32_t proxy_handle,
std::unique_ptr<IInterface> interface);
// Returns the BinderHost registered in |hosts_| for |cookie|, or null if a
// host wasn't registered.
BinderHost* GetHostForCookie(binder_uintptr_t cookie);
// BinderManagerInterface:
Status Transact(uint32_t handle,
uint32_t code,
const Parcel& data,
Parcel* reply,
bool one_way) override;
bool GetFdForPolling(int* fd) override;
void HandleEvent() override;
binder_uintptr_t GetNextBinderHostCookie() override;
void RegisterBinderHost(BinderHost* host) override;
void UnregisterBinderHost(BinderHost* host) override;
void RegisterBinderProxy(BinderProxy* proxy) override;
void UnregisterBinderProxy(BinderProxy* proxy) override;
std::unique_ptr<IInterface> CreateTestInterface(
const BinderProxy* proxy) override;
private:
std::map<uint64_t, BinderHost*> hosts_;
std::multimap<uint32_t, BinderProxy*> proxies_;
// BinderProxy objects that ReportBinderDeath() is in the process of
// notifying. Stored in a member so that UnregisterBinderProxy() can update it
// if one of the death callbacks happens to destroy a still-scheduled proxy.
std::set<BinderProxy*> proxies_to_notify_about_death_;
// Maps from BinderProxy handles to test interface objects that should be
// released and returned in response to CreateTestInterface() calls.
std::map<uint32_t, std::unique_ptr<IInterface>> test_interfaces_;
// Test interface object that will be released and returned in response to a
// CreateTestInterface() call with a null BinderProxy argument.
std::unique_ptr<IInterface> test_interface_for_null_proxy_;
// Value to be returned for next call to GetNextBinderHostCookie().
binder_uintptr_t next_binder_host_cookie_;
DISALLOW_COPY_AND_ASSIGN(BinderManagerStub);
};
} // namespace protobinder
#endif // LIBPROTOBINDER_BINDER_MANAGER_STUB_H_