// 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_DRIVER_STUB_H_
#define LIBPROTOBINDER_BINDER_DRIVER_STUB_H_

#include <base/macros.h>
#include <sys/types.h>
// Out of order due to this bad header requiring sys/types.h
#include <linux/android/binder.h>

#include <map>
#include <memory>

#include "binder_driver.h"  // NOLINT(build/include)
#include "binder_export.h"  // NOLINT(build/include)
#include "parcel.h"         // NOLINT(build/include)

namespace protobinder {

// Stub class that emulates the binder driver. This is used
// when unit testing libprotobinder.
class BINDER_EXPORT BinderDriverStub : public BinderDriverInterface {
 public:
  enum EndPoints {
    // Provide a valid reply.
    GOOD_ENDPOINT = 1,
    // Provides a dead end point.
    BAD_ENDPOINT = 2
  };
  BinderDriverStub();
  ~BinderDriverStub() override;

  int GetFdForPolling() override;
  int ReadWrite(binder_write_read* buffers) override;
  void SetMaxThreads(int max_threads) override;

  // The following methods are used by unit tests.

  // Provides access to the raw transaction data from
  // the last Transaction on the driver.
  struct binder_transaction_data* LastTransactionData();
  int GetRefCount(uint32_t handle);
  bool IsDeathRegistered(uintptr_t cookie, uint32_t handle);
  void InjectDeathNotification(uintptr_t cookie);
  void InjectTransaction(uintptr_t cookie,
                         uint32_t code,
                         const Parcel& data,
                         bool one_way);

  static const int kReplyVal;
  static const char kReplyString[];

 private:
  void ProcessTransaction(struct binder_transaction_data* tr);

  struct binder_transaction_data last_transaction_data_;
  Parcel return_cmds_;
  std::map<void*, std::unique_ptr<Parcel>> user_buffers_;
  std::map<uint32_t, int> handle_refs_;
  std::map<uintptr_t, uint32_t> death_notifications_;
  int max_threads_;

  DISALLOW_COPY_AND_ASSIGN(BinderDriverStub);
};

}  // namespace protobinder

#endif  // LIBPROTOBINDER_BINDER_DRIVER_STUB_H_
