xref: /aosp_15_r20/system/logging/logd/SerializedLogBufferTest.cpp (revision 598139dc91b21518d67c408eaea2644226490971)
1*598139dcSAndroid Build Coastguard Worker /*
2*598139dcSAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*598139dcSAndroid Build Coastguard Worker  *
4*598139dcSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*598139dcSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*598139dcSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*598139dcSAndroid Build Coastguard Worker  *
8*598139dcSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*598139dcSAndroid Build Coastguard Worker  *
10*598139dcSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*598139dcSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*598139dcSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*598139dcSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*598139dcSAndroid Build Coastguard Worker  * limitations under the License.
15*598139dcSAndroid Build Coastguard Worker  */
16*598139dcSAndroid Build Coastguard Worker 
17*598139dcSAndroid Build Coastguard Worker #include "SerializedLogBuffer.h"
18*598139dcSAndroid Build Coastguard Worker 
19*598139dcSAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*598139dcSAndroid Build Coastguard Worker #include <log/log.h>
21*598139dcSAndroid Build Coastguard Worker 
22*598139dcSAndroid Build Coastguard Worker #include "LogReaderList.h"
23*598139dcSAndroid Build Coastguard Worker #include "LogSize.h"
24*598139dcSAndroid Build Coastguard Worker #include "LogStatistics.h"
25*598139dcSAndroid Build Coastguard Worker #include "LogTags.h"
26*598139dcSAndroid Build Coastguard Worker #include "SerializedLogChunk.h"
27*598139dcSAndroid Build Coastguard Worker #include "SerializedLogEntry.h"
28*598139dcSAndroid Build Coastguard Worker 
29*598139dcSAndroid Build Coastguard Worker // b/188858988 - Previously, if clearing UID logs erased the back-most chunk, then a chunk that has
30*598139dcSAndroid Build Coastguard Worker // previously been closed for writing will be the back-most chunk in the list. Subsequent calls to
31*598139dcSAndroid Build Coastguard Worker // SerializedLogBuffer::Log() will call SerializedLogChunk::FinishWriting(), which triggered a
32*598139dcSAndroid Build Coastguard Worker // CHECK().
TEST(SerializedLogBuffer,uid_prune_deletes_last_chunk)33*598139dcSAndroid Build Coastguard Worker TEST(SerializedLogBuffer, uid_prune_deletes_last_chunk) {
34*598139dcSAndroid Build Coastguard Worker     LogReaderList reader_list;
35*598139dcSAndroid Build Coastguard Worker     LogTags tags;
36*598139dcSAndroid Build Coastguard Worker     LogStatistics stats(false, true);
37*598139dcSAndroid Build Coastguard Worker     SerializedLogBuffer log_buffer(&reader_list, &tags, &stats);
38*598139dcSAndroid Build Coastguard Worker 
39*598139dcSAndroid Build Coastguard Worker     log_buffer.SetSize(LOG_ID_MAIN, kLogBufferMinSize);
40*598139dcSAndroid Build Coastguard Worker     log_buffer.Clear(LOG_ID_MAIN, 0);
41*598139dcSAndroid Build Coastguard Worker 
42*598139dcSAndroid Build Coastguard Worker     const uid_t kNonClearUid = 123;
43*598139dcSAndroid Build Coastguard Worker     const std::string kDontClearMessage = "this message is not cleared";
44*598139dcSAndroid Build Coastguard Worker     log_buffer.Log(LOG_ID_MAIN, log_time(0, 1), kNonClearUid, 1, 1, kDontClearMessage.data(),
45*598139dcSAndroid Build Coastguard Worker                    kDontClearMessage.size());
46*598139dcSAndroid Build Coastguard Worker 
47*598139dcSAndroid Build Coastguard Worker     // Fill at least one chunk with a message with the UID that we'll clear
48*598139dcSAndroid Build Coastguard Worker     const uid_t kClearUid = 555;
49*598139dcSAndroid Build Coastguard Worker     const std::string kClearMessage(1024, 'c');
50*598139dcSAndroid Build Coastguard Worker     size_t size_written = 0;
51*598139dcSAndroid Build Coastguard Worker     while (size_written < kLogBufferMinSize / 2) {
52*598139dcSAndroid Build Coastguard Worker         log_buffer.Log(LOG_ID_MAIN, log_time(1, size_written), kClearUid, 1, 1,
53*598139dcSAndroid Build Coastguard Worker                        kClearMessage.data(), kClearMessage.size());
54*598139dcSAndroid Build Coastguard Worker         size_written += kClearMessage.size();
55*598139dcSAndroid Build Coastguard Worker     }
56*598139dcSAndroid Build Coastguard Worker 
57*598139dcSAndroid Build Coastguard Worker     log_buffer.Clear(LOG_ID_MAIN, kClearUid);
58*598139dcSAndroid Build Coastguard Worker 
59*598139dcSAndroid Build Coastguard Worker     // This previously would trigger a CHECK() in SerializedLogChunk::FinishWriting().
60*598139dcSAndroid Build Coastguard Worker     log_buffer.Log(LOG_ID_MAIN, log_time(0, 2), kNonClearUid, 1, 1, kDontClearMessage.data(),
61*598139dcSAndroid Build Coastguard Worker                    kDontClearMessage.size());
62*598139dcSAndroid Build Coastguard Worker }
63*598139dcSAndroid Build Coastguard Worker 
64*598139dcSAndroid Build Coastguard Worker struct TestEntry {
65*598139dcSAndroid Build Coastguard Worker     uint32_t uid;
66*598139dcSAndroid Build Coastguard Worker     uint32_t pid;
67*598139dcSAndroid Build Coastguard Worker     uint32_t tid;
68*598139dcSAndroid Build Coastguard Worker     uint64_t sequence;
69*598139dcSAndroid Build Coastguard Worker     log_time realtime;
70*598139dcSAndroid Build Coastguard Worker     std::string msg;
71*598139dcSAndroid Build Coastguard Worker };
72*598139dcSAndroid Build Coastguard Worker 
CreateChunk(size_t max_size,const std::vector<TestEntry> & entries,bool finish_writing)73*598139dcSAndroid Build Coastguard Worker SerializedLogChunk CreateChunk(size_t max_size, const std::vector<TestEntry>& entries,
74*598139dcSAndroid Build Coastguard Worker                                bool finish_writing) {
75*598139dcSAndroid Build Coastguard Worker     SerializedLogChunk chunk(max_size / SerializedLogBuffer::kChunkSizeDivisor);
76*598139dcSAndroid Build Coastguard Worker 
77*598139dcSAndroid Build Coastguard Worker     for (const auto& entry : entries) {
78*598139dcSAndroid Build Coastguard Worker         if (!chunk.CanLog(sizeof(SerializedLogEntry) + entry.msg.size())) {
79*598139dcSAndroid Build Coastguard Worker             EXPECT_TRUE(false) << "Test set up failure, entries don't fit in chunks";
80*598139dcSAndroid Build Coastguard Worker             return chunk;
81*598139dcSAndroid Build Coastguard Worker         }
82*598139dcSAndroid Build Coastguard Worker         chunk.Log(entry.sequence, entry.realtime, entry.uid, entry.pid, entry.tid, entry.msg.data(),
83*598139dcSAndroid Build Coastguard Worker                   entry.msg.size());
84*598139dcSAndroid Build Coastguard Worker     }
85*598139dcSAndroid Build Coastguard Worker     if (finish_writing) {
86*598139dcSAndroid Build Coastguard Worker         chunk.FinishWriting();
87*598139dcSAndroid Build Coastguard Worker     }
88*598139dcSAndroid Build Coastguard Worker     return chunk;
89*598139dcSAndroid Build Coastguard Worker }
90*598139dcSAndroid Build Coastguard Worker 
VerifyChunks(const std::list<SerializedLogChunk> & expected,const std::list<SerializedLogChunk> & chunks)91*598139dcSAndroid Build Coastguard Worker void VerifyChunks(const std::list<SerializedLogChunk>& expected,
92*598139dcSAndroid Build Coastguard Worker                   const std::list<SerializedLogChunk>& chunks) {
93*598139dcSAndroid Build Coastguard Worker     int chunk = 0;
94*598139dcSAndroid Build Coastguard Worker     auto expected_it = expected.begin();
95*598139dcSAndroid Build Coastguard Worker     auto it = chunks.begin();
96*598139dcSAndroid Build Coastguard Worker     for (; expected_it != expected.end() && it != chunks.end(); ++expected_it, ++it, ++chunk) {
97*598139dcSAndroid Build Coastguard Worker         EXPECT_EQ(expected_it->reader_ref_count_, it->reader_ref_count_) << "chunk #" << chunk;
98*598139dcSAndroid Build Coastguard Worker         EXPECT_EQ(expected_it->writer_active_, it->writer_active_) << "chunk #" << chunk;
99*598139dcSAndroid Build Coastguard Worker         EXPECT_EQ(expected_it->highest_sequence_number_, it->highest_sequence_number_)
100*598139dcSAndroid Build Coastguard Worker                 << "chunk #" << chunk;
101*598139dcSAndroid Build Coastguard Worker         EXPECT_EQ(expected_it->readers_, it->readers_) << "chunk #" << chunk;
102*598139dcSAndroid Build Coastguard Worker 
103*598139dcSAndroid Build Coastguard Worker         ASSERT_EQ(expected_it->contents_.size(), it->contents_.size()) << "chunk #" << chunk;
104*598139dcSAndroid Build Coastguard Worker         ASSERT_EQ(expected_it->write_offset_, it->write_offset_) << "chunk #" << chunk;
105*598139dcSAndroid Build Coastguard Worker         if (expected_it->contents_.size() > 0) {
106*598139dcSAndroid Build Coastguard Worker             for (int i = 0; i < it->write_offset_; ++i) {
107*598139dcSAndroid Build Coastguard Worker                 EXPECT_EQ(expected_it->contents_.data()[i], it->contents_.data()[i])
108*598139dcSAndroid Build Coastguard Worker                         << "chunk #" << chunk;
109*598139dcSAndroid Build Coastguard Worker             }
110*598139dcSAndroid Build Coastguard Worker         }
111*598139dcSAndroid Build Coastguard Worker 
112*598139dcSAndroid Build Coastguard Worker         ASSERT_EQ(expected_it->compressed_log_.size(), it->compressed_log_.size())
113*598139dcSAndroid Build Coastguard Worker                 << "chunk #" << chunk;
114*598139dcSAndroid Build Coastguard Worker         if (expected_it->compressed_log_.size() > 0) {
115*598139dcSAndroid Build Coastguard Worker             for (size_t i = 0; i < it->compressed_log_.size(); ++i) {
116*598139dcSAndroid Build Coastguard Worker                 EXPECT_EQ(expected_it->compressed_log_.data()[i], it->compressed_log_.data()[i])
117*598139dcSAndroid Build Coastguard Worker                         << "chunk #" << chunk;
118*598139dcSAndroid Build Coastguard Worker             }
119*598139dcSAndroid Build Coastguard Worker         }
120*598139dcSAndroid Build Coastguard Worker     }
121*598139dcSAndroid Build Coastguard Worker     EXPECT_EQ(expected.end(), expected_it);
122*598139dcSAndroid Build Coastguard Worker     EXPECT_EQ(chunks.end(), it);
123*598139dcSAndroid Build Coastguard Worker }
124*598139dcSAndroid Build Coastguard Worker 
125*598139dcSAndroid Build Coastguard Worker // If no blocks are present before ClearLogsByUid() then no blocks should be output.
TEST(SerializedLogBuffer,uid_prune_no_blocks)126*598139dcSAndroid Build Coastguard Worker TEST(SerializedLogBuffer, uid_prune_no_blocks) {
127*598139dcSAndroid Build Coastguard Worker     const uid_t kClearUid = 555;
128*598139dcSAndroid Build Coastguard Worker     const size_t kMaxSize = kLogBufferMinSize;
129*598139dcSAndroid Build Coastguard Worker 
130*598139dcSAndroid Build Coastguard Worker     std::list<SerializedLogChunk> chunks;
131*598139dcSAndroid Build Coastguard Worker     std::list<SerializedLogChunk> expected_chunks;
132*598139dcSAndroid Build Coastguard Worker 
133*598139dcSAndroid Build Coastguard Worker     ClearLogsByUid(chunks, kClearUid, kMaxSize, LOG_ID_MAIN, nullptr);
134*598139dcSAndroid Build Coastguard Worker     VerifyChunks(expected_chunks, chunks);
135*598139dcSAndroid Build Coastguard Worker 
136*598139dcSAndroid Build Coastguard Worker     ClearLogsByUid(chunks, kClearUid, kMaxSize, LOG_ID_MAIN, nullptr);
137*598139dcSAndroid Build Coastguard Worker     VerifyChunks(expected_chunks, chunks);
138*598139dcSAndroid Build Coastguard Worker }
139*598139dcSAndroid Build Coastguard Worker 
140*598139dcSAndroid Build Coastguard Worker // If no UIDs to be cleared are found, then the _same exact_ block is returned.
TEST(SerializedLogBuffer,uid_prune_one_block_no_uid)141*598139dcSAndroid Build Coastguard Worker TEST(SerializedLogBuffer, uid_prune_one_block_no_uid) {
142*598139dcSAndroid Build Coastguard Worker     const uid_t kNonClearUid = 123;
143*598139dcSAndroid Build Coastguard Worker     const uid_t kClearUid = 555;
144*598139dcSAndroid Build Coastguard Worker     const size_t kMaxSize = kLogBufferMinSize;
145*598139dcSAndroid Build Coastguard Worker 
146*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> entries = {
147*598139dcSAndroid Build Coastguard Worker             {.uid = kNonClearUid,
148*598139dcSAndroid Build Coastguard Worker              .pid = 10,
149*598139dcSAndroid Build Coastguard Worker              .tid = 10,
150*598139dcSAndroid Build Coastguard Worker              .sequence = 1,
151*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
152*598139dcSAndroid Build Coastguard Worker              .msg = "some message"},
153*598139dcSAndroid Build Coastguard Worker     };
154*598139dcSAndroid Build Coastguard Worker 
155*598139dcSAndroid Build Coastguard Worker     std::list<SerializedLogChunk> chunks;
156*598139dcSAndroid Build Coastguard Worker     chunks.emplace_back(CreateChunk(kMaxSize, entries, false));
157*598139dcSAndroid Build Coastguard Worker     void* original_chunk_address = reinterpret_cast<void*>(&chunks.front());
158*598139dcSAndroid Build Coastguard Worker 
159*598139dcSAndroid Build Coastguard Worker     std::list<SerializedLogChunk> expected_chunks;
160*598139dcSAndroid Build Coastguard Worker     expected_chunks.push_back(CreateChunk(kMaxSize, entries, false));
161*598139dcSAndroid Build Coastguard Worker 
162*598139dcSAndroid Build Coastguard Worker     ClearLogsByUid(chunks, kClearUid, kMaxSize, LOG_ID_MAIN, nullptr);
163*598139dcSAndroid Build Coastguard Worker     VerifyChunks(expected_chunks, chunks);
164*598139dcSAndroid Build Coastguard Worker     void* after_clear_chunk_address = reinterpret_cast<void*>(&chunks.front());
165*598139dcSAndroid Build Coastguard Worker     EXPECT_EQ(original_chunk_address, after_clear_chunk_address);
166*598139dcSAndroid Build Coastguard Worker 
167*598139dcSAndroid Build Coastguard Worker     ClearLogsByUid(chunks, kClearUid, kMaxSize, LOG_ID_MAIN, nullptr);
168*598139dcSAndroid Build Coastguard Worker     VerifyChunks(expected_chunks, chunks);
169*598139dcSAndroid Build Coastguard Worker     after_clear_chunk_address = reinterpret_cast<void*>(&chunks.front());
170*598139dcSAndroid Build Coastguard Worker     EXPECT_EQ(original_chunk_address, after_clear_chunk_address);
171*598139dcSAndroid Build Coastguard Worker }
172*598139dcSAndroid Build Coastguard Worker 
FilterEntries(const std::vector<TestEntry> & entries,uid_t uid_to_remove)173*598139dcSAndroid Build Coastguard Worker std::vector<TestEntry> FilterEntries(const std::vector<TestEntry>& entries, uid_t uid_to_remove) {
174*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> filtered_entries;
175*598139dcSAndroid Build Coastguard Worker     for (const auto& entry : entries) {
176*598139dcSAndroid Build Coastguard Worker         if (entry.uid == uid_to_remove) {
177*598139dcSAndroid Build Coastguard Worker             continue;
178*598139dcSAndroid Build Coastguard Worker         }
179*598139dcSAndroid Build Coastguard Worker         filtered_entries.emplace_back(entry);
180*598139dcSAndroid Build Coastguard Worker     }
181*598139dcSAndroid Build Coastguard Worker     return filtered_entries;
182*598139dcSAndroid Build Coastguard Worker }
183*598139dcSAndroid Build Coastguard Worker 
TEST(SerializedLogBuffer,uid_prune_one_block_some_uid)184*598139dcSAndroid Build Coastguard Worker TEST(SerializedLogBuffer, uid_prune_one_block_some_uid) {
185*598139dcSAndroid Build Coastguard Worker     const uid_t kNonClearUid = 123;
186*598139dcSAndroid Build Coastguard Worker     const uid_t kClearUid = 555;
187*598139dcSAndroid Build Coastguard Worker     const size_t kMaxSize = kLogBufferMinSize;
188*598139dcSAndroid Build Coastguard Worker 
189*598139dcSAndroid Build Coastguard Worker     std::list<SerializedLogChunk> chunks;
190*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> entries = {
191*598139dcSAndroid Build Coastguard Worker             {.uid = kNonClearUid,
192*598139dcSAndroid Build Coastguard Worker              .pid = 10,
193*598139dcSAndroid Build Coastguard Worker              .tid = 10,
194*598139dcSAndroid Build Coastguard Worker              .sequence = 1,
195*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
196*598139dcSAndroid Build Coastguard Worker              .msg = "some message"},
197*598139dcSAndroid Build Coastguard Worker             {.uid = kClearUid,
198*598139dcSAndroid Build Coastguard Worker              .pid = 10,
199*598139dcSAndroid Build Coastguard Worker              .tid = 10,
200*598139dcSAndroid Build Coastguard Worker              .sequence = 2,
201*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
202*598139dcSAndroid Build Coastguard Worker              .msg = "some cleared message"},
203*598139dcSAndroid Build Coastguard Worker     };
204*598139dcSAndroid Build Coastguard Worker     chunks.emplace_back(CreateChunk(kMaxSize, entries, false));
205*598139dcSAndroid Build Coastguard Worker 
206*598139dcSAndroid Build Coastguard Worker     std::list<SerializedLogChunk> expected_chunks;
207*598139dcSAndroid Build Coastguard Worker     expected_chunks.emplace_back(CreateChunk(kMaxSize, FilterEntries(entries, kClearUid), false));
208*598139dcSAndroid Build Coastguard Worker 
209*598139dcSAndroid Build Coastguard Worker     ClearLogsByUid(chunks, kClearUid, kMaxSize, LOG_ID_MAIN, nullptr);
210*598139dcSAndroid Build Coastguard Worker     VerifyChunks(expected_chunks, chunks);
211*598139dcSAndroid Build Coastguard Worker 
212*598139dcSAndroid Build Coastguard Worker     ClearLogsByUid(chunks, kClearUid, kMaxSize, LOG_ID_MAIN, nullptr);
213*598139dcSAndroid Build Coastguard Worker     VerifyChunks(expected_chunks, chunks);
214*598139dcSAndroid Build Coastguard Worker }
215*598139dcSAndroid Build Coastguard Worker 
TEST(SerializedLogBuffer,uid_prune_one_block_all_uid)216*598139dcSAndroid Build Coastguard Worker TEST(SerializedLogBuffer, uid_prune_one_block_all_uid) {
217*598139dcSAndroid Build Coastguard Worker     const uid_t kClearUid = 555;
218*598139dcSAndroid Build Coastguard Worker     const size_t kMaxSize = kLogBufferMinSize;
219*598139dcSAndroid Build Coastguard Worker 
220*598139dcSAndroid Build Coastguard Worker     std::list<SerializedLogChunk> chunks;
221*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> entries = {
222*598139dcSAndroid Build Coastguard Worker             {.uid = kClearUid,
223*598139dcSAndroid Build Coastguard Worker              .pid = 10,
224*598139dcSAndroid Build Coastguard Worker              .tid = 10,
225*598139dcSAndroid Build Coastguard Worker              .sequence = 1,
226*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
227*598139dcSAndroid Build Coastguard Worker              .msg = "some message"},
228*598139dcSAndroid Build Coastguard Worker             {.uid = kClearUid,
229*598139dcSAndroid Build Coastguard Worker              .pid = 10,
230*598139dcSAndroid Build Coastguard Worker              .tid = 10,
231*598139dcSAndroid Build Coastguard Worker              .sequence = 2,
232*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
233*598139dcSAndroid Build Coastguard Worker              .msg = "some cleared message"},
234*598139dcSAndroid Build Coastguard Worker     };
235*598139dcSAndroid Build Coastguard Worker     chunks.emplace_back(CreateChunk(kMaxSize, entries, false));
236*598139dcSAndroid Build Coastguard Worker 
237*598139dcSAndroid Build Coastguard Worker     std::list<SerializedLogChunk> expected_chunks;
238*598139dcSAndroid Build Coastguard Worker     expected_chunks.emplace_back(CreateChunk(kMaxSize, {}, false));
239*598139dcSAndroid Build Coastguard Worker 
240*598139dcSAndroid Build Coastguard Worker     ClearLogsByUid(chunks, kClearUid, kMaxSize, LOG_ID_MAIN, nullptr);
241*598139dcSAndroid Build Coastguard Worker     VerifyChunks(expected_chunks, chunks);
242*598139dcSAndroid Build Coastguard Worker 
243*598139dcSAndroid Build Coastguard Worker     ClearLogsByUid(chunks, kClearUid, kMaxSize, LOG_ID_MAIN, nullptr);
244*598139dcSAndroid Build Coastguard Worker     VerifyChunks(expected_chunks, chunks);
245*598139dcSAndroid Build Coastguard Worker }
246*598139dcSAndroid Build Coastguard Worker 
TEST(SerializedLogBuffer,uid_prune_first_middle_last_chunks)247*598139dcSAndroid Build Coastguard Worker TEST(SerializedLogBuffer, uid_prune_first_middle_last_chunks) {
248*598139dcSAndroid Build Coastguard Worker     const uid_t kNonClearUid = 123;
249*598139dcSAndroid Build Coastguard Worker     const uid_t kClearUid = 555;
250*598139dcSAndroid Build Coastguard Worker     const std::string kMsg = "constant log message";
251*598139dcSAndroid Build Coastguard Worker     const size_t kMaxSize =
252*598139dcSAndroid Build Coastguard Worker             (sizeof(SerializedLogEntry) + kMsg.size()) * SerializedLogBuffer::kChunkSizeDivisor;
253*598139dcSAndroid Build Coastguard Worker 
254*598139dcSAndroid Build Coastguard Worker     std::list<SerializedLogChunk> chunks;
255*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> entries0 = {
256*598139dcSAndroid Build Coastguard Worker             {.uid = kClearUid,
257*598139dcSAndroid Build Coastguard Worker              .pid = 10,
258*598139dcSAndroid Build Coastguard Worker              .tid = 10,
259*598139dcSAndroid Build Coastguard Worker              .sequence = 1,
260*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
261*598139dcSAndroid Build Coastguard Worker              .msg = kMsg},
262*598139dcSAndroid Build Coastguard Worker     };
263*598139dcSAndroid Build Coastguard Worker     chunks.emplace_back(CreateChunk(kMaxSize, entries0, true));
264*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> entries1 = {
265*598139dcSAndroid Build Coastguard Worker             {.uid = kNonClearUid,
266*598139dcSAndroid Build Coastguard Worker              .pid = 10,
267*598139dcSAndroid Build Coastguard Worker              .tid = 10,
268*598139dcSAndroid Build Coastguard Worker              .sequence = 2,
269*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
270*598139dcSAndroid Build Coastguard Worker              .msg = kMsg},
271*598139dcSAndroid Build Coastguard Worker     };
272*598139dcSAndroid Build Coastguard Worker     chunks.emplace_back(CreateChunk(kMaxSize, entries1, true));
273*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> entries2 = {
274*598139dcSAndroid Build Coastguard Worker             {.uid = kClearUid,
275*598139dcSAndroid Build Coastguard Worker              .pid = 10,
276*598139dcSAndroid Build Coastguard Worker              .tid = 10,
277*598139dcSAndroid Build Coastguard Worker              .sequence = 3,
278*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
279*598139dcSAndroid Build Coastguard Worker              .msg = kMsg},
280*598139dcSAndroid Build Coastguard Worker     };
281*598139dcSAndroid Build Coastguard Worker     chunks.emplace_back(CreateChunk(kMaxSize, entries2, true));
282*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> entries3 = {
283*598139dcSAndroid Build Coastguard Worker             {.uid = kNonClearUid,
284*598139dcSAndroid Build Coastguard Worker              .pid = 10,
285*598139dcSAndroid Build Coastguard Worker              .tid = 10,
286*598139dcSAndroid Build Coastguard Worker              .sequence = 4,
287*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
288*598139dcSAndroid Build Coastguard Worker              .msg = kMsg},
289*598139dcSAndroid Build Coastguard Worker     };
290*598139dcSAndroid Build Coastguard Worker     chunks.emplace_back(CreateChunk(kMaxSize, entries3, true));
291*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> entries4 = {
292*598139dcSAndroid Build Coastguard Worker             {.uid = kClearUid,
293*598139dcSAndroid Build Coastguard Worker              .pid = 10,
294*598139dcSAndroid Build Coastguard Worker              .tid = 10,
295*598139dcSAndroid Build Coastguard Worker              .sequence = 5,
296*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
297*598139dcSAndroid Build Coastguard Worker              .msg = kMsg},
298*598139dcSAndroid Build Coastguard Worker     };
299*598139dcSAndroid Build Coastguard Worker     chunks.emplace_back(CreateChunk(kMaxSize, entries4, false));
300*598139dcSAndroid Build Coastguard Worker 
301*598139dcSAndroid Build Coastguard Worker     std::list<SerializedLogChunk> expected_chunks;
302*598139dcSAndroid Build Coastguard Worker     expected_chunks.emplace_back(CreateChunk(kMaxSize, entries1, true));
303*598139dcSAndroid Build Coastguard Worker     expected_chunks.emplace_back(CreateChunk(kMaxSize, entries3, false));
304*598139dcSAndroid Build Coastguard Worker 
305*598139dcSAndroid Build Coastguard Worker     ClearLogsByUid(chunks, kClearUid, kMaxSize, LOG_ID_MAIN, nullptr);
306*598139dcSAndroid Build Coastguard Worker     VerifyChunks(expected_chunks, chunks);
307*598139dcSAndroid Build Coastguard Worker 
308*598139dcSAndroid Build Coastguard Worker     ClearLogsByUid(chunks, kClearUid, kMaxSize, LOG_ID_MAIN, nullptr);
309*598139dcSAndroid Build Coastguard Worker     VerifyChunks(expected_chunks, chunks);
310*598139dcSAndroid Build Coastguard Worker }
311*598139dcSAndroid Build Coastguard Worker 
TEST(SerializedLogBuffer,uid_prune_coalesce)312*598139dcSAndroid Build Coastguard Worker TEST(SerializedLogBuffer, uid_prune_coalesce) {
313*598139dcSAndroid Build Coastguard Worker     const uid_t kNonClearUid = 123;
314*598139dcSAndroid Build Coastguard Worker     const uid_t kClearUid = 555;
315*598139dcSAndroid Build Coastguard Worker     const std::string kMsg = "constant log message";
316*598139dcSAndroid Build Coastguard Worker     const size_t kMaxSize =
317*598139dcSAndroid Build Coastguard Worker             (sizeof(SerializedLogEntry) + kMsg.size()) * SerializedLogBuffer::kChunkSizeDivisor * 2;
318*598139dcSAndroid Build Coastguard Worker 
319*598139dcSAndroid Build Coastguard Worker     std::list<SerializedLogChunk> chunks;
320*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> entries0 = {
321*598139dcSAndroid Build Coastguard Worker             {.uid = kNonClearUid,
322*598139dcSAndroid Build Coastguard Worker              .pid = 10,
323*598139dcSAndroid Build Coastguard Worker              .tid = 10,
324*598139dcSAndroid Build Coastguard Worker              .sequence = 1,
325*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
326*598139dcSAndroid Build Coastguard Worker              .msg = kMsg},
327*598139dcSAndroid Build Coastguard Worker             {.uid = kNonClearUid,
328*598139dcSAndroid Build Coastguard Worker              .pid = 10,
329*598139dcSAndroid Build Coastguard Worker              .tid = 10,
330*598139dcSAndroid Build Coastguard Worker              .sequence = 2,
331*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
332*598139dcSAndroid Build Coastguard Worker              .msg = kMsg},
333*598139dcSAndroid Build Coastguard Worker     };
334*598139dcSAndroid Build Coastguard Worker     chunks.emplace_back(CreateChunk(kMaxSize, entries0, true));
335*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> entries1 = {
336*598139dcSAndroid Build Coastguard Worker             {.uid = kNonClearUid,
337*598139dcSAndroid Build Coastguard Worker              .pid = 10,
338*598139dcSAndroid Build Coastguard Worker              .tid = 10,
339*598139dcSAndroid Build Coastguard Worker              .sequence = 3,
340*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
341*598139dcSAndroid Build Coastguard Worker              .msg = kMsg},
342*598139dcSAndroid Build Coastguard Worker             {.uid = kClearUid,
343*598139dcSAndroid Build Coastguard Worker              .pid = 10,
344*598139dcSAndroid Build Coastguard Worker              .tid = 10,
345*598139dcSAndroid Build Coastguard Worker              .sequence = 4,
346*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
347*598139dcSAndroid Build Coastguard Worker              .msg = kMsg},
348*598139dcSAndroid Build Coastguard Worker     };
349*598139dcSAndroid Build Coastguard Worker     chunks.emplace_back(CreateChunk(kMaxSize, entries1, true));
350*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> entries2 = {
351*598139dcSAndroid Build Coastguard Worker             {.uid = kClearUid,
352*598139dcSAndroid Build Coastguard Worker              .pid = 10,
353*598139dcSAndroid Build Coastguard Worker              .tid = 10,
354*598139dcSAndroid Build Coastguard Worker              .sequence = 5,
355*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
356*598139dcSAndroid Build Coastguard Worker              .msg = kMsg},
357*598139dcSAndroid Build Coastguard Worker             {.uid = kClearUid,
358*598139dcSAndroid Build Coastguard Worker              .pid = 10,
359*598139dcSAndroid Build Coastguard Worker              .tid = 10,
360*598139dcSAndroid Build Coastguard Worker              .sequence = 6,
361*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
362*598139dcSAndroid Build Coastguard Worker              .msg = kMsg},
363*598139dcSAndroid Build Coastguard Worker     };
364*598139dcSAndroid Build Coastguard Worker     chunks.emplace_back(CreateChunk(kMaxSize, entries2, true));
365*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> entries3 = {
366*598139dcSAndroid Build Coastguard Worker             {.uid = kNonClearUid,
367*598139dcSAndroid Build Coastguard Worker              .pid = 10,
368*598139dcSAndroid Build Coastguard Worker              .tid = 10,
369*598139dcSAndroid Build Coastguard Worker              .sequence = 7,
370*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
371*598139dcSAndroid Build Coastguard Worker              .msg = kMsg},
372*598139dcSAndroid Build Coastguard Worker             {.uid = kNonClearUid,
373*598139dcSAndroid Build Coastguard Worker              .pid = 10,
374*598139dcSAndroid Build Coastguard Worker              .tid = 10,
375*598139dcSAndroid Build Coastguard Worker              .sequence = 8,
376*598139dcSAndroid Build Coastguard Worker              .realtime = log_time(0, 1),
377*598139dcSAndroid Build Coastguard Worker              .msg = kMsg},
378*598139dcSAndroid Build Coastguard Worker     };
379*598139dcSAndroid Build Coastguard Worker     chunks.emplace_back(CreateChunk(kMaxSize, entries3, false));
380*598139dcSAndroid Build Coastguard Worker 
381*598139dcSAndroid Build Coastguard Worker     std::list<SerializedLogChunk> expected_chunks;
382*598139dcSAndroid Build Coastguard Worker     expected_chunks.emplace_back(CreateChunk(kMaxSize, entries0, true));
383*598139dcSAndroid Build Coastguard Worker 
384*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> expected_entries_1;
385*598139dcSAndroid Build Coastguard Worker     expected_entries_1.emplace_back(entries1[0]);
386*598139dcSAndroid Build Coastguard Worker     expected_entries_1.emplace_back(entries3[0]);
387*598139dcSAndroid Build Coastguard Worker     expected_chunks.emplace_back(CreateChunk(kMaxSize, expected_entries_1, true));
388*598139dcSAndroid Build Coastguard Worker 
389*598139dcSAndroid Build Coastguard Worker     std::vector<TestEntry> expected_entries_2;
390*598139dcSAndroid Build Coastguard Worker     expected_entries_2.emplace_back(entries3[1]);
391*598139dcSAndroid Build Coastguard Worker     expected_chunks.emplace_back(CreateChunk(kMaxSize, expected_entries_2, false));
392*598139dcSAndroid Build Coastguard Worker 
393*598139dcSAndroid Build Coastguard Worker     ClearLogsByUid(chunks, kClearUid, kMaxSize, LOG_ID_MAIN, nullptr);
394*598139dcSAndroid Build Coastguard Worker     VerifyChunks(expected_chunks, chunks);
395*598139dcSAndroid Build Coastguard Worker 
396*598139dcSAndroid Build Coastguard Worker     ClearLogsByUid(chunks, kClearUid, kMaxSize, LOG_ID_MAIN, nullptr);
397*598139dcSAndroid Build Coastguard Worker     VerifyChunks(expected_chunks, chunks);
398*598139dcSAndroid Build Coastguard Worker }
399