1*61c4878aSAndroid Build Coastguard Worker // Copyright 2021 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker #include "pw_i2c/device.h"
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker #include <chrono>
18*61c4878aSAndroid Build Coastguard Worker
19*61c4878aSAndroid Build Coastguard Worker #include "pw_bytes/byte_builder.h"
20*61c4878aSAndroid Build Coastguard Worker #include "pw_containers/algorithm.h"
21*61c4878aSAndroid Build Coastguard Worker #include "pw_i2c/initiator_mock.h"
22*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Worker using namespace std::literals::chrono_literals;
25*61c4878aSAndroid Build Coastguard Worker
26*61c4878aSAndroid Build Coastguard Worker namespace pw::i2c {
27*61c4878aSAndroid Build Coastguard Worker namespace {
28*61c4878aSAndroid Build Coastguard Worker
29*61c4878aSAndroid Build Coastguard Worker constexpr auto kI2cTransactionTimeout = chrono::SystemClock::for_at_least(2ms);
30*61c4878aSAndroid Build Coastguard Worker
TEST(Device,WriteReadForOk)31*61c4878aSAndroid Build Coastguard Worker TEST(Device, WriteReadForOk) {
32*61c4878aSAndroid Build Coastguard Worker constexpr Address kTestDeviceAddress = Address::SevenBit<0x3F>();
33*61c4878aSAndroid Build Coastguard Worker
34*61c4878aSAndroid Build Coastguard Worker constexpr auto kExpectWrite1 = bytes::Array<1, 2, 3>();
35*61c4878aSAndroid Build Coastguard Worker constexpr auto kExpectRead1 = bytes::Array<1, 2>();
36*61c4878aSAndroid Build Coastguard Worker
37*61c4878aSAndroid Build Coastguard Worker auto expected_transactions =
38*61c4878aSAndroid Build Coastguard Worker MakeExpectedTransactionArray({Transaction(OkStatus(),
39*61c4878aSAndroid Build Coastguard Worker kTestDeviceAddress,
40*61c4878aSAndroid Build Coastguard Worker kExpectWrite1,
41*61c4878aSAndroid Build Coastguard Worker kExpectRead1,
42*61c4878aSAndroid Build Coastguard Worker kI2cTransactionTimeout)});
43*61c4878aSAndroid Build Coastguard Worker
44*61c4878aSAndroid Build Coastguard Worker MockInitiator initiator(expected_transactions);
45*61c4878aSAndroid Build Coastguard Worker
46*61c4878aSAndroid Build Coastguard Worker Device device = Device(initiator, kTestDeviceAddress);
47*61c4878aSAndroid Build Coastguard Worker
48*61c4878aSAndroid Build Coastguard Worker std::array<std::byte, kExpectRead1.size()> read1;
49*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(device.WriteReadFor(kExpectWrite1, read1, kI2cTransactionTimeout),
50*61c4878aSAndroid Build Coastguard Worker OkStatus());
51*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(read1, kExpectRead1));
52*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(initiator.Finalize(), OkStatus());
53*61c4878aSAndroid Build Coastguard Worker }
54*61c4878aSAndroid Build Coastguard Worker
TEST(Device,WriteForOk)55*61c4878aSAndroid Build Coastguard Worker TEST(Device, WriteForOk) {
56*61c4878aSAndroid Build Coastguard Worker constexpr Address kTestDeviceAddress = Address::SevenBit<0x3F>();
57*61c4878aSAndroid Build Coastguard Worker
58*61c4878aSAndroid Build Coastguard Worker constexpr auto kExpectWrite1 = bytes::Array<1, 2, 3>();
59*61c4878aSAndroid Build Coastguard Worker
60*61c4878aSAndroid Build Coastguard Worker auto expected_transactions = MakeExpectedTransactionArray({WriteTransaction(
61*61c4878aSAndroid Build Coastguard Worker OkStatus(), kTestDeviceAddress, kExpectWrite1, kI2cTransactionTimeout)});
62*61c4878aSAndroid Build Coastguard Worker
63*61c4878aSAndroid Build Coastguard Worker MockInitiator initiator(expected_transactions);
64*61c4878aSAndroid Build Coastguard Worker Device device = Device(initiator, kTestDeviceAddress);
65*61c4878aSAndroid Build Coastguard Worker
66*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(device.WriteFor(kExpectWrite1, kI2cTransactionTimeout), OkStatus());
67*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(initiator.Finalize(), OkStatus());
68*61c4878aSAndroid Build Coastguard Worker }
69*61c4878aSAndroid Build Coastguard Worker
TEST(Device,ReadForOk)70*61c4878aSAndroid Build Coastguard Worker TEST(Device, ReadForOk) {
71*61c4878aSAndroid Build Coastguard Worker constexpr Address kTestDeviceAddress = Address::SevenBit<0x3F>();
72*61c4878aSAndroid Build Coastguard Worker
73*61c4878aSAndroid Build Coastguard Worker constexpr auto kExpectRead1 = bytes::Array<1, 2, 3>();
74*61c4878aSAndroid Build Coastguard Worker
75*61c4878aSAndroid Build Coastguard Worker auto expected_transactions = MakeExpectedTransactionArray({ReadTransaction(
76*61c4878aSAndroid Build Coastguard Worker OkStatus(), kTestDeviceAddress, kExpectRead1, kI2cTransactionTimeout)});
77*61c4878aSAndroid Build Coastguard Worker
78*61c4878aSAndroid Build Coastguard Worker MockInitiator initiator(expected_transactions);
79*61c4878aSAndroid Build Coastguard Worker Device device = Device(initiator, kTestDeviceAddress);
80*61c4878aSAndroid Build Coastguard Worker
81*61c4878aSAndroid Build Coastguard Worker std::array<std::byte, kExpectRead1.size()> read1;
82*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(device.ReadFor(read1, kI2cTransactionTimeout), OkStatus());
83*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(initiator.Finalize(), OkStatus());
84*61c4878aSAndroid Build Coastguard Worker }
85*61c4878aSAndroid Build Coastguard Worker
TEST(Device,ProbeDeviceForOk)86*61c4878aSAndroid Build Coastguard Worker TEST(Device, ProbeDeviceForOk) {
87*61c4878aSAndroid Build Coastguard Worker constexpr Address kTestDeviceAddress = Address::SevenBit<0x3F>();
88*61c4878aSAndroid Build Coastguard Worker
89*61c4878aSAndroid Build Coastguard Worker auto expected_transactions = MakeExpectedTransactionArray({ProbeTransaction(
90*61c4878aSAndroid Build Coastguard Worker OkStatus(), kTestDeviceAddress, kI2cTransactionTimeout)});
91*61c4878aSAndroid Build Coastguard Worker
92*61c4878aSAndroid Build Coastguard Worker MockInitiator initiator(expected_transactions);
93*61c4878aSAndroid Build Coastguard Worker Device device = Device(initiator, kTestDeviceAddress);
94*61c4878aSAndroid Build Coastguard Worker
95*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
96*61c4878aSAndroid Build Coastguard Worker initiator.ProbeDeviceFor(kTestDeviceAddress, kI2cTransactionTimeout),
97*61c4878aSAndroid Build Coastguard Worker OkStatus());
98*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(initiator.Finalize(), OkStatus());
99*61c4878aSAndroid Build Coastguard Worker }
100*61c4878aSAndroid Build Coastguard Worker
101*61c4878aSAndroid Build Coastguard Worker } // namespace
102*61c4878aSAndroid Build Coastguard Worker } // namespace pw::i2c
103