• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2024 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 
15 #include "pw_bluetooth/emboss_util.h"
16 
17 #include "pw_bluetooth/hci_test.emb.h"
18 #include "pw_unit_test/framework.h"
19 
20 namespace pw::bluetooth::proxy {
21 namespace {
22 
TEST(EmbossUtilTest,MakeEmbossViewFromSpan)23 TEST(EmbossUtilTest, MakeEmbossViewFromSpan) {
24   std::array<uint8_t, 4> buffer = {0x00, 0x01, 0x02, 0x03};
25   auto span = pw::span(buffer);
26   PW_TEST_ASSERT_OK_AND_ASSIGN(
27       auto view, MakeEmbossView<emboss::TestCommandPacketView>(span));
28   EXPECT_EQ(view.payload().Read(), 0x03);
29 
30   PW_TEST_ASSERT_OK_AND_ASSIGN(
31       view,
32       MakeEmbossView<emboss::TestCommandPacketView>(span.data(), span.size()));
33   EXPECT_EQ(view.payload().Read(), 0x03);
34 
35   auto failed_view =
36       MakeEmbossView<emboss::TestCommandPacketView>(span.subspan(1));
37   EXPECT_EQ(failed_view.status(), pw::Status::DataLoss());
38 }
39 
TEST(EmbossUtilTest,MakeEmbossWriterFromSpan)40 TEST(EmbossUtilTest, MakeEmbossWriterFromSpan) {
41   std::array<uint8_t, 4> buffer = {0x00, 0x01, 0x02, 0x03};
42   auto span = pw::span(buffer);
43   PW_TEST_ASSERT_OK_AND_ASSIGN(
44       auto view, MakeEmbossWriter<emboss::TestCommandPacketWriter>(span));
45   EXPECT_EQ(view.payload().Read(), 0x03);
46 
47   PW_TEST_ASSERT_OK_AND_ASSIGN(
48       view,
49       MakeEmbossWriter<emboss::TestCommandPacketWriter>(span.data(),
50                                                         span.size()));
51   EXPECT_EQ(view.payload().Read(), 0x03);
52 
53   auto failed_view =
54       MakeEmbossWriter<emboss::TestCommandPacketWriter>(span.subspan(1));
55   EXPECT_EQ(failed_view.status(), pw::Status::InvalidArgument());
56 }
57 
TEST(CopyToEmbossTest,CopyArrayToEmboss)58 TEST(CopyToEmbossTest, CopyArrayToEmboss) {
59   std::array<uint8_t, 7> e_array = {0x00, 0x01, 0x02, 0x03};
60   auto e_span = pw::span(e_array);
61   PW_TEST_ASSERT_OK_AND_ASSIGN(
62       emboss::TestCommandPacketWithArrayPayloadWriter e_view,
63       MakeEmbossWriter<emboss::TestCommandPacketWithArrayPayloadWriter>(
64           e_span));
65 
66   std::array<uint8_t, 4> t1_array = {33, 71, 24, 91};
67 
68   UncheckedCopyToEmbossStruct(e_view.payload(), t1_array);
69   EXPECT_TRUE(std::equal(e_view.payload().BackingStorage().begin(),
70                          e_view.payload().BackingStorage().end(),
71                          t1_array.begin(),
72                          t1_array.end()));
73 }
74 
TEST(CopyToEmbossTest,CopySpanToEmboss)75 TEST(CopyToEmbossTest, CopySpanToEmboss) {
76   std::array<uint8_t, 7> e_array = {0x00, 0x01, 0x02, 0x03};
77   PW_TEST_ASSERT_OK_AND_ASSIGN(
78       emboss::TestCommandPacketWithArrayPayloadWriter e_view,
79       MakeEmbossWriter<emboss::TestCommandPacketWithArrayPayloadWriter>(
80           pw::span{e_array}));
81 
82   std::array<uint8_t, 4> t1_array = {33, 71, 24, 91};
83 
84   UncheckedCopyToEmbossStruct(e_view.payload(), pw::span(t1_array));
85   EXPECT_TRUE(std::equal(e_view.payload().BackingStorage().begin(),
86                          e_view.payload().BackingStorage().end(),
87                          t1_array.begin(),
88                          t1_array.end()));
89 }
90 
TEST(CopyToEmbossTest,CopySmallerToEmboss)91 TEST(CopyToEmbossTest, CopySmallerToEmboss) {
92   std::array<uint8_t, 7> e_array = {0x00, 0x01, 0x02, 0x03};
93   PW_TEST_ASSERT_OK_AND_ASSIGN(
94       emboss::TestCommandPacketWithArrayPayloadWriter e_view,
95       MakeEmbossWriter<emboss::TestCommandPacketWithArrayPayloadWriter>(
96           pw::span{e_array}));
97 
98   std::array<uint8_t, 2> t1_array = {33, 71};
99 
100   UncheckedCopyToEmbossStruct(e_view.payload(), t1_array);
101   EXPECT_TRUE(
102       std::equal(e_view.payload().BackingStorage().begin(),
103                  e_view.payload().BackingStorage().begin() + t1_array.size(),
104                  t1_array.begin(),
105                  t1_array.end()));
106 }
107 
TEST(CopyToEmbossTest,CopyEmptyToEmboss)108 TEST(CopyToEmbossTest, CopyEmptyToEmboss) {
109   std::array<uint8_t, 7> e_array = {0x00, 0x01, 0x02, 0x03};
110   PW_TEST_ASSERT_OK_AND_ASSIGN(
111       emboss::TestCommandPacketWithArrayPayloadWriter e_view,
112       MakeEmbossWriter<emboss::TestCommandPacketWithArrayPayloadWriter>(
113           pw::span{e_array}));
114 
115   std::array<uint8_t, 0> t1_array = {};
116 
117   UncheckedCopyToEmbossStruct(e_view.payload(), t1_array);
118   // Emboss view's underlying array is unchanged.
119   EXPECT_TRUE(std::equal(e_view.BackingStorage().begin(),
120                          e_view.BackingStorage().end(),
121                          e_array.begin(),
122                          e_array.end()));
123 }
124 
TEST(CopyToEmbossTest,TryToCopyEmptyToEmboss)125 TEST(CopyToEmbossTest, TryToCopyEmptyToEmboss) {
126   std::array<uint8_t, 7> e_array = {0x00, 0x01, 0x02, 0x03};
127   PW_TEST_ASSERT_OK_AND_ASSIGN(
128       emboss::TestCommandPacketWithArrayPayloadWriter e_view,
129       MakeEmbossWriter<emboss::TestCommandPacketWithArrayPayloadWriter>(
130           pw::span{e_array}));
131 
132   std::array<uint8_t, 0> t1_array = {};
133 
134   EXPECT_TRUE(TryToCopyToEmbossStruct(e_view.payload(), t1_array));
135   // Emboss view's underlying array is unchanged.
136   EXPECT_TRUE(std::equal(e_view.BackingStorage().begin(),
137                          e_view.BackingStorage().end(),
138                          e_array.begin(),
139                          e_array.end()));
140 }
141 
TEST(CopyToEmbossTest,TryToCopyToEmboss)142 TEST(CopyToEmbossTest, TryToCopyToEmboss) {
143   std::array<uint8_t, 7> e_array = {0x00, 0x01, 0x02, 0x03};
144   PW_TEST_ASSERT_OK_AND_ASSIGN(
145       emboss::TestCommandPacketWithArrayPayloadWriter e_view,
146       MakeEmbossWriter<emboss::TestCommandPacketWithArrayPayloadWriter>(
147           pw::span{e_array}));
148 
149   std::array<uint8_t, 4> t1_array = {33, 71, 24, 91};
150 
151   EXPECT_TRUE(TryToCopyToEmbossStruct(e_view.payload(), t1_array));
152   EXPECT_TRUE(std::equal(e_view.payload().BackingStorage().begin(),
153                          e_view.payload().BackingStorage().end(),
154                          t1_array.begin(),
155                          t1_array.end()));
156 }
157 
TEST(CopyToEmbossTest,TryToCopyTooLargeToEmboss)158 TEST(CopyToEmbossTest, TryToCopyTooLargeToEmboss) {
159   std::array<uint8_t, 7> e_array = {0x00, 0x01, 0x02, 0x03};
160   PW_TEST_ASSERT_OK_AND_ASSIGN(
161       emboss::TestCommandPacketWithArrayPayloadWriter e_view,
162       MakeEmbossWriter<emboss::TestCommandPacketWithArrayPayloadWriter>(
163           pw::span{e_array}));
164 
165   std::array<uint8_t, 5> t1_array = {33, 71, 24, 91, 99};
166 
167   EXPECT_FALSE(TryToCopyToEmbossStruct(e_view.payload(), t1_array));
168   // Emboss view's underlying array is unchanged.
169   EXPECT_TRUE(std::equal(e_view.BackingStorage().begin(),
170                          e_view.BackingStorage().end(),
171                          e_array.begin(),
172                          e_array.end()));
173 }
174 
TEST(CopyToEmbossTest,TryToCopyToIncompleteEmboss)175 TEST(CopyToEmbossTest, TryToCopyToIncompleteEmboss) {
176   std::array<uint8_t, 6> e_array = {0x00, 0x01, 0x02, 0x03};
177   emboss::TestCommandPacketWithArrayPayloadWriter e_view{e_array.data(),
178                                                          e_array.size()};
179 
180   std::array<uint8_t, 5> t1_array = {33, 71, 24, 91, 99};
181 
182   EXPECT_FALSE(TryToCopyToEmbossStruct(e_view.payload(), t1_array));
183   // Emboss view's underlying array is unchanged.
184   EXPECT_TRUE(std::equal(e_view.BackingStorage().begin(),
185                          e_view.BackingStorage().end(),
186                          e_array.begin(),
187                          e_array.end()));
188 }
189 
190 }  // namespace
191 }  // namespace pw::bluetooth::proxy
192