Pigweed
 
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
29
41 public:
44 constexpr Transaction(
45 Status expected_return_value,
46 Address device_address,
47 ConstByteSpan write_buffer,
48 ConstByteSpan read_buffer,
49 std::optional<chrono::SystemClock::duration> timeout = std::nullopt)
50 : return_value_(expected_return_value),
51 read_buffer_(read_buffer),
52 write_buffer_(write_buffer),
53 address_(device_address),
54 timeout_(timeout) {}
55
57 constexpr Transaction(
58 Status expected_return_value,
59 Address device_address,
60 std::optional<chrono::SystemClock::duration> timeout = std::nullopt)
61 : Transaction(expected_return_value,
62 device_address,
63 ConstByteSpan(),
64 ignored_buffer_,
65 timeout) {}
66
68 ConstByteSpan read_buffer() const { return read_buffer_; }
69
71 ConstByteSpan write_buffer() const { return write_buffer_; }
72
74 std::optional<chrono::SystemClock::duration> timeout() const {
75 return timeout_;
76 }
77
79 Address address() const { return address_; }
80
82 Status return_value() const { return return_value_; }
83
84 private:
85 const Status return_value_;
86 const ConstByteSpan read_buffer_;
87 const ConstByteSpan write_buffer_;
88 static constexpr std::array<std::byte, 1> ignored_buffer_ = {};
89 const Address address_;
90 const std::optional<chrono::SystemClock::duration> timeout_;
91};
92
95constexpr Transaction ReadTransaction(
96 Status expected_return_value,
97 Address device_address,
98 ConstByteSpan read_buffer,
99 std::optional<chrono::SystemClock::duration> timeout = std::nullopt) {
100 return Transaction(expected_return_value,
101 device_address,
102 ConstByteSpan(),
103 read_buffer,
104 timeout);
105}
106
109constexpr Transaction WriteTransaction(
110 Status expected_return_value,
111 Address device_address,
112 ConstByteSpan write_buffer,
113 std::optional<chrono::SystemClock::duration> timeout = std::nullopt) {
114 return Transaction(expected_return_value,
115 device_address,
116 write_buffer,
117 ConstByteSpan(),
118 timeout);
119}
120
123constexpr Transaction ProbeTransaction(
124 Status expected_return_value,
125 Address device_address,
126 std::optional<chrono::SystemClock::duration> timeout = std::nullopt) {
127 return Transaction(expected_return_value, device_address, timeout);
128}
129
172class MockInitiator : public Initiator {
173 public:
174 explicit constexpr MockInitiator(span<Transaction> transaction_list)
175 : Initiator(Initiator::Feature::kStandard),
176 expected_transactions_(transaction_list),
177 expected_transaction_index_(0) {}
178
191 Status Finalize() const {
192 if (expected_transaction_index_ != expected_transactions_.size()) {
193 return Status::OutOfRange();
194 }
195 return Status();
196 }
197
200 ~MockInitiator() override;
201
202 private:
203 // Implements a mocked backend for the i2c initiator.
204 //
205 // Expects (via Gtest):
206 // tx_buffer == expected_transaction_tx_buffer
207 // tx_buffer.size() == expected_transaction_tx_buffer.size()
208 // rx_buffer.size() == expected_transaction_rx_buffer.size()
209 //
210 // Asserts:
211 // When the number of calls to this method exceed the number of expected
212 // transactions.
213 //
214 // Returns:
215 // Specified transaction return type
216 Status DoWriteReadFor(Address device_address,
217 ConstByteSpan tx_buffer,
218 ByteSpan rx_buffer,
219 chrono::SystemClock::duration timeout) override;
220
221 span<Transaction> expected_transactions_;
222 size_t expected_transaction_index_;
223};
224
225// Makes a new i2c transactions list.
226template <size_t kSize>
227constexpr std::array<Transaction, kSize> MakeExpectedTransactionArray(
228 const Transaction (&transactions)[kSize]) {
229 return containers::to_array(transactions);
230}
231
232} // namespace pw::i2c
Definition: status.h:85
Definition: address.h:39
The common, base driver interface for initiating thread-safe transactions with devices on an I2C bus....
Definition: initiator.h:49
constexpr Initiator()
Definition: initiator.h:68
Definition: initiator_mock.h:172
Status Finalize() const
Definition: initiator_mock.h:191
Definition: initiator_mock.h:40
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:57
Address address() const
Gets the I2C address that the I2C transaction is targeting.
Definition: initiator_mock.h:79
ConstByteSpan write_buffer() const
Gets the buffer that the I2C device should write to.
Definition: initiator_mock.h:71
std::optional< chrono::SystemClock::duration > timeout() const
Gets the minimum duration to wait for a blocking I2C transaction.
Definition: initiator_mock.h:74
ConstByteSpan read_buffer() const
Gets the buffer that is virtually read.
Definition: initiator_mock.h:68
Status return_value() const
Gets the expected return value for the transaction.
Definition: initiator_mock.h:82
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:44
std::chrono::duration< rep, period > duration
Alias for durations representable with this clock.
Definition: system_clock.h:86