xref: /aosp_15_r20/system/dmesgd/dmesg_parser_test.cpp (revision 325a5df984070639bfcfcc2d7b58a6181e21cf50)
1*325a5df9SAndroid Build Coastguard Worker /*
2*325a5df9SAndroid Build Coastguard Worker  * Copyright 2022, The Android Open Source Project
3*325a5df9SAndroid Build Coastguard Worker  *
4*325a5df9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*325a5df9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*325a5df9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*325a5df9SAndroid Build Coastguard Worker  *
8*325a5df9SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
9*325a5df9SAndroid Build Coastguard Worker  *
10*325a5df9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*325a5df9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*325a5df9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*325a5df9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*325a5df9SAndroid Build Coastguard Worker  * limitations under the License.
15*325a5df9SAndroid Build Coastguard Worker  */
16*325a5df9SAndroid Build Coastguard Worker 
17*325a5df9SAndroid Build Coastguard Worker #include <string>
18*325a5df9SAndroid Build Coastguard Worker #include <vector>
19*325a5df9SAndroid Build Coastguard Worker 
20*325a5df9SAndroid Build Coastguard Worker #include <gtest/gtest.h>
21*325a5df9SAndroid Build Coastguard Worker 
22*325a5df9SAndroid Build Coastguard Worker #include "dmesg_parser.h"
23*325a5df9SAndroid Build Coastguard Worker 
24*325a5df9SAndroid Build Coastguard Worker class DmesgParserTest : public ::testing::Test {
25*325a5df9SAndroid Build Coastguard Worker   public:
26*325a5df9SAndroid Build Coastguard Worker     void ReadLines(const std::vector<std::string>& lines);
27*325a5df9SAndroid Build Coastguard Worker     bool CheckReport(const std::vector<std::string>& lines);
28*325a5df9SAndroid Build Coastguard Worker 
29*325a5df9SAndroid Build Coastguard Worker     dmesg_parser::DmesgParser parser;
30*325a5df9SAndroid Build Coastguard Worker     std::string parsed_report;
31*325a5df9SAndroid Build Coastguard Worker };
32*325a5df9SAndroid Build Coastguard Worker 
ReadLines(const std::vector<std::string> & lines)33*325a5df9SAndroid Build Coastguard Worker void DmesgParserTest::ReadLines(const std::vector<std::string>& lines) {
34*325a5df9SAndroid Build Coastguard Worker     for (auto line : lines) parser.ProcessLine(line);
35*325a5df9SAndroid Build Coastguard Worker }
36*325a5df9SAndroid Build Coastguard Worker 
CheckReport(const std::vector<std::string> & lines)37*325a5df9SAndroid Build Coastguard Worker bool DmesgParserTest::CheckReport(const std::vector<std::string>& lines) {
38*325a5df9SAndroid Build Coastguard Worker     if (!parser.ReportReady()) return false;
39*325a5df9SAndroid Build Coastguard Worker     parsed_report = parser.FlushReport();
40*325a5df9SAndroid Build Coastguard Worker 
41*325a5df9SAndroid Build Coastguard Worker     std::string report;
42*325a5df9SAndroid Build Coastguard Worker     for (auto line : lines) {
43*325a5df9SAndroid Build Coastguard Worker         report += line;
44*325a5df9SAndroid Build Coastguard Worker     }
45*325a5df9SAndroid Build Coastguard Worker     EXPECT_EQ(report, parsed_report);
46*325a5df9SAndroid Build Coastguard Worker     return report == parsed_report;
47*325a5df9SAndroid Build Coastguard Worker }
48*325a5df9SAndroid Build Coastguard Worker 
TEST_F(DmesgParserTest,SimpleKasanReport)49*325a5df9SAndroid Build Coastguard Worker TEST_F(DmesgParserTest, SimpleKasanReport) {
50*325a5df9SAndroid Build Coastguard Worker     std::vector<std::string> in = {
51*325a5df9SAndroid Build Coastguard Worker             "[  495.412333] [    T1] init: this line will be dropped\n",
52*325a5df9SAndroid Build Coastguard Worker             "[  495.412345] [ T9971] "
53*325a5df9SAndroid Build Coastguard Worker             "==================================================================\n",
54*325a5df9SAndroid Build Coastguard Worker             "[  495.496694] [ T9971] BUG: KASAN: invalid-access in crash_write+0x134/0x140\n",
55*325a5df9SAndroid Build Coastguard Worker             "[  495.712345] [ T9971] "
56*325a5df9SAndroid Build Coastguard Worker             "==================================================================\n",
57*325a5df9SAndroid Build Coastguard Worker             "[  495.767899] [ T9971] logs after the separator do not belong to report\n",
58*325a5df9SAndroid Build Coastguard Worker     };
59*325a5df9SAndroid Build Coastguard Worker 
60*325a5df9SAndroid Build Coastguard Worker     std::vector<std::string> report = {
61*325a5df9SAndroid Build Coastguard Worker             "[  495.496694] [ T9971] BUG: KASAN: invalid-access in crash_write+0x134/0x140\n",
62*325a5df9SAndroid Build Coastguard Worker     };
63*325a5df9SAndroid Build Coastguard Worker 
64*325a5df9SAndroid Build Coastguard Worker     ReadLines(in);
65*325a5df9SAndroid Build Coastguard Worker     ASSERT_TRUE(parser.ReportReady());
66*325a5df9SAndroid Build Coastguard Worker     ASSERT_EQ("KASAN", parser.ReportType());
67*325a5df9SAndroid Build Coastguard Worker     ASSERT_EQ("BUG: KASAN: invalid-access in crash_write+0x134/0x140", parser.ReportTitle());
68*325a5df9SAndroid Build Coastguard Worker     ASSERT_TRUE(CheckReport(report));
69*325a5df9SAndroid Build Coastguard Worker }
70*325a5df9SAndroid Build Coastguard Worker 
TEST_F(DmesgParserTest,StrippedKasanReport)71*325a5df9SAndroid Build Coastguard Worker TEST_F(DmesgParserTest, StrippedKasanReport) {
72*325a5df9SAndroid Build Coastguard Worker     /*
73*325a5df9SAndroid Build Coastguard Worker      * From the following report, only the lines from T9971 between the "======="
74*325a5df9SAndroid Build Coastguard Worker      * delimiters will be preserved, and only those that do not contain raw
75*325a5df9SAndroid Build Coastguard Worker      * memory.
76*325a5df9SAndroid Build Coastguard Worker      * Task name is also stripped off, because it may contain sensitive data.
77*325a5df9SAndroid Build Coastguard Worker      */
78*325a5df9SAndroid Build Coastguard Worker     std::vector<std::string> in = {
79*325a5df9SAndroid Build Coastguard Worker             "[  495.412333] [    T1] init: this line will be dropped\n",
80*325a5df9SAndroid Build Coastguard Worker             "[  495.412345] [ T9971] "
81*325a5df9SAndroid Build Coastguard Worker             "==================================================================\n",
82*325a5df9SAndroid Build Coastguard Worker             "[  495.496694] [ T9971] BUG: KASAN: invalid-access in crash_write+0x134/0x140\n",
83*325a5df9SAndroid Build Coastguard Worker             "[  495.501234] [  T333] random_process: interleaving output with our error report\n",
84*325a5df9SAndroid Build Coastguard Worker             "[  495.503671] [ T9971] Read at addr f0ffff87c23fdf7f by task sh/9971\n",
85*325a5df9SAndroid Build Coastguard Worker             "[  495.510025] [ T9971] Pointer tag: [f0], memory tag: [fe]\n",
86*325a5df9SAndroid Build Coastguard Worker             "[  495.515400] [ T9971] \n",
87*325a5df9SAndroid Build Coastguard Worker             "[  495.667603] [ T9971] raw: 4000000000010200 0000000000000000 0000000000000000 "
88*325a5df9SAndroid Build Coastguard Worker             "0000000100200020\n",
89*325a5df9SAndroid Build Coastguard Worker             "[  495.667634] [ T9971] raw: dead000000000100 dead000000000200 ffffffc14900fc00 "
90*325a5df9SAndroid Build Coastguard Worker             "0000000000000000\n",
91*325a5df9SAndroid Build Coastguard Worker             "[  495.712345] [ T9971] "
92*325a5df9SAndroid Build Coastguard Worker             "==================================================================\n",
93*325a5df9SAndroid Build Coastguard Worker             "[  495.767899] [ T9971] logs after the separator do not belong to report\n",
94*325a5df9SAndroid Build Coastguard Worker     };
95*325a5df9SAndroid Build Coastguard Worker 
96*325a5df9SAndroid Build Coastguard Worker     std::vector<std::string> report = {
97*325a5df9SAndroid Build Coastguard Worker             "[  495.496694] [ T9971] BUG: KASAN: invalid-access in crash_write+0x134/0x140\n",
98*325a5df9SAndroid Build Coastguard Worker             "[  495.503671] [ T9971] Read at addr XXXXXXXXXXXXXXXX by task DELETED\n",
99*325a5df9SAndroid Build Coastguard Worker             "[  495.510025] [ T9971] Pointer tag: [f0], memory tag: [fe]\n",
100*325a5df9SAndroid Build Coastguard Worker             "[  495.515400] [ T9971] \n",
101*325a5df9SAndroid Build Coastguard Worker     };
102*325a5df9SAndroid Build Coastguard Worker 
103*325a5df9SAndroid Build Coastguard Worker     ReadLines(in);
104*325a5df9SAndroid Build Coastguard Worker     ASSERT_TRUE(parser.ReportReady());
105*325a5df9SAndroid Build Coastguard Worker     ASSERT_EQ("KASAN", parser.ReportType());
106*325a5df9SAndroid Build Coastguard Worker     ASSERT_EQ("BUG: KASAN: invalid-access in crash_write+0x134/0x140", parser.ReportTitle());
107*325a5df9SAndroid Build Coastguard Worker     ASSERT_TRUE(CheckReport(report));
108*325a5df9SAndroid Build Coastguard Worker }
109*325a5df9SAndroid Build Coastguard Worker 
TEST_F(DmesgParserTest,SimpleKfenceReport)110*325a5df9SAndroid Build Coastguard Worker TEST_F(DmesgParserTest, SimpleKfenceReport) {
111*325a5df9SAndroid Build Coastguard Worker     std::vector<std::string> in = {
112*325a5df9SAndroid Build Coastguard Worker             "[  495.412333] [    T1] init: this line will be dropped\n",
113*325a5df9SAndroid Build Coastguard Worker             "[  495.412345] [ T9971] "
114*325a5df9SAndroid Build Coastguard Worker             "==================================================================\n",
115*325a5df9SAndroid Build Coastguard Worker             "[  495.496694] [ T9971] BUG: KFENCE: memory corruption in "
116*325a5df9SAndroid Build Coastguard Worker             "test_corruption+0x98/0x19c\n",
117*325a5df9SAndroid Build Coastguard Worker             "[  495.712345] [ T9971] "
118*325a5df9SAndroid Build Coastguard Worker             "==================================================================\n",
119*325a5df9SAndroid Build Coastguard Worker             "[  495.767899] [ T9971] logs after the separator do not belong to report\n",
120*325a5df9SAndroid Build Coastguard Worker     };
121*325a5df9SAndroid Build Coastguard Worker 
122*325a5df9SAndroid Build Coastguard Worker     std::vector<std::string> report = {
123*325a5df9SAndroid Build Coastguard Worker             "[  495.496694] [ T9971] BUG: KFENCE: memory corruption in "
124*325a5df9SAndroid Build Coastguard Worker             "test_corruption+0x98/0x19c\n",
125*325a5df9SAndroid Build Coastguard Worker     };
126*325a5df9SAndroid Build Coastguard Worker 
127*325a5df9SAndroid Build Coastguard Worker     ReadLines(in);
128*325a5df9SAndroid Build Coastguard Worker     ASSERT_TRUE(parser.ReportReady());
129*325a5df9SAndroid Build Coastguard Worker     ASSERT_EQ("KFENCE", parser.ReportType());
130*325a5df9SAndroid Build Coastguard Worker     ASSERT_EQ("BUG: KFENCE: memory corruption in test_corruption+0x98/0x19c", parser.ReportTitle());
131*325a5df9SAndroid Build Coastguard Worker     ASSERT_TRUE(CheckReport(report));
132*325a5df9SAndroid Build Coastguard Worker }
133*325a5df9SAndroid Build Coastguard Worker 
TEST_F(DmesgParserTest,StrippedKfenceReport)134*325a5df9SAndroid Build Coastguard Worker TEST_F(DmesgParserTest, StrippedKfenceReport) {
135*325a5df9SAndroid Build Coastguard Worker     std::vector<std::string> in = {
136*325a5df9SAndroid Build Coastguard Worker             "[  200.412333] [    T1] init: this line will be dropped\n",
137*325a5df9SAndroid Build Coastguard Worker             "[  213.648234] [ T8752] "
138*325a5df9SAndroid Build Coastguard Worker             "==================================================================\n",
139*325a5df9SAndroid Build Coastguard Worker             "[  213.648253] [ T8752] BUG: KFENCE: out-of-bounds write in crash_write+0x14c/0x174\n",
140*325a5df9SAndroid Build Coastguard Worker             "[  213.648262] [ T8752] Out-of-bounds write at 0xffffff8938a05000 (4096B left of "
141*325a5df9SAndroid Build Coastguard Worker             "kfence-#2):\n",
142*325a5df9SAndroid Build Coastguard Worker             "[  213.648270] [ T8752]  crash_write+0x14c/0x174\n",
143*325a5df9SAndroid Build Coastguard Worker             "[  213.648367] [ T8752] kfence-#2 [0xffffff8938a06000-0xffffff8938a0603f, size=64, "
144*325a5df9SAndroid Build Coastguard Worker             "cache=kmalloc-128] allocated by task 1:\n",
145*325a5df9SAndroid Build Coastguard Worker             "[  213.648471] [ T8752] CPU: 1 PID: 8752 Comm: sh Tainted: G         C O\n",
146*325a5df9SAndroid Build Coastguard Worker             "[  213.648478] [ T8752] Hardware name: Phone 1\n",
147*325a5df9SAndroid Build Coastguard Worker             "[  213.648498] [ T8752] "
148*325a5df9SAndroid Build Coastguard Worker             "==================================================================\n",
149*325a5df9SAndroid Build Coastguard Worker             "[  495.767899] [ T8752] logs after the separator do not belong to report\n",
150*325a5df9SAndroid Build Coastguard Worker     };
151*325a5df9SAndroid Build Coastguard Worker 
152*325a5df9SAndroid Build Coastguard Worker     std::vector<std::string> report = {
153*325a5df9SAndroid Build Coastguard Worker             "[  213.648253] [ T8752] BUG: KFENCE: out-of-bounds write in crash_write+0x14c/0x174\n",
154*325a5df9SAndroid Build Coastguard Worker             "[  213.648262] [ T8752] Out-of-bounds write at XXXXXXXXXXXXXXXX (4096B left of "
155*325a5df9SAndroid Build Coastguard Worker             "kfence-#2):\n",
156*325a5df9SAndroid Build Coastguard Worker             "[  213.648270] [ T8752]  crash_write+0x14c/0x174\n",
157*325a5df9SAndroid Build Coastguard Worker             "[  213.648367] [ T8752] kfence-#2 [XXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXX, size=64, "
158*325a5df9SAndroid Build Coastguard Worker             "cache=kmalloc-128] allocated by task DELETED\n",
159*325a5df9SAndroid Build Coastguard Worker     };
160*325a5df9SAndroid Build Coastguard Worker 
161*325a5df9SAndroid Build Coastguard Worker     ReadLines(in);
162*325a5df9SAndroid Build Coastguard Worker     ASSERT_TRUE(parser.ReportReady());
163*325a5df9SAndroid Build Coastguard Worker     ASSERT_EQ("KFENCE", parser.ReportType());
164*325a5df9SAndroid Build Coastguard Worker     ASSERT_EQ("BUG: KFENCE: out-of-bounds write in crash_write+0x14c/0x174", parser.ReportTitle());
165*325a5df9SAndroid Build Coastguard Worker     ASSERT_TRUE(CheckReport(report));
166*325a5df9SAndroid Build Coastguard Worker }
167*325a5df9SAndroid Build Coastguard Worker 
TEST_F(DmesgParserTest,PartialReport)168*325a5df9SAndroid Build Coastguard Worker TEST_F(DmesgParserTest, PartialReport) {
169*325a5df9SAndroid Build Coastguard Worker     std::vector<std::string> in = {
170*325a5df9SAndroid Build Coastguard Worker             "[  213.648234] [ T8752] "
171*325a5df9SAndroid Build Coastguard Worker             "==================================================================\n",
172*325a5df9SAndroid Build Coastguard Worker             "[  213.648253] [ T8752] BUG: KFENCE: out-of-bounds write in crash_write+0x14c/0x174\n",
173*325a5df9SAndroid Build Coastguard Worker             "[  213.648262] [ T8752] Out-of-bounds write at 0xffffff8938a05000 (4096B left of "
174*325a5df9SAndroid Build Coastguard Worker             "kfence-#2):\n",
175*325a5df9SAndroid Build Coastguard Worker             "[  213.648270] [ T8752]  crash_write+0x14c/0x174\n",
176*325a5df9SAndroid Build Coastguard Worker     };
177*325a5df9SAndroid Build Coastguard Worker 
178*325a5df9SAndroid Build Coastguard Worker     ReadLines(in);
179*325a5df9SAndroid Build Coastguard Worker     ASSERT_FALSE(parser.ReportReady());
180*325a5df9SAndroid Build Coastguard Worker }
181*325a5df9SAndroid Build Coastguard Worker 
TEST_F(DmesgParserTest,TwoReports)182*325a5df9SAndroid Build Coastguard Worker TEST_F(DmesgParserTest, TwoReports) {
183*325a5df9SAndroid Build Coastguard Worker     std::vector<std::string> in = {
184*325a5df9SAndroid Build Coastguard Worker             "[  200.412333] [    T1] init: this line will be dropped\n",
185*325a5df9SAndroid Build Coastguard Worker             "[  213.648234] [ T8752] "
186*325a5df9SAndroid Build Coastguard Worker             "==================================================================\n",
187*325a5df9SAndroid Build Coastguard Worker             "[  213.648253] [ T8752] BUG: KFENCE: out-of-bounds write in crash_write+0x14c/0x174\n",
188*325a5df9SAndroid Build Coastguard Worker             "[  213.648262] [ T8752] Out-of-bounds write at 0xffffff8938a05000 (4096B left of "
189*325a5df9SAndroid Build Coastguard Worker             "kfence-#2):\n",
190*325a5df9SAndroid Build Coastguard Worker             "[  214.648234] [ T9971] "
191*325a5df9SAndroid Build Coastguard Worker             "==================================================================\n",
192*325a5df9SAndroid Build Coastguard Worker             "[  215.496694] [ T9971] BUG: KFENCE: memory corruption in "
193*325a5df9SAndroid Build Coastguard Worker             "test_corruption+0x98/0x19c\n",
194*325a5df9SAndroid Build Coastguard Worker             "[  216.648270] [ T8752]  crash_write+0x14c/0x174\n",
195*325a5df9SAndroid Build Coastguard Worker             "[  217.648234] [ T8752] "
196*325a5df9SAndroid Build Coastguard Worker             "==================================================================\n",
197*325a5df9SAndroid Build Coastguard Worker     };
198*325a5df9SAndroid Build Coastguard Worker 
199*325a5df9SAndroid Build Coastguard Worker     std::vector<std::string> report = {
200*325a5df9SAndroid Build Coastguard Worker             "[  213.648253] [ T8752] BUG: KFENCE: out-of-bounds write in crash_write+0x14c/0x174\n",
201*325a5df9SAndroid Build Coastguard Worker             "[  213.648262] [ T8752] Out-of-bounds write at XXXXXXXXXXXXXXXX (4096B left of "
202*325a5df9SAndroid Build Coastguard Worker             "kfence-#2):\n",
203*325a5df9SAndroid Build Coastguard Worker             "[  216.648270] [ T8752]  crash_write+0x14c/0x174\n",
204*325a5df9SAndroid Build Coastguard Worker     };
205*325a5df9SAndroid Build Coastguard Worker 
206*325a5df9SAndroid Build Coastguard Worker     ReadLines(in);
207*325a5df9SAndroid Build Coastguard Worker     ASSERT_TRUE(parser.ReportReady());
208*325a5df9SAndroid Build Coastguard Worker     ASSERT_EQ("KFENCE", parser.ReportType());
209*325a5df9SAndroid Build Coastguard Worker     ASSERT_EQ("BUG: KFENCE: out-of-bounds write in crash_write+0x14c/0x174", parser.ReportTitle());
210*325a5df9SAndroid Build Coastguard Worker     ASSERT_TRUE(CheckReport(report));
211*325a5df9SAndroid Build Coastguard Worker }
212