blob: 289f65dd0153059c53c1f0a9710cd8a3ae03cf37 [file] [log] [blame]
Lalit Maganti79f2d7b2018-01-23 18:27:33 +00001/*
2 * Copyright (C) 2018 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
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000017#include <unistd.h>
18#include <chrono>
19#include <condition_variable>
20#include <functional>
Lalit Maganti3f5705c2018-03-09 12:09:44 +000021#include <random>
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000022#include <thread>
23
Lalit Magantibfc3d3e2018-03-22 20:28:38 +000024#include "gtest/gtest.h"
Primiano Tuccife922332018-03-22 16:15:04 -070025#include "perfetto/base/build_config.h"
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000026#include "perfetto/base/logging.h"
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000027#include "perfetto/traced/traced.h"
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000028#include "perfetto/tracing/core/trace_config.h"
29#include "perfetto/tracing/core/trace_packet.h"
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000030#include "src/base/test/test_task_runner.h"
Florian Mayerc29e0d32018-04-04 15:55:46 +010031#include "src/tracing/ipc/default_socket.h"
Florian Mayerc7255fd2018-01-25 10:29:24 +000032#include "test/task_runner_thread.h"
Lalit Maganti3f5705c2018-03-09 12:09:44 +000033#include "test/task_runner_thread_delegates.h"
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010034#include "test/test_helper.h"
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000035
Primiano Tucci07e104d2018-04-03 20:45:35 +020036#include "perfetto/trace/trace_packet.pb.h"
37#include "perfetto/trace/trace_packet.pbzero.h"
38
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000039namespace perfetto {
40
Lalit Magantid0e76792018-02-12 14:25:01 +000041// If we're building on Android and starting the daemons ourselves,
42// create the sockets in a world-writable location.
Oystein Eftevaagff729592018-02-12 14:24:06 -080043#if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) && \
44 PERFETTO_BUILDFLAG(PERFETTO_START_DAEMONS)
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000045#define TEST_PRODUCER_SOCK_NAME "/data/local/tmp/traced_producer"
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000046#else
Florian Mayerc29e0d32018-04-04 15:55:46 +010047#define TEST_PRODUCER_SOCK_NAME ::perfetto::GetProducerSocket()
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000048#endif
49
Lalit Maganti7d3e30a2018-02-16 10:20:36 +000050// TODO(b/73453011): reenable this on more platforms (including standalone
51// Android).
Primiano Tuccife922332018-03-22 16:15:04 -070052#if PERFETTO_BUILDFLAG(PERFETTO_ANDROID_BUILD)
Lalit Maganti7d3e30a2018-02-16 10:20:36 +000053#define MAYBE_TestFtraceProducer TestFtraceProducer
54#else
55#define MAYBE_TestFtraceProducer DISABLED_TestFtraceProducer
56#endif
Lalit Magantidd95ef92018-03-23 09:42:48 +000057TEST(PerfettoTest, MAYBE_TestFtraceProducer) {
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000058 base::TestTaskRunner task_runner;
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000059
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010060 TestHelper helper(&task_runner);
61 helper.StartServiceIfRequired();
Lalit Magantidd95ef92018-03-23 09:42:48 +000062
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010063#if PERFETTO_BUILDFLAG(PERFETTO_START_DAEMONS)
Lalit Magantidd95ef92018-03-23 09:42:48 +000064 TaskRunnerThread producer_thread("perfetto.prd");
65 producer_thread.Start(std::unique_ptr<ProbesProducerDelegate>(
66 new ProbesProducerDelegate(TEST_PRODUCER_SOCK_NAME)));
67#endif
68
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010069 helper.ConnectConsumer();
Lalit Maganti36557d82018-04-11 14:36:17 +010070 helper.WaitForConsumerConnect();
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010071
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000072 TraceConfig trace_config;
Lalit Magantibfc3d3e2018-03-22 20:28:38 +000073 trace_config.add_buffers()->set_size_kb(1024);
74 trace_config.set_duration_ms(3000);
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000075
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000076 auto* ds_config = trace_config.add_data_sources()->mutable_config();
Primiano Tucci578d7842018-03-29 15:27:05 +010077 ds_config->set_name("linux.ftrace");
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000078 ds_config->set_target_buffer(0);
79
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000080 auto* ftrace_config = ds_config->mutable_ftrace_config();
Hector Dearmand410c822018-02-23 15:46:18 +000081 *ftrace_config->add_ftrace_events() = "sched_switch";
82 *ftrace_config->add_ftrace_events() = "bar";
Lalit Maganti79f2d7b2018-01-23 18:27:33 +000083
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010084 helper.StartTracing(trace_config);
Lalit Maganti36557d82018-04-11 14:36:17 +010085 helper.WaitForTracingDisabled();
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010086
Lalit Maganti36557d82018-04-11 14:36:17 +010087 helper.ReadData();
88 helper.WaitForReadData();
89
90 const auto& packets = helper.trace();
91 ASSERT_GT(packets.size(), 0u);
92
93 for (const auto& packet : packets) {
Primiano Tucci07e104d2018-04-03 20:45:35 +020094 for (int ev = 0; ev < packet.ftrace_events().event_size(); ev++) {
95 ASSERT_TRUE(packet.ftrace_events().event(ev).has_sched_switch());
96 }
Lalit Maganti36557d82018-04-11 14:36:17 +010097 }
Lalit Magantidd95ef92018-03-23 09:42:48 +000098}
99
100TEST(PerfettoTest, TestFakeProducer) {
101 base::TestTaskRunner task_runner;
102
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100103 TestHelper helper(&task_runner);
104 helper.StartServiceIfRequired();
Lalit Maganti36557d82018-04-11 14:36:17 +0100105 helper.ConnectFakeProducer();
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100106 helper.ConnectConsumer();
Lalit Maganti36557d82018-04-11 14:36:17 +0100107 helper.WaitForConsumerConnect();
Lalit Maganti79f2d7b2018-01-23 18:27:33 +0000108
Lalit Maganti79f2d7b2018-01-23 18:27:33 +0000109 TraceConfig trace_config;
Lalit Magantibfc3d3e2018-03-22 20:28:38 +0000110 trace_config.add_buffers()->set_size_kb(1024);
Lalit Maganti79f2d7b2018-01-23 18:27:33 +0000111 trace_config.set_duration_ms(200);
112
Lalit Maganti79f2d7b2018-01-23 18:27:33 +0000113 auto* ds_config = trace_config.add_data_sources()->mutable_config();
114 ds_config->set_name("android.perfetto.FakeProducer");
115 ds_config->set_target_buffer(0);
116
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100117 static constexpr size_t kNumPackets = 10;
Lalit Maganti3f5705c2018-03-09 12:09:44 +0000118 static constexpr uint32_t kRandomSeed = 42;
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100119 static constexpr uint32_t kMsgSize = 1024;
Lalit Maganti3f5705c2018-03-09 12:09:44 +0000120 ds_config->mutable_for_testing()->set_seed(kRandomSeed);
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100121 ds_config->mutable_for_testing()->set_message_count(kNumPackets);
122 ds_config->mutable_for_testing()->set_message_size(kMsgSize);
Lalit Maganti36557d82018-04-11 14:36:17 +0100123 ds_config->mutable_for_testing()->set_send_batch_on_register(true);
Lalit Maganti3f5705c2018-03-09 12:09:44 +0000124
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100125 helper.StartTracing(trace_config);
Lalit Maganti36557d82018-04-11 14:36:17 +0100126 helper.WaitForTracingDisabled();
Lalit Maganti3f5705c2018-03-09 12:09:44 +0000127
Lalit Maganti36557d82018-04-11 14:36:17 +0100128 helper.ReadData();
129 helper.WaitForReadData();
Lalit Magantibfc3d3e2018-03-22 20:28:38 +0000130
Lalit Maganti36557d82018-04-11 14:36:17 +0100131 const auto& packets = helper.trace();
132 ASSERT_EQ(packets.size(), kNumPackets);
133
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100134 std::minstd_rand0 rnd_engine(kRandomSeed);
Lalit Maganti36557d82018-04-11 14:36:17 +0100135 for (const auto& packet : packets) {
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100136 ASSERT_TRUE(packet.has_for_testing());
137 ASSERT_EQ(packet.for_testing().seq_value(), rnd_engine());
Lalit Maganti36557d82018-04-11 14:36:17 +0100138 }
Lalit Maganti79f2d7b2018-01-23 18:27:33 +0000139}
140
Primiano Tucci5ae66da2018-03-28 15:57:34 +0100141TEST(PerfettoTest, VeryLargePackets) {
142 base::TestTaskRunner task_runner;
143
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100144 TestHelper helper(&task_runner);
145 helper.StartServiceIfRequired();
Lalit Maganti36557d82018-04-11 14:36:17 +0100146 helper.ConnectFakeProducer();
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100147 helper.ConnectConsumer();
Lalit Maganti36557d82018-04-11 14:36:17 +0100148 helper.WaitForConsumerConnect();
Primiano Tucci5ae66da2018-03-28 15:57:34 +0100149
Primiano Tucci5ae66da2018-03-28 15:57:34 +0100150 TraceConfig trace_config;
151 trace_config.add_buffers()->set_size_kb(4096 * 10);
Lalit Maganti36557d82018-04-11 14:36:17 +0100152 trace_config.set_duration_ms(500);
Primiano Tucci5ae66da2018-03-28 15:57:34 +0100153
Primiano Tucci5ae66da2018-03-28 15:57:34 +0100154 auto* ds_config = trace_config.add_data_sources()->mutable_config();
155 ds_config->set_name("android.perfetto.FakeProducer");
156 ds_config->set_target_buffer(0);
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100157
158 static constexpr size_t kNumPackets = 5;
159 static constexpr uint32_t kRandomSeed = 42;
160 static constexpr uint32_t kMsgSize = 1024 * 1024 - 42;
Primiano Tucci5ae66da2018-03-28 15:57:34 +0100161 ds_config->mutable_for_testing()->set_seed(kRandomSeed);
162 ds_config->mutable_for_testing()->set_message_count(kNumPackets);
163 ds_config->mutable_for_testing()->set_message_size(kMsgSize);
Lalit Maganti36557d82018-04-11 14:36:17 +0100164 ds_config->mutable_for_testing()->set_send_batch_on_register(true);
Primiano Tucci5ae66da2018-03-28 15:57:34 +0100165
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100166 helper.StartTracing(trace_config);
Lalit Maganti36557d82018-04-11 14:36:17 +0100167 helper.WaitForTracingDisabled();
Primiano Tucci5ae66da2018-03-28 15:57:34 +0100168
Lalit Maganti36557d82018-04-11 14:36:17 +0100169 helper.ReadData();
170 helper.WaitForReadData();
Primiano Tucci5ae66da2018-03-28 15:57:34 +0100171
Lalit Maganti36557d82018-04-11 14:36:17 +0100172 const auto& packets = helper.trace();
173 ASSERT_EQ(packets.size(), kNumPackets);
174
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100175 std::minstd_rand0 rnd_engine(kRandomSeed);
Lalit Maganti36557d82018-04-11 14:36:17 +0100176 for (const auto& packet : packets) {
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100177 ASSERT_TRUE(packet.has_for_testing());
178 ASSERT_EQ(packet.for_testing().seq_value(), rnd_engine());
179 size_t msg_size = packet.for_testing().str().size();
180 ASSERT_EQ(kMsgSize, msg_size);
181 for (size_t i = 0; i < msg_size; i++)
182 ASSERT_EQ(i < msg_size - 1 ? '.' : 0, packet.for_testing().str()[i]);
Lalit Maganti36557d82018-04-11 14:36:17 +0100183 }
Primiano Tucci5ae66da2018-03-28 15:57:34 +0100184}
185
Lalit Maganti79f2d7b2018-01-23 18:27:33 +0000186} // namespace perfetto