1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://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,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "hilog_print_test.h"
16 #include "hilog/log.h"
17 #include <log_utils.h>
18 
19 using namespace std;
20 using namespace testing::ext;
21 using namespace OHOS;
22 using namespace OHOS::HiviewDFX;
23 
24 namespace {
25 const HiLogLabel LABEL = { LOG_CORE, 0xD002D00, "HILOGTEST_C" };
26 const int LOGINDEX = 42 + strlen("HILOGTEST_C");
27 
GetCmdResultFromPopen(const std::string & cmd)28 std::string GetCmdResultFromPopen(const std::string& cmd)
29 {
30     if (cmd.empty()) {
31         return "";
32     }
33     FILE* fp = popen(cmd.c_str(), "r");
34     if (fp == nullptr) {
35         return "";
36     }
37     std::string ret = "";
38     char* buffer = nullptr;
39     size_t len = 0;
40     while (getline(&buffer, &len, fp) != -1) {
41         std::string line = buffer;
42         ret += line;
43     }
44     if (buffer != nullptr) {
45         free(buffer);
46         buffer = nullptr;
47     }
48     pclose(fp);
49     return ret;
50 }
51 }
52 
SetUpTestCase()53 void HilogPrintTest::SetUpTestCase()
54 {
55     (void)GetCmdResultFromPopen("hilog -b X");
56     (void)GetCmdResultFromPopen("hilog -b I -D d002d00");
57 }
58 
TearDownTestCase()59 void HilogPrintTest::TearDownTestCase()
60 {
61     (void)GetCmdResultFromPopen("hilog -b I");
62 }
63 
SetUp()64 void HilogPrintTest::SetUp()
65 {
66     (void)GetCmdResultFromPopen("hilog -r");
67 }
68 
69 namespace {
70 /**
71  * @tc.name: Dfx_HilogPrintTest_HilogTypeTest
72  * @tc.desc: HilogTypeTest.
73  * @tc.type: FUNC
74  */
75 HWTEST_F(HilogPrintTest, HilogTypeTest, TestSize.Level1)
76 {
77 const vector<string> typeVec = {
78     {"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()'+-/,.-~:;<=>?_[]{}|\\\""},
79     {"123"},
80     {"173"},
81     {"123"},
82     {"0x7b, 0x7B"},
83     {"0.000123, 0.000123"},
84     {"1.230000e-04, 1.230000E-04"},
85     {"0.000123, 0.123"},
86     {"0.000123, 0.123"},
87     {"A"},
88 };
89 
90     GTEST_LOG_(INFO) << "HilogTypeTest: start.";
91     HiLog::Info(LABEL, "%{public}s",
92         "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()'+-/,.-~:;<=>?_[]{}|\\\"");
93     HiLog::Info(LABEL, "%{public}i", 123);
94     HiLog::Info(LABEL, "%{public}o", 123);
95     HiLog::Info(LABEL, "%{public}u", 123);
96     HiLog::Info(LABEL, "0x%{public}x, 0x%{public}X", 123, 123);
97     HiLog::Info(LABEL, "%{public}.6f, %{public}.6lf", 0.000123, 0.000123);
98     HiLog::Info(LABEL, "%{public}e, %{public}E", 0.000123, 0.000123);
99     HiLog::Info(LABEL, "%{public}g, %{public}g", 0.000123, 0.123);
100     HiLog::Info(LABEL, "%{public}G, %{public}G", 0.000123, 0.123);
101     HiLog::Info(LABEL, "%{public}c", 65);
102 
103     std::string res = GetCmdResultFromPopen("hilog -T HILOGTEST_C -x");
104     vector<string> vec;
105     std::string log = "";
106     Split(res, vec, "\n");
107     for (unsigned int i = 0; i < vec.size(); i++) {
108         log = vec[i].substr(LOGINDEX);
109         EXPECT_EQ(log, typeVec[i]);
110     }
111 }
112 
113 /**
114  * @tc.name: Dfx_HilogPrintTest_HilogFlagTest
115  * @tc.desc: HilogFlagTest.
116  * @tc.type: FUNC
117  */
118 HWTEST_F(HilogPrintTest, HilogFlagTest, TestSize.Level1)
119 {
120 const vector<string> FlagVec = {
121     {" 1000"},
122     {"1000 "},
123     {"+1000, -1000"},
124     {" 1000, -1000"},
125     {"3e8, 0x3e8"},
126     {"1000, 1000."},
127     {"1000, 1000.00"},
128     {"01000"},
129 };
130 
131     GTEST_LOG_(INFO) << "HilogFlagTest: start.";
132     HiLog::Info(LABEL, "%{public}5d", 1000);
133     HiLog::Info(LABEL, "%{public}-5d", 1000);
134     HiLog::Info(LABEL, "%{public}+d, %{public}+d", 1000, -1000);
135     HiLog::Info(LABEL, "%{public} d, %{public} d", 1000, -1000);
136     HiLog::Info(LABEL, "%{public}x, %{public}#x", 1000, 1000);
137     HiLog::Info(LABEL, "%{public}.0f, %{public}#.0f", 1000.0, 1000.0);
138     HiLog::Info(LABEL, "%{public}g, %{public}#g", 1000.0, 1000.0);
139     HiLog::Info(LABEL, "%{public}05d", 1000);
140 
141     std::string res = GetCmdResultFromPopen("hilog -T HILOGTEST_C -x");
142     vector<string> vec;
143     std::string log = "";
144     Split(res, vec, "\n");
145     for (unsigned int i = 0; i < vec.size(); i++) {
146         log = vec[i].substr(LOGINDEX);
147         EXPECT_EQ(log, FlagVec[i]);
148     }
149 }
150 
151 /**
152  * @tc.name: Dfx_HilogPrintTest_HilogWidthTest
153  * @tc.desc: HilogWidthTest.
154  * @tc.type: FUNC
155  */
156 HWTEST_F(HilogPrintTest, HilogWidthTest, TestSize.Level1)
157 {
158 const vector<string> WidthVec = {
159     {"001000"},
160     {"001000"},
161 };
162 
163     GTEST_LOG_(INFO) << "HilogWidthTest: start.";
164     HiLog::Info(LABEL, "%{public}06d", 1000);
165     HiLog::Info(LABEL, "%{public}0*d", 6, 1000);
166 
167     std::string res = GetCmdResultFromPopen("hilog -T HILOGTEST_C -x");
168     vector<string> vec;
169     std::string log = "";
170     Split(res, vec, "\n");
171     for (unsigned int i = 0; i < vec.size(); i++) {
172         log = vec[i].substr(LOGINDEX);
173         EXPECT_EQ(log, WidthVec[i]);
174     }
175 }
176 
177 /**
178  * @tc.name: Dfx_HilogPrintTest_HilogPrecisionTest
179  * @tc.desc: HilogPrecisionTest.
180  * @tc.type: FUNC
181  */
182 HWTEST_F(HilogPrintTest, HilogPrecisionTest, TestSize.Level1)
183 {
184 const vector<string> PrecisionVec = {
185     {"00001000"},
186     {"1000.12345679"},
187     {"1000.12345600"},
188     {"1000.1235"},
189     {"abcdefgh"},
190 };
191 
192     GTEST_LOG_(INFO) << "HilogPrecisionTest: start.";
193     HiLog::Info(LABEL, "%{public}.8d", 1000);
194     HiLog::Info(LABEL, "%{public}.8f", 1000.123456789);
195     HiLog::Info(LABEL, "%{public}.8f", 1000.123456);
196     HiLog::Info(LABEL, "%{public}.8g", 1000.123456);
197     HiLog::Info(LABEL, "%{public}.8s", "abcdefghij");
198 
199     std::string res = GetCmdResultFromPopen("hilog -T HILOGTEST_C -x");
200     vector<string> vec;
201     std::string log = "";
202     Split(res, vec, "\n");
203     for (unsigned int i = 0; i < vec.size(); i++) {
204         log = vec[i].substr(LOGINDEX);
205         EXPECT_EQ(log, PrecisionVec[i]);
206     }
207 }
208 } // namespace