Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 1 | /* |
| 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 Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 17 | #include <unistd.h> |
| 18 | #include <chrono> |
| 19 | #include <condition_variable> |
| 20 | #include <functional> |
Lalit Maganti | 3f5705c | 2018-03-09 12:09:44 +0000 | [diff] [blame] | 21 | #include <random> |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 22 | #include <thread> |
| 23 | |
Lalit Maganti | bfc3d3e | 2018-03-22 20:28:38 +0000 | [diff] [blame] | 24 | #include "gtest/gtest.h" |
Primiano Tucci | fe92233 | 2018-03-22 16:15:04 -0700 | [diff] [blame] | 25 | #include "perfetto/base/build_config.h" |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 26 | #include "perfetto/base/logging.h" |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 27 | #include "perfetto/traced/traced.h" |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 28 | #include "perfetto/tracing/core/trace_config.h" |
| 29 | #include "perfetto/tracing/core/trace_packet.h" |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 30 | #include "src/base/test/test_task_runner.h" |
Florian Mayer | c29e0d3 | 2018-04-04 15:55:46 +0100 | [diff] [blame] | 31 | #include "src/tracing/ipc/default_socket.h" |
Florian Mayer | c7255fd | 2018-01-25 10:29:24 +0000 | [diff] [blame] | 32 | #include "test/task_runner_thread.h" |
Lalit Maganti | 3f5705c | 2018-03-09 12:09:44 +0000 | [diff] [blame] | 33 | #include "test/task_runner_thread_delegates.h" |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 34 | #include "test/test_helper.h" |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 35 | |
Primiano Tucci | 07e104d | 2018-04-03 20:45:35 +0200 | [diff] [blame] | 36 | #include "perfetto/trace/trace_packet.pb.h" |
| 37 | #include "perfetto/trace/trace_packet.pbzero.h" |
| 38 | |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 39 | namespace perfetto { |
| 40 | |
Lalit Maganti | d0e7679 | 2018-02-12 14:25:01 +0000 | [diff] [blame] | 41 | // If we're building on Android and starting the daemons ourselves, |
| 42 | // create the sockets in a world-writable location. |
Oystein Eftevaag | ff72959 | 2018-02-12 14:24:06 -0800 | [diff] [blame] | 43 | #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) && \ |
| 44 | PERFETTO_BUILDFLAG(PERFETTO_START_DAEMONS) |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 45 | #define TEST_PRODUCER_SOCK_NAME "/data/local/tmp/traced_producer" |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 46 | #else |
Florian Mayer | c29e0d3 | 2018-04-04 15:55:46 +0100 | [diff] [blame] | 47 | #define TEST_PRODUCER_SOCK_NAME ::perfetto::GetProducerSocket() |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 48 | #endif |
| 49 | |
Lalit Maganti | 7d3e30a | 2018-02-16 10:20:36 +0000 | [diff] [blame] | 50 | // TODO(b/73453011): reenable this on more platforms (including standalone |
| 51 | // Android). |
Primiano Tucci | fe92233 | 2018-03-22 16:15:04 -0700 | [diff] [blame] | 52 | #if PERFETTO_BUILDFLAG(PERFETTO_ANDROID_BUILD) |
Lalit Maganti | 7d3e30a | 2018-02-16 10:20:36 +0000 | [diff] [blame] | 53 | #define MAYBE_TestFtraceProducer TestFtraceProducer |
| 54 | #else |
| 55 | #define MAYBE_TestFtraceProducer DISABLED_TestFtraceProducer |
| 56 | #endif |
Lalit Maganti | dd95ef9 | 2018-03-23 09:42:48 +0000 | [diff] [blame] | 57 | TEST(PerfettoTest, MAYBE_TestFtraceProducer) { |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 58 | base::TestTaskRunner task_runner; |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 59 | |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 60 | TestHelper helper(&task_runner); |
| 61 | helper.StartServiceIfRequired(); |
Lalit Maganti | dd95ef9 | 2018-03-23 09:42:48 +0000 | [diff] [blame] | 62 | |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 63 | #if PERFETTO_BUILDFLAG(PERFETTO_START_DAEMONS) |
Lalit Maganti | dd95ef9 | 2018-03-23 09:42:48 +0000 | [diff] [blame] | 64 | TaskRunnerThread producer_thread("perfetto.prd"); |
| 65 | producer_thread.Start(std::unique_ptr<ProbesProducerDelegate>( |
| 66 | new ProbesProducerDelegate(TEST_PRODUCER_SOCK_NAME))); |
| 67 | #endif |
| 68 | |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 69 | helper.ConnectConsumer(); |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 70 | helper.WaitForConsumerConnect(); |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 71 | |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 72 | TraceConfig trace_config; |
Lalit Maganti | bfc3d3e | 2018-03-22 20:28:38 +0000 | [diff] [blame] | 73 | trace_config.add_buffers()->set_size_kb(1024); |
| 74 | trace_config.set_duration_ms(3000); |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 75 | |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 76 | auto* ds_config = trace_config.add_data_sources()->mutable_config(); |
Primiano Tucci | 578d784 | 2018-03-29 15:27:05 +0100 | [diff] [blame] | 77 | ds_config->set_name("linux.ftrace"); |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 78 | ds_config->set_target_buffer(0); |
| 79 | |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 80 | auto* ftrace_config = ds_config->mutable_ftrace_config(); |
Hector Dearman | d410c82 | 2018-02-23 15:46:18 +0000 | [diff] [blame] | 81 | *ftrace_config->add_ftrace_events() = "sched_switch"; |
| 82 | *ftrace_config->add_ftrace_events() = "bar"; |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 83 | |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 84 | helper.StartTracing(trace_config); |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 85 | helper.WaitForTracingDisabled(); |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 86 | |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 87 | 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 Tucci | 07e104d | 2018-04-03 20:45:35 +0200 | [diff] [blame] | 94 | for (int ev = 0; ev < packet.ftrace_events().event_size(); ev++) { |
| 95 | ASSERT_TRUE(packet.ftrace_events().event(ev).has_sched_switch()); |
| 96 | } |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 97 | } |
Lalit Maganti | dd95ef9 | 2018-03-23 09:42:48 +0000 | [diff] [blame] | 98 | } |
| 99 | |
| 100 | TEST(PerfettoTest, TestFakeProducer) { |
| 101 | base::TestTaskRunner task_runner; |
| 102 | |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 103 | TestHelper helper(&task_runner); |
| 104 | helper.StartServiceIfRequired(); |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 105 | helper.ConnectFakeProducer(); |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 106 | helper.ConnectConsumer(); |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 107 | helper.WaitForConsumerConnect(); |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 108 | |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 109 | TraceConfig trace_config; |
Lalit Maganti | bfc3d3e | 2018-03-22 20:28:38 +0000 | [diff] [blame] | 110 | trace_config.add_buffers()->set_size_kb(1024); |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 111 | trace_config.set_duration_ms(200); |
| 112 | |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 113 | 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 Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 117 | static constexpr size_t kNumPackets = 10; |
Lalit Maganti | 3f5705c | 2018-03-09 12:09:44 +0000 | [diff] [blame] | 118 | static constexpr uint32_t kRandomSeed = 42; |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 119 | static constexpr uint32_t kMsgSize = 1024; |
Lalit Maganti | 3f5705c | 2018-03-09 12:09:44 +0000 | [diff] [blame] | 120 | ds_config->mutable_for_testing()->set_seed(kRandomSeed); |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 121 | ds_config->mutable_for_testing()->set_message_count(kNumPackets); |
| 122 | ds_config->mutable_for_testing()->set_message_size(kMsgSize); |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 123 | ds_config->mutable_for_testing()->set_send_batch_on_register(true); |
Lalit Maganti | 3f5705c | 2018-03-09 12:09:44 +0000 | [diff] [blame] | 124 | |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 125 | helper.StartTracing(trace_config); |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 126 | helper.WaitForTracingDisabled(); |
Lalit Maganti | 3f5705c | 2018-03-09 12:09:44 +0000 | [diff] [blame] | 127 | |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 128 | helper.ReadData(); |
| 129 | helper.WaitForReadData(); |
Lalit Maganti | bfc3d3e | 2018-03-22 20:28:38 +0000 | [diff] [blame] | 130 | |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 131 | const auto& packets = helper.trace(); |
| 132 | ASSERT_EQ(packets.size(), kNumPackets); |
| 133 | |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 134 | std::minstd_rand0 rnd_engine(kRandomSeed); |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 135 | for (const auto& packet : packets) { |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 136 | ASSERT_TRUE(packet.has_for_testing()); |
| 137 | ASSERT_EQ(packet.for_testing().seq_value(), rnd_engine()); |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 138 | } |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 139 | } |
| 140 | |
Primiano Tucci | 5ae66da | 2018-03-28 15:57:34 +0100 | [diff] [blame] | 141 | TEST(PerfettoTest, VeryLargePackets) { |
| 142 | base::TestTaskRunner task_runner; |
| 143 | |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 144 | TestHelper helper(&task_runner); |
| 145 | helper.StartServiceIfRequired(); |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 146 | helper.ConnectFakeProducer(); |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 147 | helper.ConnectConsumer(); |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 148 | helper.WaitForConsumerConnect(); |
Primiano Tucci | 5ae66da | 2018-03-28 15:57:34 +0100 | [diff] [blame] | 149 | |
Primiano Tucci | 5ae66da | 2018-03-28 15:57:34 +0100 | [diff] [blame] | 150 | TraceConfig trace_config; |
| 151 | trace_config.add_buffers()->set_size_kb(4096 * 10); |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 152 | trace_config.set_duration_ms(500); |
Primiano Tucci | 5ae66da | 2018-03-28 15:57:34 +0100 | [diff] [blame] | 153 | |
Primiano Tucci | 5ae66da | 2018-03-28 15:57:34 +0100 | [diff] [blame] | 154 | 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 Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 157 | |
| 158 | static constexpr size_t kNumPackets = 5; |
| 159 | static constexpr uint32_t kRandomSeed = 42; |
| 160 | static constexpr uint32_t kMsgSize = 1024 * 1024 - 42; |
Primiano Tucci | 5ae66da | 2018-03-28 15:57:34 +0100 | [diff] [blame] | 161 | 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 Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 164 | ds_config->mutable_for_testing()->set_send_batch_on_register(true); |
Primiano Tucci | 5ae66da | 2018-03-28 15:57:34 +0100 | [diff] [blame] | 165 | |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 166 | helper.StartTracing(trace_config); |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 167 | helper.WaitForTracingDisabled(); |
Primiano Tucci | 5ae66da | 2018-03-28 15:57:34 +0100 | [diff] [blame] | 168 | |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 169 | helper.ReadData(); |
| 170 | helper.WaitForReadData(); |
Primiano Tucci | 5ae66da | 2018-03-28 15:57:34 +0100 | [diff] [blame] | 171 | |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 172 | const auto& packets = helper.trace(); |
| 173 | ASSERT_EQ(packets.size(), kNumPackets); |
| 174 | |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 175 | std::minstd_rand0 rnd_engine(kRandomSeed); |
Lalit Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 176 | for (const auto& packet : packets) { |
Lalit Maganti | c4c3ceb | 2018-03-29 20:38:13 +0100 | [diff] [blame] | 177 | 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 Maganti | 36557d8 | 2018-04-11 14:36:17 +0100 | [diff] [blame] | 183 | } |
Primiano Tucci | 5ae66da | 2018-03-28 15:57:34 +0100 | [diff] [blame] | 184 | } |
| 185 | |
Lalit Maganti | 79f2d7b | 2018-01-23 18:27:33 +0000 | [diff] [blame] | 186 | } // namespace perfetto |