blob: f8f08c78fddba360bea4e64ae4e344640cc8b2e6 [file] [log] [blame]
Vishnu Nair7891e962021-11-11 12:07:21 -08001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gmock/gmock.h>
18#include <gtest/gtest.h>
19
20#include <gui/SurfaceComposerClient.h>
Vishnu Nair81750622023-03-08 15:02:06 -080021#include <cstdint>
22#include "Client.h"
Vishnu Naira12c5c72024-08-28 15:42:17 -070023#include "Layer.h"
Vishnu Nair7891e962021-11-11 12:07:21 -080024
Vishnu Naircb565332023-03-14 21:10:55 -070025#include <layerproto/LayerProtoHeader.h>
Vishnu Nair81750622023-03-08 15:02:06 -080026#include "FrontEnd/LayerCreationArgs.h"
27#include "FrontEnd/Update.h"
Vishnu Naircb565332023-03-14 21:10:55 -070028#include "Tracing/LayerTracing.h"
Vishnu Nair7891e962021-11-11 12:07:21 -080029#include "Tracing/TransactionTracing.h"
30
31using namespace android::surfaceflinger;
32
33namespace android {
34
35class TransactionTracingTest : public testing::Test {
36protected:
Vishnu Nair0cc69e12021-11-18 09:05:49 -080037 static constexpr size_t SMALL_BUFFER_SIZE = 1024;
Dominik Laskowski46471e62022-01-14 15:34:03 -080038 TransactionTracing mTracing;
Vishnu Nair7891e962021-11-11 12:07:21 -080039
Vishnu Naird1f74982023-06-15 20:16:51 -070040 void flush() { mTracing.flush(); }
Kean Mariotti4ba343c2023-04-19 13:31:02 +000041 perfetto::protos::TransactionTraceFile writeToProto() { return mTracing.writeToProto(); }
Vishnu Nair7891e962021-11-11 12:07:21 -080042
Kean Mariotti4ba343c2023-04-19 13:31:02 +000043 perfetto::protos::TransactionTraceEntry bufferFront() {
Dominik Laskowski46471e62022-01-14 15:34:03 -080044 std::scoped_lock<std::mutex> lock(mTracing.mTraceLock);
Kean Mariotti4ba343c2023-04-19 13:31:02 +000045 perfetto::protos::TransactionTraceEntry entry;
Dominik Laskowski46471e62022-01-14 15:34:03 -080046 entry.ParseFromString(mTracing.mBuffer.front());
Vishnu Nair62863552021-12-10 13:34:48 -080047 return entry;
Vishnu Nair7891e962021-11-11 12:07:21 -080048 }
49
Vishnu Nair0cc69e12021-11-18 09:05:49 -080050 void queueAndCommitTransaction(int64_t vsyncId) {
Vishnu Nair81750622023-03-08 15:02:06 -080051 frontend::Update update;
Vishnu Nair0cc69e12021-11-18 09:05:49 -080052 TransactionState transaction;
53 transaction.id = static_cast<uint64_t>(vsyncId * 3);
54 transaction.originUid = 1;
55 transaction.originPid = 2;
Dominik Laskowski46471e62022-01-14 15:34:03 -080056 mTracing.addQueuedTransaction(transaction);
Vishnu Nair0cc69e12021-11-18 09:05:49 -080057 std::vector<TransactionState> transactions;
Vishnu Nair81750622023-03-08 15:02:06 -080058 update.transactions.emplace_back(transaction);
59 mTracing.addCommittedTransactions(vsyncId, 0, update, {}, false);
Vishnu Naird1f74982023-06-15 20:16:51 -070060 flush();
Vishnu Nair7891e962021-11-11 12:07:21 -080061 }
62
Kean Mariotti4ba343c2023-04-19 13:31:02 +000063 void verifyEntry(const perfetto::protos::TransactionTraceEntry& actualProto,
Dominik Laskowski46471e62022-01-14 15:34:03 -080064 const std::vector<TransactionState>& expectedTransactions,
Vishnu Nair7891e962021-11-11 12:07:21 -080065 int64_t expectedVsyncId) {
66 EXPECT_EQ(actualProto.vsync_id(), expectedVsyncId);
Vishnu Nair81750622023-03-08 15:02:06 -080067 ASSERT_EQ(actualProto.transactions().size(),
Vishnu Nair7891e962021-11-11 12:07:21 -080068 static_cast<int32_t>(expectedTransactions.size()));
69 for (uint32_t i = 0; i < expectedTransactions.size(); i++) {
Pablo Gamito23780be2023-04-18 08:30:00 +000070 const auto expectedTransaction = expectedTransactions[i];
71 const auto protoTransaction = actualProto.transactions(static_cast<int32_t>(i));
72 EXPECT_EQ(protoTransaction.transaction_id(), expectedTransaction.id);
73 EXPECT_EQ(protoTransaction.pid(), expectedTransaction.originPid);
74 for (uint32_t i = 0; i < expectedTransaction.mergedTransactionIds.size(); i++) {
75 EXPECT_EQ(protoTransaction.merged_transaction_ids(static_cast<int32_t>(i)),
76 expectedTransaction.mergedTransactionIds[i]);
77 }
Vishnu Nair7891e962021-11-11 12:07:21 -080078 }
79 }
Vishnu Nair81750622023-03-08 15:02:06 -080080
81 LayerCreationArgs getLayerCreationArgs(uint32_t layerId, uint32_t parentId,
82 uint32_t layerIdToMirror, uint32_t flags,
83 bool addToRoot) {
84 LayerCreationArgs args;
85 args.sequence = layerId;
86 args.parentId = parentId;
87 args.layerIdToMirror = layerIdToMirror;
88 args.flags = flags;
89 args.addToRoot = addToRoot;
90 return args;
91 }
Vishnu Nair7891e962021-11-11 12:07:21 -080092};
93
Vishnu Nair7891e962021-11-11 12:07:21 -080094TEST_F(TransactionTracingTest, addTransactions) {
Vishnu Nair7891e962021-11-11 12:07:21 -080095 std::vector<TransactionState> transactions;
96 transactions.reserve(100);
97 for (uint64_t i = 0; i < 100; i++) {
98 TransactionState transaction;
99 transaction.id = i;
100 transaction.originPid = static_cast<int32_t>(i);
Pablo Gamito23780be2023-04-18 08:30:00 +0000101 transaction.mergedTransactionIds = std::vector<uint64_t>{i + 100, i + 102};
Vishnu Nair7891e962021-11-11 12:07:21 -0800102 transactions.emplace_back(transaction);
Dominik Laskowski46471e62022-01-14 15:34:03 -0800103 mTracing.addQueuedTransaction(transaction);
Vishnu Nair7891e962021-11-11 12:07:21 -0800104 }
105
106 // Split incoming transactions into two and commit them in reverse order to test out of order
107 // commits.
Vishnu Nair7891e962021-11-11 12:07:21 -0800108 int64_t firstTransactionSetVsyncId = 42;
Vishnu Nair81750622023-03-08 15:02:06 -0800109 frontend::Update firstUpdate;
110 firstUpdate.transactions =
111 std::vector<TransactionState>(transactions.begin() + 50, transactions.end());
112 mTracing.addCommittedTransactions(firstTransactionSetVsyncId, 0, firstUpdate, {}, false);
Vishnu Nair7891e962021-11-11 12:07:21 -0800113
114 int64_t secondTransactionSetVsyncId = 43;
Vishnu Nair81750622023-03-08 15:02:06 -0800115 frontend::Update secondUpdate;
116 secondUpdate.transactions =
Vishnu Nair7891e962021-11-11 12:07:21 -0800117 std::vector<TransactionState>(transactions.begin(), transactions.begin() + 50);
Vishnu Nair81750622023-03-08 15:02:06 -0800118 mTracing.addCommittedTransactions(secondTransactionSetVsyncId, 0, secondUpdate, {}, false);
Vishnu Naird1f74982023-06-15 20:16:51 -0700119 flush();
Vishnu Nair7891e962021-11-11 12:07:21 -0800120
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000121 perfetto::protos::TransactionTraceFile proto = writeToProto();
Vishnu Nair81750622023-03-08 15:02:06 -0800122 ASSERT_EQ(proto.entry().size(), 2);
123 verifyEntry(proto.entry(0), firstUpdate.transactions, firstTransactionSetVsyncId);
124 verifyEntry(proto.entry(1), secondUpdate.transactions, secondTransactionSetVsyncId);
Vishnu Nair7891e962021-11-11 12:07:21 -0800125}
126
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800127class TransactionTracingLayerHandlingTest : public TransactionTracingTest {
128protected:
129 void SetUp() override {
Dominik Laskowski46471e62022-01-14 15:34:03 -0800130 mTracing.setBufferSize(SMALL_BUFFER_SIZE);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800131
Vishnu Nair81750622023-03-08 15:02:06 -0800132 // add layers and add some layer transaction
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800133 {
Vishnu Nair81750622023-03-08 15:02:06 -0800134 frontend::Update update;
Yi Kong01b81262024-08-12 07:30:15 +0800135 update.layerCreationArgs.emplace_back(
Vishnu Nair81750622023-03-08 15:02:06 -0800136 getLayerCreationArgs(mParentLayerId, /*parentId=*/UNASSIGNED_LAYER_ID,
137 /*layerIdToMirror=*/UNASSIGNED_LAYER_ID, /*flags=*/123,
Yi Kong01b81262024-08-12 07:30:15 +0800138 /*addToRoot=*/true));
139 update.layerCreationArgs.emplace_back(
Vishnu Nair81750622023-03-08 15:02:06 -0800140 getLayerCreationArgs(mChildLayerId, mParentLayerId,
141 /*layerIdToMirror=*/UNASSIGNED_LAYER_ID, /*flags=*/456,
Yi Kong01b81262024-08-12 07:30:15 +0800142 /*addToRoot=*/true));
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800143 TransactionState transaction;
144 transaction.id = 50;
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000145 ResolvedComposerState layerState;
Vishnu Nair81750622023-03-08 15:02:06 -0800146 layerState.layerId = mParentLayerId;
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800147 layerState.state.what = layer_state_t::eLayerChanged;
148 layerState.state.z = 42;
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000149 transaction.states.emplace_back(layerState);
150 ResolvedComposerState childState;
Vishnu Nair81750622023-03-08 15:02:06 -0800151 childState.layerId = mChildLayerId;
Vishnu Nair473838d2021-12-08 09:46:02 -0800152 childState.state.what = layer_state_t::eLayerChanged;
153 childState.state.z = 43;
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000154 transaction.states.emplace_back(childState);
Dominik Laskowski46471e62022-01-14 15:34:03 -0800155 mTracing.addQueuedTransaction(transaction);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800156
Vishnu Nair81750622023-03-08 15:02:06 -0800157 update.transactions.emplace_back(transaction);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800158 VSYNC_ID_FIRST_LAYER_CHANGE = ++mVsyncId;
Vishnu Nair81750622023-03-08 15:02:06 -0800159 mTracing.addCommittedTransactions(VSYNC_ID_FIRST_LAYER_CHANGE, 0, update, {}, false);
160
Vishnu Naird1f74982023-06-15 20:16:51 -0700161 flush();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800162 }
163
164 // add transactions that modify the layer state further so we can test that layer state
165 // gets merged
166 {
167 TransactionState transaction;
168 transaction.id = 51;
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000169 ResolvedComposerState layerState;
Vishnu Nair81750622023-03-08 15:02:06 -0800170 layerState.layerId = mParentLayerId;
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800171 layerState.state.what = layer_state_t::eLayerChanged | layer_state_t::ePositionChanged;
172 layerState.state.z = 41;
173 layerState.state.x = 22;
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000174 transaction.states.emplace_back(layerState);
Dominik Laskowski46471e62022-01-14 15:34:03 -0800175 mTracing.addQueuedTransaction(transaction);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800176
Vishnu Nair81750622023-03-08 15:02:06 -0800177 frontend::Update update;
178 update.transactions.emplace_back(transaction);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800179 VSYNC_ID_SECOND_LAYER_CHANGE = ++mVsyncId;
Vishnu Nair81750622023-03-08 15:02:06 -0800180 mTracing.addCommittedTransactions(VSYNC_ID_SECOND_LAYER_CHANGE, 0, update, {}, false);
Vishnu Naird1f74982023-06-15 20:16:51 -0700181 flush();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800182 }
183
184 // remove child layer
Dominik Laskowski46471e62022-01-14 15:34:03 -0800185 mTracing.onLayerRemoved(2);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800186 VSYNC_ID_CHILD_LAYER_REMOVED = ++mVsyncId;
187 queueAndCommitTransaction(VSYNC_ID_CHILD_LAYER_REMOVED);
188
189 // remove layer
Dominik Laskowski46471e62022-01-14 15:34:03 -0800190 mTracing.onLayerRemoved(1);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800191 queueAndCommitTransaction(++mVsyncId);
192 }
193
Vishnu Nair81750622023-03-08 15:02:06 -0800194 uint32_t mParentLayerId = 1;
195 uint32_t mChildLayerId = 2;
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800196 int64_t mVsyncId = 0;
197 int64_t VSYNC_ID_FIRST_LAYER_CHANGE;
198 int64_t VSYNC_ID_SECOND_LAYER_CHANGE;
199 int64_t VSYNC_ID_CHILD_LAYER_REMOVED;
200};
201
202TEST_F(TransactionTracingLayerHandlingTest, addStartingState) {
203 // add transactions until we drop the transaction with the first layer change
204 while (bufferFront().vsync_id() <= VSYNC_ID_FIRST_LAYER_CHANGE) {
205 queueAndCommitTransaction(++mVsyncId);
206 }
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000207 perfetto::protos::TransactionTraceFile proto = writeToProto();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800208 // verify we can still retrieve the layer change from the first entry containing starting
209 // states.
210 EXPECT_GT(proto.entry().size(), 0);
Vishnu Nair685cfef2022-02-02 10:01:25 -0800211 EXPECT_EQ(proto.entry(0).transactions().size(), 1);
212 EXPECT_EQ(proto.entry(0).added_layers().size(), 2);
Vishnu Nair473838d2021-12-08 09:46:02 -0800213 EXPECT_EQ(proto.entry(0).transactions(0).layer_changes().size(), 2);
214 EXPECT_EQ(proto.entry(0).transactions(0).layer_changes(0).layer_id(), mParentLayerId);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800215 EXPECT_EQ(proto.entry(0).transactions(0).layer_changes(0).z(), 42);
Vishnu Nair473838d2021-12-08 09:46:02 -0800216 EXPECT_EQ(proto.entry(0).transactions(0).layer_changes(1).layer_id(), mChildLayerId);
217 EXPECT_EQ(proto.entry(0).transactions(0).layer_changes(1).z(), 43);
Vishnu Nair7bebc9f2023-12-08 22:56:28 +0000218 EXPECT_TRUE(proto.entry(0).displays_changed());
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800219}
220
221TEST_F(TransactionTracingLayerHandlingTest, updateStartingState) {
222 // add transactions until we drop the transaction with the second layer change
223 while (bufferFront().vsync_id() <= VSYNC_ID_SECOND_LAYER_CHANGE) {
224 queueAndCommitTransaction(++mVsyncId);
225 }
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000226 perfetto::protos::TransactionTraceFile proto = writeToProto();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800227 // verify starting states are updated correctly
228 EXPECT_EQ(proto.entry(0).transactions(0).layer_changes(0).z(), 41);
Vishnu Nair7bebc9f2023-12-08 22:56:28 +0000229 EXPECT_TRUE(proto.entry(0).displays_changed());
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800230}
231
232TEST_F(TransactionTracingLayerHandlingTest, removeStartingState) {
233 // add transactions until we drop the transaction which removes the child layer
234 while (bufferFront().vsync_id() <= VSYNC_ID_CHILD_LAYER_REMOVED) {
235 queueAndCommitTransaction(++mVsyncId);
236 }
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000237 perfetto::protos::TransactionTraceFile proto = writeToProto();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800238 // verify the child layer has been removed from the trace
239 EXPECT_EQ(proto.entry(0).transactions(0).layer_changes().size(), 1);
240 EXPECT_EQ(proto.entry(0).transactions(0).layer_changes(0).layer_id(), mParentLayerId);
Vishnu Nair7bebc9f2023-12-08 22:56:28 +0000241 EXPECT_TRUE(proto.entry(0).displays_changed());
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800242}
243
244TEST_F(TransactionTracingLayerHandlingTest, startingStateSurvivesBufferFlush) {
245 // add transactions until we drop the transaction with the second layer change
246 while (bufferFront().vsync_id() <= VSYNC_ID_SECOND_LAYER_CHANGE) {
247 queueAndCommitTransaction(++mVsyncId);
248 }
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000249 perfetto::protos::TransactionTraceFile proto = writeToProto();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800250 // verify we have two starting states
251 EXPECT_EQ(proto.entry(0).transactions(0).layer_changes().size(), 2);
252
253 // Continue adding transactions until child layer is removed
254 while (bufferFront().vsync_id() <= VSYNC_ID_CHILD_LAYER_REMOVED) {
255 queueAndCommitTransaction(++mVsyncId);
256 }
257 proto = writeToProto();
258 // verify we still have the parent layer state
259 EXPECT_EQ(proto.entry(0).transactions(0).layer_changes().size(), 1);
260 EXPECT_EQ(proto.entry(0).transactions(0).layer_changes(0).layer_id(), mParentLayerId);
Vishnu Nair7bebc9f2023-12-08 22:56:28 +0000261 EXPECT_TRUE(proto.entry(0).displays_changed());
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800262}
263
Vishnu Nair84125ac2021-12-02 08:47:48 -0800264class TransactionTracingMirrorLayerTest : public TransactionTracingTest {
265protected:
266 void SetUp() override {
Dominik Laskowski46471e62022-01-14 15:34:03 -0800267 mTracing.setBufferSize(SMALL_BUFFER_SIZE);
Vishnu Nair84125ac2021-12-02 08:47:48 -0800268
Vishnu Nair81750622023-03-08 15:02:06 -0800269 // add layers and some layer transaction
Vishnu Nair84125ac2021-12-02 08:47:48 -0800270 {
Vishnu Nair81750622023-03-08 15:02:06 -0800271 frontend::Update update;
272 update.layerCreationArgs.emplace_back(
273 getLayerCreationArgs(mLayerId, /*parentId=*/UNASSIGNED_LAYER_ID,
274 /*layerIdToMirror=*/UNASSIGNED_LAYER_ID, /*flags=*/123,
275 /*addToRoot=*/true));
276 update.layerCreationArgs.emplace_back(
277 getLayerCreationArgs(mMirrorLayerId, UNASSIGNED_LAYER_ID,
278 /*layerIdToMirror=*/mLayerId, /*flags=*/0,
279 /*addToRoot=*/false));
280
Vishnu Nair84125ac2021-12-02 08:47:48 -0800281 TransactionState transaction;
282 transaction.id = 50;
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000283 ResolvedComposerState layerState;
Vishnu Nair81750622023-03-08 15:02:06 -0800284 layerState.layerId = mLayerId;
Vishnu Nair84125ac2021-12-02 08:47:48 -0800285 layerState.state.what = layer_state_t::eLayerChanged;
286 layerState.state.z = 42;
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000287 transaction.states.emplace_back(layerState);
288 ResolvedComposerState mirrorState;
Vishnu Nair81750622023-03-08 15:02:06 -0800289 mirrorState.layerId = mMirrorLayerId;
Vishnu Nair84125ac2021-12-02 08:47:48 -0800290 mirrorState.state.what = layer_state_t::eLayerChanged;
291 mirrorState.state.z = 43;
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000292 transaction.states.emplace_back(mirrorState);
Dominik Laskowski46471e62022-01-14 15:34:03 -0800293 mTracing.addQueuedTransaction(transaction);
Vishnu Nair84125ac2021-12-02 08:47:48 -0800294
Vishnu Nair81750622023-03-08 15:02:06 -0800295 update.transactions.emplace_back(transaction);
296 mTracing.addCommittedTransactions(mVsyncId, 0, update, {}, false);
Vishnu Naird1f74982023-06-15 20:16:51 -0700297 flush();
Vishnu Nair84125ac2021-12-02 08:47:48 -0800298 }
299 }
300
Vishnu Nair81750622023-03-08 15:02:06 -0800301 uint32_t mLayerId = 5;
302 uint32_t mMirrorLayerId = 55;
Vishnu Nair84125ac2021-12-02 08:47:48 -0800303 int64_t mVsyncId = 0;
304 int64_t VSYNC_ID_FIRST_LAYER_CHANGE;
305 int64_t VSYNC_ID_SECOND_LAYER_CHANGE;
306 int64_t VSYNC_ID_CHILD_LAYER_REMOVED;
307};
308
309TEST_F(TransactionTracingMirrorLayerTest, canAddMirrorLayers) {
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000310 perfetto::protos::TransactionTraceFile proto = writeToProto();
Vishnu Nair84125ac2021-12-02 08:47:48 -0800311 // We don't have any starting states since no layer was removed from.
Vishnu Nairb8f2a2d2022-01-13 08:10:10 -0800312 EXPECT_EQ(proto.entry().size(), 1);
Vishnu Nair84125ac2021-12-02 08:47:48 -0800313
314 // Verify the mirror layer was added
Vishnu Nairb8f2a2d2022-01-13 08:10:10 -0800315 EXPECT_EQ(proto.entry(0).transactions().size(), 1);
316 EXPECT_EQ(proto.entry(0).added_layers().size(), 2);
317 EXPECT_EQ(proto.entry(0).added_layers(1).layer_id(), mMirrorLayerId);
318 EXPECT_EQ(proto.entry(0).transactions(0).layer_changes().size(), 2);
319 EXPECT_EQ(proto.entry(0).transactions(0).layer_changes(1).z(), 43);
Vishnu Nair84125ac2021-12-02 08:47:48 -0800320}
Vishnu Naircb565332023-03-14 21:10:55 -0700321
322// Verify we can write the layers traces by entry to reduce mem pressure
323// on the system when generating large traces.
324TEST(LayerTraceTest, canStreamLayersTrace) {
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000325 perfetto::protos::LayersTraceFileProto inProto = LayerTracing::createTraceFileProto();
Vishnu Naircb565332023-03-14 21:10:55 -0700326 inProto.add_entry();
327 inProto.add_entry();
328
329 std::string output;
330 inProto.SerializeToString(&output);
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000331 perfetto::protos::LayersTraceFileProto inProto2 = LayerTracing::createTraceFileProto();
Vishnu Naircb565332023-03-14 21:10:55 -0700332 inProto2.add_entry();
333 std::string output2;
334 inProto2.SerializeToString(&output2);
335
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000336 perfetto::protos::LayersTraceFileProto outProto;
Vishnu Naircb565332023-03-14 21:10:55 -0700337 outProto.ParseFromString(output + output2);
338 // magic?
339 EXPECT_EQ(outProto.entry().size(), 3);
340}
Vishnu Nair7891e962021-11-11 12:07:21 -0800341} // namespace android