blob: e78daf5c29928cc4f929317fa3e646907dd7fd88 [file] [log] [blame]
// Copyright 2021 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 LIBHWSEC_FOUNDATION_ERROR_TESTING_HELPER_H_
#define LIBHWSEC_FOUNDATION_ERROR_TESTING_HELPER_H_
#include <type_traits>
#include <utility>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "libhwsec-foundation/status/status_chain.h"
namespace hwsec_foundation {
namespace error {
namespace testing {
using ::hwsec_foundation::status::MakeStatus;
using ::hwsec_foundation::status::OkStatus;
MATCHER(IsOk, "") {
return arg.ok();
}
MATCHER(NotOk, "") {
return !arg.ok();
}
// TODO(dlunev): figure out how to add error type matchers.
/* A helper function to return generic error object in unittest.
*
* Example Usage:
*
* using ::hwsec_foundation::error::testing::ReturnError;
*
* ON_CALL(tpm, EncryptBlob(_, _, aes_skey, _))
* .WillByDefault(ReturnError<TPMErrorBase>()); // Always success.
*
* ON_CALL(tpm, EncryptBlob(_, _, _, _))
* .WillByDefault(
* ReturnError<TPMError>("fake", TPMRetryAction::kFatal));
*/
template <typename T>
using remove_cvref_t =
typename std::remove_cv<typename std::remove_reference<T>::type>::type;
ACTION_P(ReturnErrorType, error_ptr) {
return OkStatus<remove_cvref_t<decltype(*error_ptr)>>();
}
ACTION_P2(ReturnErrorType, error_ptr, p1) {
return MakeStatus<remove_cvref_t<decltype(*error_ptr)>>(p1);
}
ACTION_P3(ReturnErrorType, error_ptr, p1, p2) {
return MakeStatus<remove_cvref_t<decltype(*error_ptr)>>(p1, p2);
}
ACTION_P4(ReturnErrorType, error_ptr, p1, p2, p3) {
return MakeStatus<remove_cvref_t<decltype(*error_ptr)>>(p1, p2, p3);
}
ACTION_P5(ReturnErrorType, error_ptr, p1, p2, p3, p4) {
return MakeStatus<remove_cvref_t<decltype(*error_ptr)>>(p1, p2, p3, p4);
}
ACTION_P6(ReturnErrorType, error_ptr, p1, p2, p3, p4, p5) {
return MakeStatus<remove_cvref_t<decltype(*error_ptr)>>(p1, p2, p3, p4, p5);
}
ACTION_P7(ReturnErrorType, error_ptr, p1, p2, p3, p4, p5, p6) {
return MakeStatus<remove_cvref_t<decltype(*error_ptr)>>(p1, p2, p3, p4, p5,
p6);
}
ACTION_P8(ReturnErrorType, error_ptr, p1, p2, p3, p4, p5, p6, p7) {
return MakeStatus<remove_cvref_t<decltype(*error_ptr)>>(p1, p2, p3, p4, p5,
p6, p7);
}
ACTION_P9(ReturnErrorType, error_ptr, p1, p2, p3, p4, p5, p6, p7, p8) {
return MakeStatus<remove_cvref_t<decltype(*error_ptr)>>(p1, p2, p3, p4, p5,
p6, p7, p8);
}
template <typename ErrType, typename... Args>
auto ReturnError(Args&&... args) {
return ReturnErrorType(static_cast<ErrType*>(nullptr),
std::forward<Args>(args)...);
}
template <typename ErrType>
auto ReturnOk() {
return ReturnErrorType(static_cast<ErrType*>(nullptr));
}
ACTION_P(ReturnValue, p1) {
return p1;
}
} // namespace testing
} // namespace error
} // namespace hwsec_foundation
#endif // LIBHWSEC_FOUNDATION_ERROR_TESTING_HELPER_H_