1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker * Copyright (C) 2019 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 #include "gtest/gtest.h"
18*84e33947SAndroid Build Coastguard Worker
19*84e33947SAndroid Build Coastguard Worker #include <stdint.h>
20*84e33947SAndroid Build Coastguard Worker
21*84e33947SAndroid Build Coastguard Worker #include "chre/util/system/debug_dump.h"
22*84e33947SAndroid Build Coastguard Worker
23*84e33947SAndroid Build Coastguard Worker using chre::DebugDumpWrapper;
24*84e33947SAndroid Build Coastguard Worker
25*84e33947SAndroid Build Coastguard Worker static constexpr size_t kStandardBufferSize = 4000;
26*84e33947SAndroid Build Coastguard Worker
TEST(DebugDumpWrapper,ZeroBuffersInitially)27*84e33947SAndroid Build Coastguard Worker TEST(DebugDumpWrapper, ZeroBuffersInitially) {
28*84e33947SAndroid Build Coastguard Worker DebugDumpWrapper debugDump(kStandardBufferSize);
29*84e33947SAndroid Build Coastguard Worker const auto &buffers = debugDump.getBuffers();
30*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(buffers.empty());
31*84e33947SAndroid Build Coastguard Worker }
32*84e33947SAndroid Build Coastguard Worker
TEST(DebugDumpWrapper,OneBufferForOneString)33*84e33947SAndroid Build Coastguard Worker TEST(DebugDumpWrapper, OneBufferForOneString) {
34*84e33947SAndroid Build Coastguard Worker DebugDumpWrapper debugDump(kStandardBufferSize);
35*84e33947SAndroid Build Coastguard Worker const char *str = "Lorem ipsum";
36*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", str);
37*84e33947SAndroid Build Coastguard Worker const auto &buffers = debugDump.getBuffers();
38*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(buffers.size(), 1);
39*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(strcmp(buffers.front().get(), str) == 0);
40*84e33947SAndroid Build Coastguard Worker }
41*84e33947SAndroid Build Coastguard Worker
TEST(DebugDumpWrapper,TwoStringsFitPerfectlyInOneBuffer)42*84e33947SAndroid Build Coastguard Worker TEST(DebugDumpWrapper, TwoStringsFitPerfectlyInOneBuffer) {
43*84e33947SAndroid Build Coastguard Worker DebugDumpWrapper debugDump(5);
44*84e33947SAndroid Build Coastguard Worker const char *str1 = "ab";
45*84e33947SAndroid Build Coastguard Worker const char *str2 = "cd";
46*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", str1);
47*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", str2);
48*84e33947SAndroid Build Coastguard Worker const auto &buffers = debugDump.getBuffers();
49*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(buffers.size(), 1);
50*84e33947SAndroid Build Coastguard Worker char bothStr[5];
51*84e33947SAndroid Build Coastguard Worker strcpy(bothStr, str1);
52*84e33947SAndroid Build Coastguard Worker strcat(bothStr, str2);
53*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(strcmp(buffers.front().get(), bothStr) == 0);
54*84e33947SAndroid Build Coastguard Worker }
55*84e33947SAndroid Build Coastguard Worker
TEST(DebugDumpWrapper,TooLargeOfStringToFit)56*84e33947SAndroid Build Coastguard Worker TEST(DebugDumpWrapper, TooLargeOfStringToFit) {
57*84e33947SAndroid Build Coastguard Worker DebugDumpWrapper debugDump(1);
58*84e33947SAndroid Build Coastguard Worker const char *str = "a";
59*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", str);
60*84e33947SAndroid Build Coastguard Worker const auto &buffers = debugDump.getBuffers();
61*84e33947SAndroid Build Coastguard Worker
62*84e33947SAndroid Build Coastguard Worker // One null-terminated buffer will be created for an empty wrapper.
63*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(buffers.size(), 1);
64*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(strcmp(buffers.back().get(), "") == 0);
65*84e33947SAndroid Build Coastguard Worker
66*84e33947SAndroid Build Coastguard Worker // Once there's a buffer, it won't be updated.
67*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", str);
68*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(buffers.size(), 1);
69*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(strcmp(buffers.back().get(), "") == 0);
70*84e33947SAndroid Build Coastguard Worker }
71*84e33947SAndroid Build Coastguard Worker
TEST(DebugDumpWrapper,TooLargeOfStringWithPartlyFilledBuffer)72*84e33947SAndroid Build Coastguard Worker TEST(DebugDumpWrapper, TooLargeOfStringWithPartlyFilledBuffer) {
73*84e33947SAndroid Build Coastguard Worker DebugDumpWrapper debugDump(2);
74*84e33947SAndroid Build Coastguard Worker const char *str1 = "a";
75*84e33947SAndroid Build Coastguard Worker const char *str2 = "bc";
76*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", str1);
77*84e33947SAndroid Build Coastguard Worker const auto &buffers = debugDump.getBuffers();
78*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(buffers.size(), 1);
79*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", str2);
80*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(buffers.size(), 1);
81*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(strcmp(buffers.front().get(), str1) == 0);
82*84e33947SAndroid Build Coastguard Worker }
83*84e33947SAndroid Build Coastguard Worker
TEST(DebugDumpWrapper,StringForcesNewBufferWithPartlyFilledBuffer)84*84e33947SAndroid Build Coastguard Worker TEST(DebugDumpWrapper, StringForcesNewBufferWithPartlyFilledBuffer) {
85*84e33947SAndroid Build Coastguard Worker DebugDumpWrapper debugDump(4);
86*84e33947SAndroid Build Coastguard Worker const char *str1 = "ab";
87*84e33947SAndroid Build Coastguard Worker const char *str2 = "bc";
88*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", str1);
89*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", str2);
90*84e33947SAndroid Build Coastguard Worker const auto &buffers = debugDump.getBuffers();
91*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(buffers.size(), 2);
92*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(strcmp(buffers.front().get(), str1) == 0);
93*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(strcmp(buffers.back().get(), str2) == 0);
94*84e33947SAndroid Build Coastguard Worker }
95*84e33947SAndroid Build Coastguard Worker
TEST(DebugDumpWrapper,ManyNewBuffersAllocated)96*84e33947SAndroid Build Coastguard Worker TEST(DebugDumpWrapper, ManyNewBuffersAllocated) {
97*84e33947SAndroid Build Coastguard Worker DebugDumpWrapper debugDump(kStandardBufferSize);
98*84e33947SAndroid Build Coastguard Worker const char *str = "aaaaaaaaa";
99*84e33947SAndroid Build Coastguard Worker // Should be 12000 chars added to debugDump
100*84e33947SAndroid Build Coastguard Worker constexpr size_t kNumPrints = 1200;
101*84e33947SAndroid Build Coastguard Worker for (size_t i = 0; i < kNumPrints; i++) {
102*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", str);
103*84e33947SAndroid Build Coastguard Worker }
104*84e33947SAndroid Build Coastguard Worker const auto &buffers = debugDump.getBuffers();
105*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(buffers.size(), 3);
106*84e33947SAndroid Build Coastguard Worker }
107*84e33947SAndroid Build Coastguard Worker
TEST(DebugDumpWrapper,EmptyStringAllocsOneBuffer)108*84e33947SAndroid Build Coastguard Worker TEST(DebugDumpWrapper, EmptyStringAllocsOneBuffer) {
109*84e33947SAndroid Build Coastguard Worker DebugDumpWrapper debugDump(kStandardBufferSize);
110*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", "");
111*84e33947SAndroid Build Coastguard Worker const auto &buffers = debugDump.getBuffers();
112*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(buffers.size(), 1);
113*84e33947SAndroid Build Coastguard Worker }
114*84e33947SAndroid Build Coastguard Worker
TEST(DebugDumpWrapper,BuffersClear)115*84e33947SAndroid Build Coastguard Worker TEST(DebugDumpWrapper, BuffersClear) {
116*84e33947SAndroid Build Coastguard Worker DebugDumpWrapper debugDump(4);
117*84e33947SAndroid Build Coastguard Worker const char *str1 = "ab";
118*84e33947SAndroid Build Coastguard Worker const char *str2 = "cd";
119*84e33947SAndroid Build Coastguard Worker const char *str3 = "ef";
120*84e33947SAndroid Build Coastguard Worker
121*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", str1);
122*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", str2);
123*84e33947SAndroid Build Coastguard Worker const auto &buffers = debugDump.getBuffers();
124*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(buffers.size(), 2);
125*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(strcmp(buffers.front().get(), str1) == 0);
126*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(strcmp(buffers.back().get(), str2) == 0);
127*84e33947SAndroid Build Coastguard Worker
128*84e33947SAndroid Build Coastguard Worker debugDump.clear();
129*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(buffers.size(), 0);
130*84e33947SAndroid Build Coastguard Worker
131*84e33947SAndroid Build Coastguard Worker debugDump.print("%s", str3);
132*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(buffers.size(), 1);
133*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(strcmp(buffers.front().get(), str3) == 0);
134*84e33947SAndroid Build Coastguard Worker }
135*84e33947SAndroid Build Coastguard Worker
printVaList(DebugDumpWrapper * debugDump,const char * formatStr,...)136*84e33947SAndroid Build Coastguard Worker void printVaList(DebugDumpWrapper *debugDump, const char *formatStr, ...) {
137*84e33947SAndroid Build Coastguard Worker va_list args;
138*84e33947SAndroid Build Coastguard Worker va_start(args, formatStr);
139*84e33947SAndroid Build Coastguard Worker debugDump->printVaList(formatStr, args);
140*84e33947SAndroid Build Coastguard Worker va_end(args);
141*84e33947SAndroid Build Coastguard Worker }
142*84e33947SAndroid Build Coastguard Worker
TEST(DebugDumpWrapper,PrintVaListTwoStrings)143*84e33947SAndroid Build Coastguard Worker TEST(DebugDumpWrapper, PrintVaListTwoStrings) {
144*84e33947SAndroid Build Coastguard Worker DebugDumpWrapper debugDump(5);
145*84e33947SAndroid Build Coastguard Worker const char *str1 = "ab";
146*84e33947SAndroid Build Coastguard Worker const char *str2 = "cd";
147*84e33947SAndroid Build Coastguard Worker printVaList(&debugDump, "%s", str1);
148*84e33947SAndroid Build Coastguard Worker printVaList(&debugDump, "%s", str2);
149*84e33947SAndroid Build Coastguard Worker const auto &buffers = debugDump.getBuffers();
150*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(buffers.size(), 1);
151*84e33947SAndroid Build Coastguard Worker char bothStr[5];
152*84e33947SAndroid Build Coastguard Worker strcpy(bothStr, str1);
153*84e33947SAndroid Build Coastguard Worker strcat(bothStr, str2);
154*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(strcmp(buffers.front().get(), bothStr) == 0);
155*84e33947SAndroid Build Coastguard Worker }
156