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