blob: d16619229c017a9112d7b7c7bbafe9c4533e07d2 [file] [log] [blame]
Primiano Tucci4f9b6d72017-12-05 20:59:16 +00001/*
2 * Copyright (C) 2017 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 "src/tracing/core/service_impl.h"
18
19#include <string.h>
20
21#include "gmock/gmock.h"
22#include "gtest/gtest.h"
Primiano Tucci2ffd1a52018-03-27 01:01:30 +010023#include "perfetto/base/file_utils.h"
24#include "perfetto/base/temp_file.h"
Primiano Tucci1a1951d2018-04-04 21:08:16 +020025#include "perfetto/base/utils.h"
Sami Kyostila06487a22018-02-27 13:48:38 +000026#include "perfetto/tracing/core/consumer.h"
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000027#include "perfetto/tracing/core/data_source_config.h"
28#include "perfetto/tracing/core/data_source_descriptor.h"
29#include "perfetto/tracing/core/producer.h"
30#include "perfetto/tracing/core/shared_memory.h"
Sami Kyostila06487a22018-02-27 13:48:38 +000031#include "perfetto/tracing/core/trace_packet.h"
Primiano Tucci2ffd1a52018-03-27 01:01:30 +010032#include "perfetto/tracing/core/trace_writer.h"
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000033#include "src/base/test/test_task_runner.h"
Primiano Tuccidca727d2018-04-04 11:31:55 +020034#include "src/tracing/test/mock_consumer.h"
35#include "src/tracing/test/mock_producer.h"
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000036#include "src/tracing/test/test_shared_memory.h"
37
Primiano Tucci2ffd1a52018-03-27 01:01:30 +010038#include "perfetto/trace/test_event.pbzero.h"
39#include "perfetto/trace/trace.pb.h"
Primiano Tuccidca727d2018-04-04 11:31:55 +020040#include "perfetto/trace/trace_packet.pb.h"
Primiano Tucci2ffd1a52018-03-27 01:01:30 +010041#include "perfetto/trace/trace_packet.pbzero.h"
42
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000043using ::testing::_;
Primiano Tuccidca727d2018-04-04 11:31:55 +020044using ::testing::Contains;
Primiano Tucci1a1951d2018-04-04 21:08:16 +020045using ::testing::ElementsAreArray;
Primiano Tuccidca727d2018-04-04 11:31:55 +020046using ::testing::Eq;
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000047using ::testing::InSequence;
Primiano Tucci081d46a2018-02-28 11:09:43 +000048using ::testing::Invoke;
Primiano Tuccidca727d2018-04-04 11:31:55 +020049using ::testing::InvokeWithoutArgs;
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000050using ::testing::Mock;
Primiano Tuccidca727d2018-04-04 11:31:55 +020051using ::testing::Property;
52using ::testing::StrictMock;
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000053
Primiano Tuccidca727d2018-04-04 11:31:55 +020054namespace perfetto {
Sami Kyostila32e0b542018-02-14 08:55:43 +000055
Primiano Tucci1a1951d2018-04-04 21:08:16 +020056namespace {
57constexpr size_t kDefaultShmSizeKb = ServiceImpl::kDefaultShmSize / 1024;
58constexpr size_t kMaxShmSizeKb = ServiceImpl::kMaxShmSize / 1024;
59} // namespace
60
Sami Kyostila06487a22018-02-27 13:48:38 +000061class ServiceImplTest : public testing::Test {
62 public:
63 ServiceImplTest() {
64 auto shm_factory =
65 std::unique_ptr<SharedMemory::Factory>(new TestSharedMemory::Factory());
66 svc.reset(static_cast<ServiceImpl*>(
67 Service::CreateInstance(std::move(shm_factory), &task_runner)
68 .release()));
69 }
70
Primiano Tuccidca727d2018-04-04 11:31:55 +020071 std::unique_ptr<MockProducer> CreateMockProducer() {
72 return std::unique_ptr<MockProducer>(
73 new StrictMock<MockProducer>(&task_runner));
74 }
75
76 std::unique_ptr<MockConsumer> CreateMockConsumer() {
77 return std::unique_ptr<MockConsumer>(
78 new StrictMock<MockConsumer>(&task_runner));
79 }
80
Primiano Tucci1a1951d2018-04-04 21:08:16 +020081 ProducerID* last_producer_id() { return &svc->last_producer_id_; }
82
83 uid_t GetProducerUid(ProducerID producer_id) {
84 return svc->GetProducer(producer_id)->uid_;
85 }
86
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000087 base::TestTaskRunner task_runner;
Sami Kyostila06487a22018-02-27 13:48:38 +000088 std::unique_ptr<ServiceImpl> svc;
89};
90
91TEST_F(ServiceImplTest, RegisterAndUnregister) {
Primiano Tuccidca727d2018-04-04 11:31:55 +020092 std::unique_ptr<MockProducer> mock_producer_1 = CreateMockProducer();
93 std::unique_ptr<MockProducer> mock_producer_2 = CreateMockProducer();
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000094
Primiano Tuccidca727d2018-04-04 11:31:55 +020095 mock_producer_1->Connect(svc.get(), "mock_producer_1", 123u /* uid */);
96 mock_producer_2->Connect(svc.get(), "mock_producer_2", 456u /* uid */);
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000097
98 ASSERT_EQ(2u, svc->num_producers());
Primiano Tuccidca727d2018-04-04 11:31:55 +020099 ASSERT_EQ(mock_producer_1->endpoint(), svc->GetProducer(1));
100 ASSERT_EQ(mock_producer_2->endpoint(), svc->GetProducer(2));
Primiano Tucci1a1951d2018-04-04 21:08:16 +0200101 ASSERT_EQ(123u, GetProducerUid(1));
102 ASSERT_EQ(456u, GetProducerUid(2));
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000103
Primiano Tuccidca727d2018-04-04 11:31:55 +0200104 mock_producer_1->RegisterDataSource("foo");
105 mock_producer_2->RegisterDataSource("bar");
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000106
Primiano Tuccidca727d2018-04-04 11:31:55 +0200107 mock_producer_1->UnregisterDataSource("foo");
108 mock_producer_2->UnregisterDataSource("bar");
Primiano Tucci9daa4832018-03-28 23:28:17 +0100109
Primiano Tuccidca727d2018-04-04 11:31:55 +0200110 mock_producer_1.reset();
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000111 ASSERT_EQ(1u, svc->num_producers());
112 ASSERT_EQ(nullptr, svc->GetProducer(1));
113
Primiano Tuccidca727d2018-04-04 11:31:55 +0200114 mock_producer_2.reset();
115 ASSERT_EQ(nullptr, svc->GetProducer(2));
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000116
117 ASSERT_EQ(0u, svc->num_producers());
118}
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100119
Sami Kyostila06487a22018-02-27 13:48:38 +0000120TEST_F(ServiceImplTest, EnableAndDisableTracing) {
Primiano Tuccidca727d2018-04-04 11:31:55 +0200121 std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
122 consumer->Connect(svc.get());
Sami Kyostila06487a22018-02-27 13:48:38 +0000123
Primiano Tuccidca727d2018-04-04 11:31:55 +0200124 std::unique_ptr<MockProducer> producer = CreateMockProducer();
125 producer->Connect(svc.get(), "mock_producer");
126 producer->RegisterDataSource("data_source");
Sami Kyostila06487a22018-02-27 13:48:38 +0000127
Sami Kyostila06487a22018-02-27 13:48:38 +0000128 TraceConfig trace_config;
Primiano Tuccidca727d2018-04-04 11:31:55 +0200129 trace_config.add_buffers()->set_size_kb(128);
Sami Kyostila06487a22018-02-27 13:48:38 +0000130 auto* ds_config = trace_config.add_data_sources()->mutable_config();
Primiano Tuccidca727d2018-04-04 11:31:55 +0200131 ds_config->set_name("data_source");
132 consumer->EnableTracing(trace_config);
Sami Kyostila06487a22018-02-27 13:48:38 +0000133
Primiano Tuccidca727d2018-04-04 11:31:55 +0200134 producer->WaitForTracingSetup();
135 producer->WaitForDataSourceStart("data_source");
136
137 consumer->DisableTracing();
138 producer->WaitForDataSourceStop("data_source");
139 consumer->WaitForTracingDisabled();
Sami Kyostila06487a22018-02-27 13:48:38 +0000140}
141
Florian Mayer61c55482018-03-06 14:43:54 +0000142TEST_F(ServiceImplTest, LockdownMode) {
Primiano Tuccidca727d2018-04-04 11:31:55 +0200143 std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
144 consumer->Connect(svc.get());
145
146 std::unique_ptr<MockProducer> producer = CreateMockProducer();
147 producer->Connect(svc.get(), "mock_producer_sameuid", geteuid());
148 producer->RegisterDataSource("data_source");
Florian Mayer61c55482018-03-06 14:43:54 +0000149
150 TraceConfig trace_config;
Primiano Tuccidca727d2018-04-04 11:31:55 +0200151 trace_config.add_buffers()->set_size_kb(128);
152 auto* ds_config = trace_config.add_data_sources()->mutable_config();
153 ds_config->set_name("data_source");
Florian Mayer61c55482018-03-06 14:43:54 +0000154 trace_config.set_lockdown_mode(
155 TraceConfig::LockdownModeOperation::LOCKDOWN_SET);
Primiano Tuccidca727d2018-04-04 11:31:55 +0200156 consumer->EnableTracing(trace_config);
157
158 producer->WaitForTracingSetup();
159 producer->WaitForDataSourceStart("data_source");
160
161 std::unique_ptr<MockProducer> producer_otheruid = CreateMockProducer();
162 auto x = svc->ConnectProducer(producer_otheruid.get(), geteuid() + 1,
163 "mock_producer_ouid");
164 EXPECT_CALL(*producer_otheruid, OnConnect()).Times(0);
Florian Mayer61c55482018-03-06 14:43:54 +0000165 task_runner.RunUntilIdle();
Primiano Tuccidca727d2018-04-04 11:31:55 +0200166 Mock::VerifyAndClearExpectations(producer_otheruid.get());
Florian Mayer61c55482018-03-06 14:43:54 +0000167
Primiano Tuccidca727d2018-04-04 11:31:55 +0200168 consumer->DisableTracing();
169 consumer->FreeBuffers();
170 producer->WaitForDataSourceStop("data_source");
171 consumer->WaitForTracingDisabled();
Florian Mayer61c55482018-03-06 14:43:54 +0000172
173 trace_config.set_lockdown_mode(
174 TraceConfig::LockdownModeOperation::LOCKDOWN_CLEAR);
Primiano Tuccidca727d2018-04-04 11:31:55 +0200175 consumer->EnableTracing(trace_config);
176 producer->WaitForDataSourceStart("data_source");
Florian Mayer61c55482018-03-06 14:43:54 +0000177
Primiano Tuccidca727d2018-04-04 11:31:55 +0200178 std::unique_ptr<MockProducer> producer_otheruid2 = CreateMockProducer();
179 producer_otheruid->Connect(svc.get(), "mock_producer_ouid2", geteuid() + 1);
Florian Mayer61c55482018-03-06 14:43:54 +0000180
Primiano Tuccidca727d2018-04-04 11:31:55 +0200181 consumer->DisableTracing();
182 producer->WaitForDataSourceStop("data_source");
183 consumer->WaitForTracingDisabled();
Florian Mayer61c55482018-03-06 14:43:54 +0000184}
185
Sami Kyostila06487a22018-02-27 13:48:38 +0000186TEST_F(ServiceImplTest, DisconnectConsumerWhileTracing) {
Primiano Tuccidca727d2018-04-04 11:31:55 +0200187 std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
188 consumer->Connect(svc.get());
Sami Kyostila06487a22018-02-27 13:48:38 +0000189
Primiano Tuccidca727d2018-04-04 11:31:55 +0200190 std::unique_ptr<MockProducer> producer = CreateMockProducer();
191 producer->Connect(svc.get(), "mock_producer");
192 producer->RegisterDataSource("data_source");
Sami Kyostila06487a22018-02-27 13:48:38 +0000193
Primiano Tuccidca727d2018-04-04 11:31:55 +0200194 TraceConfig trace_config;
195 trace_config.add_buffers()->set_size_kb(128);
196 auto* ds_config = trace_config.add_data_sources()->mutable_config();
197 ds_config->set_name("data_source");
198 consumer->EnableTracing(trace_config);
199
200 producer->WaitForTracingSetup();
201 producer->WaitForDataSourceStart("data_source");
Sami Kyostila06487a22018-02-27 13:48:38 +0000202
203 // Disconnecting the consumer while tracing should trigger data source
204 // teardown.
Primiano Tuccidca727d2018-04-04 11:31:55 +0200205 consumer.reset();
206 producer->WaitForDataSourceStop("data_source");
Sami Kyostila06487a22018-02-27 13:48:38 +0000207}
208
209TEST_F(ServiceImplTest, ReconnectProducerWhileTracing) {
Primiano Tuccidca727d2018-04-04 11:31:55 +0200210 std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
211 consumer->Connect(svc.get());
Sami Kyostila06487a22018-02-27 13:48:38 +0000212
Primiano Tuccidca727d2018-04-04 11:31:55 +0200213 std::unique_ptr<MockProducer> producer = CreateMockProducer();
214 producer->Connect(svc.get(), "mock_producer");
215 producer->RegisterDataSource("data_source");
Sami Kyostila06487a22018-02-27 13:48:38 +0000216
Sami Kyostila06487a22018-02-27 13:48:38 +0000217 TraceConfig trace_config;
Primiano Tuccidca727d2018-04-04 11:31:55 +0200218 trace_config.add_buffers()->set_size_kb(128);
Sami Kyostila06487a22018-02-27 13:48:38 +0000219 auto* ds_config = trace_config.add_data_sources()->mutable_config();
Primiano Tuccidca727d2018-04-04 11:31:55 +0200220 ds_config->set_name("data_source");
221 consumer->EnableTracing(trace_config);
Sami Kyostila06487a22018-02-27 13:48:38 +0000222
Primiano Tuccidca727d2018-04-04 11:31:55 +0200223 producer->WaitForTracingSetup();
224 producer->WaitForDataSourceStart("data_source");
Sami Kyostila06487a22018-02-27 13:48:38 +0000225
Primiano Tuccidca727d2018-04-04 11:31:55 +0200226 // Disconnecting and reconnecting a producer with a matching data source.
227 // The Producer should see that data source getting enabled again.
228 producer.reset();
229 producer = CreateMockProducer();
230 producer->Connect(svc.get(), "mock_producer_2");
231 producer->RegisterDataSource("data_source");
232 producer->WaitForTracingSetup();
233 producer->WaitForDataSourceStart("data_source");
Sami Kyostila06487a22018-02-27 13:48:38 +0000234}
235
Primiano Tucci081d46a2018-02-28 11:09:43 +0000236TEST_F(ServiceImplTest, ProducerIDWrapping) {
Primiano Tuccidca727d2018-04-04 11:31:55 +0200237 std::vector<std::unique_ptr<MockProducer>> producers;
238 producers.push_back(nullptr);
Primiano Tucci081d46a2018-02-28 11:09:43 +0000239
Primiano Tuccidca727d2018-04-04 11:31:55 +0200240 auto connect_producer_and_get_id = [&producers,
241 this](const std::string& name) {
242 producers.emplace_back(CreateMockProducer());
243 producers.back()->Connect(svc.get(), "mock_producer_" + name);
Primiano Tucci1a1951d2018-04-04 21:08:16 +0200244 return *last_producer_id();
Primiano Tucci081d46a2018-02-28 11:09:43 +0000245 };
246
247 // Connect producers 1-4.
248 for (ProducerID i = 1; i <= 4; i++)
Primiano Tuccidca727d2018-04-04 11:31:55 +0200249 ASSERT_EQ(i, connect_producer_and_get_id(std::to_string(i)));
Primiano Tucci081d46a2018-02-28 11:09:43 +0000250
251 // Disconnect producers 1,3.
Primiano Tuccidca727d2018-04-04 11:31:55 +0200252 producers[1].reset();
253 producers[3].reset();
Primiano Tucci081d46a2018-02-28 11:09:43 +0000254
Primiano Tucci1a1951d2018-04-04 21:08:16 +0200255 *last_producer_id() = kMaxProducerID - 1;
Primiano Tuccidca727d2018-04-04 11:31:55 +0200256 ASSERT_EQ(kMaxProducerID, connect_producer_and_get_id("maxid"));
257 ASSERT_EQ(1u, connect_producer_and_get_id("1_again"));
258 ASSERT_EQ(3u, connect_producer_and_get_id("3_again"));
259 ASSERT_EQ(5u, connect_producer_and_get_id("5"));
260 ASSERT_EQ(6u, connect_producer_and_get_id("6"));
Primiano Tucci081d46a2018-02-28 11:09:43 +0000261}
262
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100263TEST_F(ServiceImplTest, WriteIntoFileAndStopOnMaxSize) {
Primiano Tuccidca727d2018-04-04 11:31:55 +0200264 std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
265 consumer->Connect(svc.get());
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100266
Primiano Tuccidca727d2018-04-04 11:31:55 +0200267 std::unique_ptr<MockProducer> producer = CreateMockProducer();
268 producer->Connect(svc.get(), "mock_producer");
269 producer->RegisterDataSource("data_source");
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100270
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100271 TraceConfig trace_config;
272 trace_config.add_buffers()->set_size_kb(4096);
273 auto* ds_config = trace_config.add_data_sources()->mutable_config();
Primiano Tuccidca727d2018-04-04 11:31:55 +0200274 ds_config->set_name("data_source");
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100275 ds_config->set_target_buffer(0);
276 trace_config.set_write_into_file(true);
277 trace_config.set_file_write_period_ms(1);
278 const uint64_t kMaxFileSize = 512;
279 trace_config.set_max_file_size_bytes(kMaxFileSize);
280 base::TempFile tmp_file = base::TempFile::Create();
Primiano Tuccidca727d2018-04-04 11:31:55 +0200281 consumer->EnableTracing(trace_config, base::ScopedFile(dup(tmp_file.fd())));
282
283 producer->WaitForTracingSetup();
284 producer->WaitForDataSourceStart("data_source");
285
286 static const char kPayload[] = "1234567890abcdef-";
287 static const int kNumPackets = 10;
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100288
289 std::unique_ptr<TraceWriter> writer =
Primiano Tuccidca727d2018-04-04 11:31:55 +0200290 producer->CreateTraceWriter("data_source");
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100291 // All these packets should fit within kMaxFileSize.
292 for (int i = 0; i < kNumPackets; i++) {
293 auto tp = writer->NewTracePacket();
294 std::string payload(kPayload);
295 payload.append(std::to_string(i));
296 tp->set_for_testing()->set_str(payload.c_str(), payload.size());
297 }
298
299 // Finally add a packet that overflows kMaxFileSize. This should cause the
300 // implicit stop of the trace and should *not* be written in the trace.
301 {
302 auto tp = writer->NewTracePacket();
303 char big_payload[kMaxFileSize] = "BIG!";
304 tp->set_for_testing()->set_str(big_payload, sizeof(big_payload));
305 }
306 writer->Flush();
307 writer.reset();
308
Primiano Tuccidca727d2018-04-04 11:31:55 +0200309 consumer->DisableTracing();
310 producer->WaitForDataSourceStop("data_source");
311 consumer->WaitForTracingDisabled();
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100312
313 // Verify the contents of the file.
314 std::string trace_raw;
315 ASSERT_TRUE(base::ReadFile(tmp_file.path().c_str(), &trace_raw));
316 protos::Trace trace;
317 ASSERT_TRUE(trace.ParseFromString(trace_raw));
318 ASSERT_GE(trace.packet_size(), kNumPackets);
319 int num_testing_packet = 0;
320 for (int i = 0; i < trace.packet_size(); i++) {
321 const protos::TracePacket& tp = trace.packet(i);
322 if (!tp.has_for_testing())
323 continue;
324 ASSERT_EQ(kPayload + std::to_string(num_testing_packet++),
325 tp.for_testing().str());
326 }
Primiano Tuccidca727d2018-04-04 11:31:55 +0200327}
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100328
Primiano Tucci1a1951d2018-04-04 21:08:16 +0200329// Test the logic that allows the trace config to set the shm total size and
330// page size from the trace config. Also check that, if the config doesn't
331// specify a value we fall back on the hint provided by the producer.
332TEST_F(ServiceImplTest, ProducerShmAndPageSizeOverriddenByTraceConfig) {
333 std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
334 consumer->Connect(svc.get());
335 const size_t kConfigPageSizesKb[] = /****/ {16, 16, 4, 0, 16, 8, 3, 4096, 4};
336 const size_t kExpectedPageSizesKb[] = /**/ {16, 16, 4, 4, 16, 8, 4, 64, 4};
337
338 const size_t kConfigSizesKb[] = /**/ {0, 16, 0, 20, 32, 7, 0, 96, 4096000};
339 const size_t kHintSizesKb[] = /****/ {0, 0, 16, 32, 16, 0, 7, 96, 4096000};
340 const size_t kExpectedSizesKb[] = {
341 kDefaultShmSizeKb, // Both hint and config are 0, use default.
342 16, // Hint is 0, use config.
343 16, // Config is 0, use hint.
344 20, // Hint is takes precedence over the config.
345 32, // Ditto, even if config is higher than hint.
346 kDefaultShmSizeKb, // Config is invalid and hint is 0, use default.
347 kDefaultShmSizeKb, // Config is 0 and hint is invalid, use default.
348 kDefaultShmSizeKb, // 96 KB isn't a multiple of the page size (64 KB).
349 kMaxShmSizeKb // Too big, cap at kMaxShmSize.
350 };
351
352 const size_t kNumProducers = base::ArraySize(kHintSizesKb);
353 std::unique_ptr<MockProducer> producer[kNumProducers];
354 for (size_t i = 0; i < kNumProducers; i++) {
355 auto name = "mock_producer_" + std::to_string(i);
356 producer[i] = CreateMockProducer();
357 producer[i]->Connect(svc.get(), name, geteuid(), kHintSizesKb[i] * 1024);
358 producer[i]->RegisterDataSource("data_source");
359 }
360
361 TraceConfig trace_config;
362 trace_config.add_buffers()->set_size_kb(128);
363 auto* ds_config = trace_config.add_data_sources()->mutable_config();
364 ds_config->set_name("data_source");
365 for (size_t i = 0; i < kNumProducers; i++) {
366 auto* producer_config = trace_config.add_producers();
367 producer_config->set_producer_name("mock_producer_" + std::to_string(i));
368 producer_config->set_shm_size_kb(kConfigSizesKb[i]);
369 producer_config->set_page_size_kb(kConfigPageSizesKb[i]);
370 }
371
372 consumer->EnableTracing(trace_config);
373 size_t actual_shm_sizes_kb[kNumProducers]{};
374 size_t actual_page_sizes_kb[kNumProducers]{};
375 for (size_t i = 0; i < kNumProducers; i++) {
376 producer[i]->WaitForTracingSetup();
377 producer[i]->WaitForDataSourceStart("data_source");
378 actual_shm_sizes_kb[i] =
379 producer[i]->endpoint()->shared_memory()->size() / 1024;
380 actual_page_sizes_kb[i] =
381 producer[i]->endpoint()->shared_buffer_page_size_kb();
382 }
383 ASSERT_THAT(actual_page_sizes_kb, ElementsAreArray(kExpectedPageSizesKb));
384 ASSERT_THAT(actual_shm_sizes_kb, ElementsAreArray(kExpectedSizesKb));
385}
386
Primiano Tucci4f9b6d72017-12-05 20:59:16 +0000387} // namespace perfetto