blob: 83dfacaedf0cb994458e07f55c18411debdbba70 [file] [log] [blame]
// 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 DEVICE_FIDO_MOCK_FIDO_DEVICE_H_
#define DEVICE_FIDO_MOCK_FIDO_DEVICE_H_
#include <stdint.h>
#include <memory>
#include <string>
#include <vector>
#include "base/component_export.h"
#include "base/containers/span.h"
#include "base/macros.h"
#include "base/optional.h"
#include "base/time/time.h"
#include "device/fido/fido_constants.h"
#include "device/fido/fido_device.h"
#include "device/fido/fido_transport_protocol.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace device {
class MockFidoDevice : public ::testing::StrictMock<FidoDevice> {
public:
// MakeU2f returns a fully initialized U2F device. This represents the state
// after |DiscoverSupportedProtocolAndDeviceInfo| has been called by the
// FidoDeviceDiscovery.
static std::unique_ptr<MockFidoDevice> MakeU2f();
// MakeCtap returns a fully initialized CTAP device. This represents the
// state after |DiscoverSupportedProtocolAndDeviceInfo| has been called by
// the FidoDeviceDiscovery.
static std::unique_ptr<MockFidoDevice> MakeCtap(
base::Optional<AuthenticatorGetInfoResponse> device_info = base::nullopt);
// MakeU2fWithDeviceInfoExpectation returns a uninitialized U2F device
// suitable for injecting into a FidoDeviceDiscovery, which will determine its
// protocol version by invoking |DiscoverSupportedProtocolAndDeviceInfo|.
static std::unique_ptr<MockFidoDevice> MakeU2fWithGetInfoExpectation();
// MakeCtapWithDeviceInfoExpectation returns a uninitialized CTAP device
// suitable for injecting into a FidoDeviceDiscovery, which will determine its
// protocol version by invoking |DiscoverSupportedProtocolAndDeviceInfo|. If a
// response is supplied, the mock will use that to reply; otherwise it will
// use |test_data::kTestAuthenticatorGetInfoResponse|.
static std::unique_ptr<MockFidoDevice> MakeCtapWithGetInfoExpectation(
base::Optional<base::span<const uint8_t>> get_info_response =
base::nullopt);
MockFidoDevice();
MockFidoDevice(ProtocolVersion protocol_version,
base::Optional<AuthenticatorGetInfoResponse> device_info);
~MockFidoDevice() override;
// TODO(crbug.com/729950): Remove these workarounds once support for move-only
// types is added to GMock.
MOCK_METHOD1(TryWinkRef, void(WinkCallback& cb));
void TryWink(WinkCallback cb) override;
MOCK_METHOD0(Cancel, void(void));
MOCK_CONST_METHOD0(GetId, std::string(void));
// GMock cannot mock a method taking a move-only type.
// TODO(crbug.com/729950): Remove these workarounds once support for move-only
// types is added to GMock.
MOCK_METHOD2(DeviceTransactPtr,
void(const std::vector<uint8_t>& command, DeviceCallback& cb));
void DeviceTransact(std::vector<uint8_t> command, DeviceCallback cb) override;
// FidoDevice:
FidoTransportProtocol DeviceTransport() const override;
base::WeakPtr<FidoDevice> GetWeakPtr() override;
void ExpectWinkedAtLeastOnce();
void ExpectCtap2CommandAndRespondWith(
CtapRequestCommand command,
base::Optional<base::span<const uint8_t>> response,
base::TimeDelta delay = base::TimeDelta());
void ExpectCtap2CommandAndRespondWithError(
CtapRequestCommand command,
CtapDeviceResponseCode response_code,
base::TimeDelta delay = base::TimeDelta());
void ExpectRequestAndRespondWith(
base::span<const uint8_t> request,
base::Optional<base::span<const uint8_t>> response,
base::TimeDelta delay = base::TimeDelta());
void ExpectCtap2CommandAndDoNotRespond(CtapRequestCommand command);
void ExpectRequestAndDoNotRespond(base::span<const uint8_t> request);
void StubGetId();
void SetDeviceTransport(FidoTransportProtocol transport_protocol);
private:
FidoTransportProtocol transport_protocol_ =
FidoTransportProtocol::kUsbHumanInterfaceDevice;
base::WeakPtrFactory<FidoDevice> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(MockFidoDevice);
};
} // namespace device
#endif // DEVICE_FIDO_MOCK_FIDO_DEVICE_H_