C/C++ API Reference
Loading...
Searching...
No Matches
initiator_mock.h
1// Copyright 2020 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14#pragma once
15
16#include <array>
17#include <cstddef>
18#include <optional>
19
20#include "pw_bytes/span.h"
21#include "pw_containers/to_array.h"
22#include "pw_i2c/initiator.h"
23
24namespace pw::i2c {
25
27
31
43 public:
46 constexpr Transaction(
47 Status expected_return_value,
48 Address device_address,
51 std::optional<chrono::SystemClock::duration> timeout = std::nullopt)
52 : return_value_(expected_return_value),
53 read_buffer_(read_buffer),
54 write_buffer_(write_buffer),
55 address_(device_address),
56 timeout_(timeout) {}
57
59 constexpr Transaction(
60 Status expected_return_value,
61 Address device_address,
62 std::optional<chrono::SystemClock::duration> timeout = std::nullopt)
63 : Transaction(expected_return_value,
64 device_address,
66 ignored_buffer_,
67 timeout) {}
68
70 ConstByteSpan read_buffer() const { return read_buffer_; }
71
73 ConstByteSpan write_buffer() const { return write_buffer_; }
74
76 std::optional<chrono::SystemClock::duration> timeout() const {
77 return timeout_;
78 }
79
81 Address address() const { return address_; }
82
84 Status return_value() const { return return_value_; }
85
86 private:
87 const Status return_value_;
88 const ConstByteSpan read_buffer_;
89 const ConstByteSpan write_buffer_;
90 static constexpr std::array<std::byte, 1> ignored_buffer_ = {};
91 const Address address_;
92 const std::optional<chrono::SystemClock::duration> timeout_;
93};
94
98 Status expected_return_value,
99 Address device_address,
100 ConstByteSpan read_buffer,
101 std::optional<chrono::SystemClock::duration> timeout = std::nullopt) {
102 return Transaction(expected_return_value,
103 device_address,
105 read_buffer,
106 timeout);
107}
108
112 Status expected_return_value,
113 Address device_address,
114 ConstByteSpan write_buffer,
115 std::optional<chrono::SystemClock::duration> timeout = std::nullopt) {
116 return Transaction(expected_return_value,
117 device_address,
118 write_buffer,
120 timeout);
121}
122
126 Status expected_return_value,
127 Address device_address,
128 std::optional<chrono::SystemClock::duration> timeout = std::nullopt) {
129 return Transaction(expected_return_value, device_address, timeout);
130}
131
174class MockInitiator : public Initiator {
175 public:
176 explicit constexpr MockInitiator(span<Transaction> transaction_list)
177 : Initiator(Initiator::Feature::kStandard),
178 expected_transactions_(transaction_list),
179 expected_transaction_index_(0) {}
180
193 Status Finalize() const {
194 if (expected_transaction_index_ != expected_transactions_.size()) {
195 return Status::OutOfRange();
196 }
197 return Status();
198 }
199
202 ~MockInitiator() override;
203
204 private:
205 // Implements a mocked backend for the i2c initiator.
206 //
207 // Expects (via Gtest):
208 // tx_buffer == expected_transaction_tx_buffer
209 // tx_buffer.size() == expected_transaction_tx_buffer.size()
210 // rx_buffer.size() == expected_transaction_rx_buffer.size()
211 //
212 // Asserts:
213 // When the number of calls to this method exceed the number of expected
214 // transactions.
215 //
216 // Returns:
217 // Specified transaction return type
218 Status DoWriteReadFor(Address device_address,
219 ConstByteSpan tx_buffer,
220 ByteSpan rx_buffer,
221 chrono::SystemClock::duration timeout) override;
222
223 span<Transaction> expected_transactions_;
224 size_t expected_transaction_index_;
225};
226
227// Makes a new i2c transactions list.
228template <size_t kSize>
229constexpr std::array<Transaction, kSize> MakeExpectedTransactionArray(
230 const Transaction (&transactions)[kSize]) {
231 return containers::to_array(transactions);
232}
233
234} // namespace pw::i2c
Definition: status.h:86
Definition: address.h:42
The common, base driver interface for initiating thread-safe transactions with devices on an I2C bus....
Definition: initiator.h:52
Definition: initiator_mock.h:174
Definition: initiator_mock.h:42
std::chrono::duration< rep, period > duration
Alias for durations representable with this clock.
Definition: system_clock.h:90
constexpr std::array< std::remove_cv_t< T >, kSize > to_array(T(&values)[kSize])
Definition: to_array.h:55
constexpr Transaction(Status expected_return_value, Address device_address, std::optional< chrono::SystemClock::duration > timeout=std::nullopt)
Alternative constructor for creating probe transactions.
Definition: initiator_mock.h:59
constexpr Transaction WriteTransaction(Status expected_return_value, Address device_address, ConstByteSpan write_buffer, std::optional< chrono::SystemClock::duration > timeout=std::nullopt)
Definition: initiator_mock.h:111
constexpr Initiator()
Definition: initiator.h:71
constexpr Transaction ProbeTransaction(Status expected_return_value, Address device_address, std::optional< chrono::SystemClock::duration > timeout=std::nullopt)
Definition: initiator_mock.h:125
Address address() const
Gets the I2C address that the I2C transaction is targeting.
Definition: initiator_mock.h:81
ConstByteSpan write_buffer() const
Gets the buffer that the I2C device should write to.
Definition: initiator_mock.h:73
std::optional< chrono::SystemClock::duration > timeout() const
Gets the minimum duration to wait for a blocking I2C transaction.
Definition: initiator_mock.h:76
ConstByteSpan read_buffer() const
Gets the buffer that is virtually read.
Definition: initiator_mock.h:70
Status return_value() const
Gets the expected return value for the transaction.
Definition: initiator_mock.h:84
constexpr Transaction(Status expected_return_value, Address device_address, ConstByteSpan write_buffer, ConstByteSpan read_buffer, std::optional< chrono::SystemClock::duration > timeout=std::nullopt)
Definition: initiator_mock.h:46
Status Finalize() const
Definition: initiator_mock.h:193
constexpr Transaction ReadTransaction(Status expected_return_value, Address device_address, ConstByteSpan read_buffer, std::optional< chrono::SystemClock::duration > timeout=std::nullopt)
Definition: initiator_mock.h:97
Cross-platform I2C library.
Definition: address.h:19