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