// Copyright 2017 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 HAMMERD_MOCK_USB_UTILS_H_
#define HAMMERD_MOCK_USB_UTILS_H_

#include <string>
#include <vector>

#include <gmock/gmock.h>

#include "hammerd/usb_utils.h"

namespace hammerd {

ACTION_P(WriteBuf, ptr) {
  memcpy(arg0, ptr, arg1);
  return arg1;
}

class MockUsbEndpoint : public UsbEndpointInterface {
 public:
  MockUsbEndpoint() = default;
  ~MockUsbEndpoint() override = default;
  MOCK_METHOD(bool, UsbSysfsExists, (), (override));
  MOCK_METHOD(UsbConnectStatus, Connect, (), (override));
  MOCK_METHOD(void, Close, (), (override));
  MOCK_METHOD(bool, IsConnected, (), (const, override));
  MOCK_METHOD(int, GetChunkLength, (), (const, override));
  MOCK_METHOD(std::string, GetConfigurationString, (), (const, override));

  // Use implementation identical to UsbEndpoint::Transfer, and test calls
  // to Send and Receive instead.
  int Transfer(const void* outbuf, int outlen, void* inbuf, int inlen,
               bool allow_less, unsigned int timeout_ms) override {
    constexpr int kError = -1;
    if (Send(outbuf, outlen, allow_less, timeout_ms) != outlen) {
      return kError;
    }
    if (inlen == 0) {
      return 0;
    }
    return Receive(inbuf, inlen, allow_less, timeout_ms);
  }
  int Send(const void* outbuf, int outlen, bool allow_less,
           unsigned int timeout_ms) override {
    // We only care about the value of the output buffer.
    auto out_ptr = reinterpret_cast<const uint8_t*>(outbuf);
    std::vector<uint8_t> out(out_ptr, out_ptr + outlen);
    return SendHelper(out, outbuf, outlen);
  }

  MOCK_METHOD(int, SendHelper, (std::vector<uint8_t>, const void*, int));

  MOCK_METHOD(int, Receive, (void*, int, bool, unsigned int), (override));
};

}  // namespace hammerd
#endif  // HAMMERD_MOCK_USB_UTILS_H_
