xref: /aosp_15_r20/system/chre/platform/tests/trace_test.cc (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
3*84e33947SAndroid Build Coastguard Worker  *
4*84e33947SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*84e33947SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*84e33947SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*84e33947SAndroid Build Coastguard Worker  *
8*84e33947SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*84e33947SAndroid Build Coastguard Worker  *
10*84e33947SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*84e33947SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*84e33947SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*84e33947SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*84e33947SAndroid Build Coastguard Worker  * limitations under the License.
15*84e33947SAndroid Build Coastguard Worker  */
16*84e33947SAndroid Build Coastguard Worker 
17*84e33947SAndroid Build Coastguard Worker // Ensuring this macro is not defined since we include the tracing macros and
18*84e33947SAndroid Build Coastguard Worker // tracing utilities separately and do not want to test or include the pw_trace
19*84e33947SAndroid Build Coastguard Worker // functions.
20*84e33947SAndroid Build Coastguard Worker #ifdef CHRE_TRACING_ENABLED
21*84e33947SAndroid Build Coastguard Worker #undef CHRE_TRACING_ENABLED
22*84e33947SAndroid Build Coastguard Worker #endif  // CHRE_TRACING_ENABLED
23*84e33947SAndroid Build Coastguard Worker 
24*84e33947SAndroid Build Coastguard Worker #include <stdlib.h>
25*84e33947SAndroid Build Coastguard Worker #include <cstdlib>
26*84e33947SAndroid Build Coastguard Worker #include <cstring>
27*84e33947SAndroid Build Coastguard Worker #include <string>
28*84e33947SAndroid Build Coastguard Worker 
29*84e33947SAndroid Build Coastguard Worker #include "chre/platform/tracing.h"
30*84e33947SAndroid Build Coastguard Worker #include "chre/target_platform/tracing_util.h"
31*84e33947SAndroid Build Coastguard Worker #include "gmock/gmock.h"
32*84e33947SAndroid Build Coastguard Worker #include "gtest/gtest.h"
33*84e33947SAndroid Build Coastguard Worker 
34*84e33947SAndroid Build Coastguard Worker namespace tracing_internal {
35*84e33947SAndroid Build Coastguard Worker namespace {
36*84e33947SAndroid Build Coastguard Worker 
37*84e33947SAndroid Build Coastguard Worker using ::testing::ElementsAre;
38*84e33947SAndroid Build Coastguard Worker using ::testing::ElementsAreArray;
39*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedPtr)40*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedPtr) {
41*84e33947SAndroid Build Coastguard Worker   const uint8_t var = 0x12;
42*84e33947SAndroid Build Coastguard Worker   const uint8_t *data = &var;
43*84e33947SAndroid Build Coastguard Worker 
44*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
45*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(data)>();
46*84e33947SAndroid Build Coastguard Worker 
47*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, __SIZEOF_POINTER__);
48*84e33947SAndroid Build Coastguard Worker 
49*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
50*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer, data);
51*84e33947SAndroid Build Coastguard Worker 
52*84e33947SAndroid Build Coastguard Worker // Already verified in chre/platform/tracing.h this value is either 8 or 4.
53*84e33947SAndroid Build Coastguard Worker #if __SIZEOF_POINTER__ == 8
54*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(*((uint64_t *)chreTraceDataBuffer), (uint64_t)data);
55*84e33947SAndroid Build Coastguard Worker #elif __SIZEOF_POINTER__ == 4
56*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(*((uint32_t *)chreTraceDataBuffer), (uint32_t)data);
57*84e33947SAndroid Build Coastguard Worker #else
58*84e33947SAndroid Build Coastguard Worker #error "Pointer size is of unsupported size"
59*84e33947SAndroid Build Coastguard Worker #endif
60*84e33947SAndroid Build Coastguard Worker }
61*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedBool)62*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedBool) {
63*84e33947SAndroid Build Coastguard Worker   const bool data = true;
64*84e33947SAndroid Build Coastguard Worker 
65*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
66*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(data)>();
67*84e33947SAndroid Build Coastguard Worker 
68*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, sizeof(bool));
69*84e33947SAndroid Build Coastguard Worker 
70*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
71*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer, data);
72*84e33947SAndroid Build Coastguard Worker 
73*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer, ElementsAre(1));
74*84e33947SAndroid Build Coastguard Worker }
75*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedUInt8)76*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedUInt8) {
77*84e33947SAndroid Build Coastguard Worker   const uint8_t data = 0x12;
78*84e33947SAndroid Build Coastguard Worker 
79*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
80*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(data)>();
81*84e33947SAndroid Build Coastguard Worker 
82*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, sizeof(uint8_t));
83*84e33947SAndroid Build Coastguard Worker 
84*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
85*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer, data);
86*84e33947SAndroid Build Coastguard Worker 
87*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer, ElementsAre(0x12));
88*84e33947SAndroid Build Coastguard Worker }
89*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedUInt16)90*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedUInt16) {
91*84e33947SAndroid Build Coastguard Worker   uint16_t data = 0x1234;
92*84e33947SAndroid Build Coastguard Worker 
93*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
94*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(data)>();
95*84e33947SAndroid Build Coastguard Worker 
96*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, sizeof(uint16_t));
97*84e33947SAndroid Build Coastguard Worker 
98*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
99*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer, data);
100*84e33947SAndroid Build Coastguard Worker 
101*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer, ElementsAre(0x34, 0x12));
102*84e33947SAndroid Build Coastguard Worker }
103*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedUInt32)104*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedUInt32) {
105*84e33947SAndroid Build Coastguard Worker   const uint32_t data = 0x12345678;
106*84e33947SAndroid Build Coastguard Worker 
107*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
108*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(data)>();
109*84e33947SAndroid Build Coastguard Worker 
110*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, sizeof(uint32_t));
111*84e33947SAndroid Build Coastguard Worker 
112*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
113*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer, data);
114*84e33947SAndroid Build Coastguard Worker 
115*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer, ElementsAre(0x78, 0x56, 0x34, 0x12));
116*84e33947SAndroid Build Coastguard Worker }
117*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedUInt64)118*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedUInt64) {
119*84e33947SAndroid Build Coastguard Worker   const uint64_t data = 0x1234567890123456;
120*84e33947SAndroid Build Coastguard Worker 
121*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
122*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(data)>();
123*84e33947SAndroid Build Coastguard Worker 
124*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, sizeof(uint64_t));
125*84e33947SAndroid Build Coastguard Worker 
126*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
127*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer, data);
128*84e33947SAndroid Build Coastguard Worker 
129*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer,
130*84e33947SAndroid Build Coastguard Worker               ElementsAre(0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12));
131*84e33947SAndroid Build Coastguard Worker }
132*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedInt8)133*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedInt8) {
134*84e33947SAndroid Build Coastguard Worker   const int8_t data = 0x12;
135*84e33947SAndroid Build Coastguard Worker 
136*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
137*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(data)>();
138*84e33947SAndroid Build Coastguard Worker 
139*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, sizeof(int8_t));
140*84e33947SAndroid Build Coastguard Worker 
141*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
142*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer, data);
143*84e33947SAndroid Build Coastguard Worker 
144*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer, ElementsAre(0x12));
145*84e33947SAndroid Build Coastguard Worker }
146*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedInt16)147*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedInt16) {
148*84e33947SAndroid Build Coastguard Worker   const int16_t data = 0x1234;
149*84e33947SAndroid Build Coastguard Worker 
150*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
151*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(data)>();
152*84e33947SAndroid Build Coastguard Worker 
153*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, sizeof(int16_t));
154*84e33947SAndroid Build Coastguard Worker 
155*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
156*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer, data);
157*84e33947SAndroid Build Coastguard Worker 
158*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer, ElementsAre(0x34, 0x12));
159*84e33947SAndroid Build Coastguard Worker }
160*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedInt32)161*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedInt32) {
162*84e33947SAndroid Build Coastguard Worker   const int32_t data = 0x12345678;
163*84e33947SAndroid Build Coastguard Worker 
164*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
165*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(data)>();
166*84e33947SAndroid Build Coastguard Worker 
167*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, sizeof(int32_t));
168*84e33947SAndroid Build Coastguard Worker 
169*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
170*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer, data);
171*84e33947SAndroid Build Coastguard Worker 
172*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer, ElementsAre(0x78, 0x56, 0x34, 0x12));
173*84e33947SAndroid Build Coastguard Worker }
174*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedInt64)175*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedInt64) {
176*84e33947SAndroid Build Coastguard Worker   const int64_t data = 0x1234567890123456;
177*84e33947SAndroid Build Coastguard Worker 
178*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
179*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(data)>();
180*84e33947SAndroid Build Coastguard Worker 
181*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, sizeof(int64_t));
182*84e33947SAndroid Build Coastguard Worker 
183*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
184*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer, data);
185*84e33947SAndroid Build Coastguard Worker 
186*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer,
187*84e33947SAndroid Build Coastguard Worker               ElementsAre(0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12));
188*84e33947SAndroid Build Coastguard Worker }
189*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedChar)190*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedChar) {
191*84e33947SAndroid Build Coastguard Worker   char data = 'a';
192*84e33947SAndroid Build Coastguard Worker 
193*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
194*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(data)>();
195*84e33947SAndroid Build Coastguard Worker 
196*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, sizeof(char));
197*84e33947SAndroid Build Coastguard Worker 
198*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
199*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer, data);
200*84e33947SAndroid Build Coastguard Worker 
201*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer, ElementsAre('a'));
202*84e33947SAndroid Build Coastguard Worker }
203*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedStrDoesNotOverflow)204*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedStrDoesNotOverflow) {
205*84e33947SAndroid Build Coastguard Worker   const char data[] = "test";
206*84e33947SAndroid Build Coastguard Worker   const size_t kBufferPadding = 5;
207*84e33947SAndroid Build Coastguard Worker 
208*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
209*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(data)>();
210*84e33947SAndroid Build Coastguard Worker 
211*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize + kBufferPadding];
212*84e33947SAndroid Build Coastguard Worker   memset(chreTraceDataBuffer, 0xFF, chreTraceDataSize + kBufferPadding);
213*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer, data);
214*84e33947SAndroid Build Coastguard Worker 
215*84e33947SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < kBufferPadding; i++) {
216*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(chreTraceDataBuffer[chreTraceDataSize + i], 0xFF);
217*84e33947SAndroid Build Coastguard Worker   }
218*84e33947SAndroid Build Coastguard Worker }
219*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedShortStrAndNullBytePadding)220*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedShortStrAndNullBytePadding) {
221*84e33947SAndroid Build Coastguard Worker   // expected variable + length
222*84e33947SAndroid Build Coastguard Worker   const char data[] = "test";
223*84e33947SAndroid Build Coastguard Worker   uint8_t dataLen = static_cast<uint8_t>(strlen(data));
224*84e33947SAndroid Build Coastguard Worker 
225*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
226*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(data)>();
227*84e33947SAndroid Build Coastguard Worker 
228*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, CHRE_TRACE_STR_BUFFER_SIZE);
229*84e33947SAndroid Build Coastguard Worker 
230*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
231*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer, data);
232*84e33947SAndroid Build Coastguard Worker 
233*84e33947SAndroid Build Coastguard Worker   // Fully populated buffer with data len and null-byte padding at the end.
234*84e33947SAndroid Build Coastguard Worker   uint8_t expectedBuffer[CHRE_TRACE_STR_BUFFER_SIZE] = {dataLen, 't', 'e', 's',
235*84e33947SAndroid Build Coastguard Worker                                                         't'};
236*84e33947SAndroid Build Coastguard Worker   for (std::size_t i = dataLen + 1; i < CHRE_TRACE_STR_BUFFER_SIZE; i++) {
237*84e33947SAndroid Build Coastguard Worker     expectedBuffer[i] = '\0';
238*84e33947SAndroid Build Coastguard Worker   }
239*84e33947SAndroid Build Coastguard Worker 
240*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer, ElementsAreArray(expectedBuffer));
241*84e33947SAndroid Build Coastguard Worker }
242*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedMaxLenStrNoPadding)243*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedMaxLenStrNoPadding) {
244*84e33947SAndroid Build Coastguard Worker   // String data buffer to hold max-len string.
245*84e33947SAndroid Build Coastguard Worker   char dataBuffer[CHRE_TRACE_MAX_STRING_SIZE + 1];
246*84e33947SAndroid Build Coastguard Worker   // Fully populated buffer with data len and no null-byte padding.
247*84e33947SAndroid Build Coastguard Worker   // In this case data len should equal CHRE_TRACE_MAX_STRING_SIZE.
248*84e33947SAndroid Build Coastguard Worker   uint8_t expectedBuffer[CHRE_TRACE_STR_BUFFER_SIZE] = {
249*84e33947SAndroid Build Coastguard Worker       CHRE_TRACE_MAX_STRING_SIZE};
250*84e33947SAndroid Build Coastguard Worker 
251*84e33947SAndroid Build Coastguard Worker   // Populate the buffer with str "0123456789..." until we hit max size.
252*84e33947SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < CHRE_TRACE_MAX_STRING_SIZE; i++) {
253*84e33947SAndroid Build Coastguard Worker     dataBuffer[i] = '0' + (i % 10);
254*84e33947SAndroid Build Coastguard Worker     expectedBuffer[i + 1] = '0' + (i % 10);
255*84e33947SAndroid Build Coastguard Worker   }
256*84e33947SAndroid Build Coastguard Worker   dataBuffer[CHRE_TRACE_MAX_STRING_SIZE] = '\0';
257*84e33947SAndroid Build Coastguard Worker 
258*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
259*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(dataBuffer)>();
260*84e33947SAndroid Build Coastguard Worker 
261*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, CHRE_TRACE_STR_BUFFER_SIZE);
262*84e33947SAndroid Build Coastguard Worker 
263*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
264*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer,
265*84e33947SAndroid Build Coastguard Worker                                                     dataBuffer);
266*84e33947SAndroid Build Coastguard Worker 
267*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer, ElementsAreArray(expectedBuffer));
268*84e33947SAndroid Build Coastguard Worker }
269*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithTracedStringTuncateToMaxLength)270*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithTracedStringTuncateToMaxLength) {
271*84e33947SAndroid Build Coastguard Worker   const size_t kBufferPadding = 5;
272*84e33947SAndroid Build Coastguard Worker   const std::size_t kOversizeStrLen =
273*84e33947SAndroid Build Coastguard Worker       CHRE_TRACE_MAX_STRING_SIZE + kBufferPadding;
274*84e33947SAndroid Build Coastguard Worker   // String data buffer to hold oversized string.
275*84e33947SAndroid Build Coastguard Worker   char dataBuffer[kOversizeStrLen + 1];
276*84e33947SAndroid Build Coastguard Worker 
277*84e33947SAndroid Build Coastguard Worker   // Populate the buffer with str "0123456789..." until we hit kOversizeStrLen.
278*84e33947SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < kOversizeStrLen; i++) {
279*84e33947SAndroid Build Coastguard Worker     dataBuffer[i] = '0' + (i % 10);
280*84e33947SAndroid Build Coastguard Worker   }
281*84e33947SAndroid Build Coastguard Worker   dataBuffer[kOversizeStrLen] = '\0';
282*84e33947SAndroid Build Coastguard Worker 
283*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
284*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(dataBuffer)>();
285*84e33947SAndroid Build Coastguard Worker 
286*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, CHRE_TRACE_STR_BUFFER_SIZE);
287*84e33947SAndroid Build Coastguard Worker 
288*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
289*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(chreTraceDataBuffer,
290*84e33947SAndroid Build Coastguard Worker                                                     dataBuffer);
291*84e33947SAndroid Build Coastguard Worker 
292*84e33947SAndroid Build Coastguard Worker   // Fully populated buffer with data len and truncated string.
293*84e33947SAndroid Build Coastguard Worker   // In this case data len should equal CHRE_TRACE_MAX_STRING_SIZE, not
294*84e33947SAndroid Build Coastguard Worker   // kOversizeStrLen.
295*84e33947SAndroid Build Coastguard Worker   uint8_t expectedBuffer[CHRE_TRACE_STR_BUFFER_SIZE] = {
296*84e33947SAndroid Build Coastguard Worker       CHRE_TRACE_MAX_STRING_SIZE};
297*84e33947SAndroid Build Coastguard Worker 
298*84e33947SAndroid Build Coastguard Worker   // Populate the buffer with str "0123456789..." until we hit
299*84e33947SAndroid Build Coastguard Worker   // CHRE_TRACE_MAX_STRING_SIZE.
300*84e33947SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < CHRE_TRACE_MAX_STRING_SIZE; i++) {
301*84e33947SAndroid Build Coastguard Worker     expectedBuffer[i + 1] = '0' + (i % 10);
302*84e33947SAndroid Build Coastguard Worker   }
303*84e33947SAndroid Build Coastguard Worker 
304*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer, ElementsAreArray(expectedBuffer));
305*84e33947SAndroid Build Coastguard Worker }
306*84e33947SAndroid Build Coastguard Worker 
TEST(Trace,PopulateBufferWithMultipleTracedData)307*84e33947SAndroid Build Coastguard Worker TEST(Trace, PopulateBufferWithMultipleTracedData) {
308*84e33947SAndroid Build Coastguard Worker   uint8_t dataUint8 = 0x12;
309*84e33947SAndroid Build Coastguard Worker   char dataChar = 'a';
310*84e33947SAndroid Build Coastguard Worker   uint32_t dataUint32 = 0x12345678;
311*84e33947SAndroid Build Coastguard Worker   char dataStr[CHRE_TRACE_MAX_STRING_SIZE];
312*84e33947SAndroid Build Coastguard Worker   strncpy(dataStr, "test", CHRE_TRACE_MAX_STRING_SIZE);
313*84e33947SAndroid Build Coastguard Worker   uint8_t dataStrLen = static_cast<uint8_t>(strlen(dataStr));
314*84e33947SAndroid Build Coastguard Worker   std::size_t totalDataSize = sizeof(uint8_t) + sizeof(char) +
315*84e33947SAndroid Build Coastguard Worker                               sizeof(uint32_t) + CHRE_TRACE_STR_BUFFER_SIZE;
316*84e33947SAndroid Build Coastguard Worker 
317*84e33947SAndroid Build Coastguard Worker   constexpr std::size_t chreTraceDataSize =
318*84e33947SAndroid Build Coastguard Worker       tracing_internal::chreTraceGetSizeOfVarArgs<TYPE_LIST(
319*84e33947SAndroid Build Coastguard Worker           dataUint8, dataChar, dataUint32, dataStr)>();
320*84e33947SAndroid Build Coastguard Worker 
321*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreTraceDataSize, totalDataSize);
322*84e33947SAndroid Build Coastguard Worker 
323*84e33947SAndroid Build Coastguard Worker   uint8_t expectedBuffer[chreTraceDataSize] = {0x12, 'a',  0x78,      0x56,
324*84e33947SAndroid Build Coastguard Worker                                                0x34, 0x12, dataStrLen};
325*84e33947SAndroid Build Coastguard Worker   strncpy((char *)(&expectedBuffer[7]), dataStr, CHRE_TRACE_MAX_STRING_SIZE);
326*84e33947SAndroid Build Coastguard Worker 
327*84e33947SAndroid Build Coastguard Worker   uint8_t chreTraceDataBuffer[chreTraceDataSize];
328*84e33947SAndroid Build Coastguard Worker   tracing_internal::chreTracePopulateBufferWithArgs(
329*84e33947SAndroid Build Coastguard Worker       chreTraceDataBuffer, dataUint8, dataChar, dataUint32, dataStr);
330*84e33947SAndroid Build Coastguard Worker 
331*84e33947SAndroid Build Coastguard Worker   EXPECT_THAT(chreTraceDataBuffer, ElementsAreArray(expectedBuffer));
332*84e33947SAndroid Build Coastguard Worker }
333*84e33947SAndroid Build Coastguard Worker 
334*84e33947SAndroid Build Coastguard Worker // TODO(b/302232350): Add a death test for unsupported data types. Currently
335*84e33947SAndroid Build Coastguard Worker //                    testing unsupported types (structs) with manual testing.
336*84e33947SAndroid Build Coastguard Worker 
337*84e33947SAndroid Build Coastguard Worker }  // namespace
338*84e33947SAndroid Build Coastguard Worker }  // namespace tracing_internal