xref: /aosp_15_r20/external/libese/libese-cpp/tests/include/esecpp/MockEseInterface.h (revision 5c4dab75aa57366379dce576b1a9e082a44e2b3a)
1*5c4dab75SAndroid Build Coastguard Worker /*
2*5c4dab75SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*5c4dab75SAndroid Build Coastguard Worker  *
4*5c4dab75SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*5c4dab75SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*5c4dab75SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*5c4dab75SAndroid Build Coastguard Worker  *
8*5c4dab75SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*5c4dab75SAndroid Build Coastguard Worker  *
10*5c4dab75SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*5c4dab75SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*5c4dab75SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*5c4dab75SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*5c4dab75SAndroid Build Coastguard Worker  * limitations under the License.
15*5c4dab75SAndroid Build Coastguard Worker  */
16*5c4dab75SAndroid Build Coastguard Worker 
17*5c4dab75SAndroid Build Coastguard Worker #include <gmock/gmock.h>
18*5c4dab75SAndroid Build Coastguard Worker #include <gtest/gtest.h>
19*5c4dab75SAndroid Build Coastguard Worker 
20*5c4dab75SAndroid Build Coastguard Worker #include <esecpp/EseInterface.h>
21*5c4dab75SAndroid Build Coastguard Worker 
22*5c4dab75SAndroid Build Coastguard Worker namespace android {
23*5c4dab75SAndroid Build Coastguard Worker 
24*5c4dab75SAndroid Build Coastguard Worker using ::testing::_;
25*5c4dab75SAndroid Build Coastguard Worker using ::testing::ContainerEq;
26*5c4dab75SAndroid Build Coastguard Worker using ::testing::Invoke;
27*5c4dab75SAndroid Build Coastguard Worker 
28*5c4dab75SAndroid Build Coastguard Worker struct MockEseInterface : public EseInterface {
29*5c4dab75SAndroid Build Coastguard Worker     MOCK_METHOD0(init, void());
30*5c4dab75SAndroid Build Coastguard Worker     MOCK_METHOD0(open, int());
31*5c4dab75SAndroid Build Coastguard Worker     MOCK_METHOD0(close, void());
32*5c4dab75SAndroid Build Coastguard Worker     MOCK_METHOD0(name, const char*());
33*5c4dab75SAndroid Build Coastguard Worker     MOCK_METHOD2(transceive, int(const std::vector<uint8_t>&, std::vector<uint8_t>&));
34*5c4dab75SAndroid Build Coastguard Worker     MOCK_METHOD0(error, bool());
35*5c4dab75SAndroid Build Coastguard Worker     MOCK_METHOD0(error_message, const char*());
36*5c4dab75SAndroid Build Coastguard Worker     MOCK_METHOD0(error_code, int());
37*5c4dab75SAndroid Build Coastguard Worker };
38*5c4dab75SAndroid Build Coastguard Worker 
EseReceive(const std::vector<uint8_t> & response)39*5c4dab75SAndroid Build Coastguard Worker inline auto EseReceive(const std::vector<uint8_t>& response) {
40*5c4dab75SAndroid Build Coastguard Worker     return Invoke([response](const std::vector<uint8_t>& /* tx */, std::vector<uint8_t>& rx) {
41*5c4dab75SAndroid Build Coastguard Worker         const auto end = (rx.size() >= response.size())
42*5c4dab75SAndroid Build Coastguard Worker                 ? response.end() : (response.begin() + rx.size());
43*5c4dab75SAndroid Build Coastguard Worker         std::copy(response.begin(), end, rx.begin());
44*5c4dab75SAndroid Build Coastguard Worker         return (int) response.size();
45*5c4dab75SAndroid Build Coastguard Worker     });
46*5c4dab75SAndroid Build Coastguard Worker }
47*5c4dab75SAndroid Build Coastguard Worker 
48*5c4dab75SAndroid Build Coastguard Worker // Returns a mocked device that expects a command, will pass the response to the
49*5c4dab75SAndroid Build Coastguard Worker // callback and finally returns the given value.
50*5c4dab75SAndroid Build Coastguard Worker // Needs to allocate on heap as it can't copy/move the mock.
singleCommandEseMock(const std::vector<uint8_t> & command,const std::vector<uint8_t> & response)51*5c4dab75SAndroid Build Coastguard Worker inline std::unique_ptr<MockEseInterface> singleCommandEseMock(
52*5c4dab75SAndroid Build Coastguard Worker         const std::vector<uint8_t>& command, const std::vector<uint8_t>& response) {
53*5c4dab75SAndroid Build Coastguard Worker     auto mockEse = std::make_unique<MockEseInterface>();
54*5c4dab75SAndroid Build Coastguard Worker     EXPECT_CALL(*mockEse, transceive(ContainerEq(command), _)).WillOnce(EseReceive(response));
55*5c4dab75SAndroid Build Coastguard Worker     return mockEse;
56*5c4dab75SAndroid Build Coastguard Worker }
57*5c4dab75SAndroid Build Coastguard Worker 
58*5c4dab75SAndroid Build Coastguard Worker } // namespace android
59