xref: /aosp_15_r20/external/pigweed/pw_i2c/device_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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