blob: 51ae9aa6bc3a6b048d9c17ef785449c61ac60453 [file] [log] [blame]
Lalit Magantic4c3ceb2018-03-29 20:38:13 +01001/*
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
17#include "test/test_helper.h"
18
19#include "gtest/gtest.h"
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010020#include "perfetto/traced/traced.h"
21#include "perfetto/tracing/core/trace_packet.h"
22#include "test/task_runner_thread_delegates.h"
23
Florian Mayerc29e0d32018-04-04 15:55:46 +010024#include "src/tracing/ipc/default_socket.h"
25
Primiano Tucci07e104d2018-04-03 20:45:35 +020026#include "perfetto/trace/trace_packet.pb.h"
27#include "perfetto/trace/trace_packet.pbzero.h"
28
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010029namespace perfetto {
30
31// If we're building on Android and starting the daemons ourselves,
32// create the sockets in a world-writable location.
33#if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) && \
34 PERFETTO_BUILDFLAG(PERFETTO_START_DAEMONS)
35#define TEST_PRODUCER_SOCK_NAME "/data/local/tmp/traced_producer"
36#define TEST_CONSUMER_SOCK_NAME "/data/local/tmp/traced_consumer"
37#else
Florian Mayerc29e0d32018-04-04 15:55:46 +010038#define TEST_PRODUCER_SOCK_NAME ::perfetto::GetProducerSocket()
39#define TEST_CONSUMER_SOCK_NAME ::perfetto::GetConsumerSocket()
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010040#endif
41
42TestHelper::TestHelper(base::TestTaskRunner* task_runner)
43 : task_runner_(task_runner),
44 service_thread_("perfetto.svc"),
45 producer_thread_("perfetto.prd") {}
46
47void TestHelper::OnConnect() {
Lalit Maganti36557d82018-04-11 14:36:17 +010048 std::move(on_connect_callback_)();
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010049}
50
51void TestHelper::OnDisconnect() {
52 FAIL() << "Consumer unexpectedly disconnected from the service";
53}
54
Lalit Maganti36557d82018-04-11 14:36:17 +010055void TestHelper::OnTracingDisabled() {
56 std::move(on_stop_tracing_callback_)();
57}
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010058
59void TestHelper::OnTraceData(std::vector<TracePacket> packets, bool has_more) {
Primiano Tucci07e104d2018-04-03 20:45:35 +020060 for (auto& encoded_packet : packets) {
61 protos::TracePacket packet;
62 ASSERT_TRUE(encoded_packet.Decode(&packet));
Primiano Tucci5e33cad2018-04-30 14:41:25 +010063 if (packet.has_clock_snapshot() || packet.has_trace_config() ||
Primiano Tucci9754d0d2018-09-15 12:41:46 +010064 packet.has_trace_stats() || !packet.synchronization_marker().empty()) {
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010065 continue;
Primiano Tucci5e33cad2018-04-30 14:41:25 +010066 }
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010067 ASSERT_EQ(protos::TracePacket::kTrustedUid,
Primiano Tucci07e104d2018-04-03 20:45:35 +020068 packet.optional_trusted_uid_case());
Lalit Maganti36557d82018-04-11 14:36:17 +010069 trace_.push_back(std::move(packet));
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010070 }
71
72 if (!has_more) {
Lalit Maganti36557d82018-04-11 14:36:17 +010073 std::move(on_packets_finished_callback_)();
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010074 }
75}
76
77void TestHelper::StartServiceIfRequired() {
78#if PERFETTO_BUILDFLAG(PERFETTO_START_DAEMONS)
79 service_thread_.Start(std::unique_ptr<ServiceDelegate>(
80 new ServiceDelegate(TEST_PRODUCER_SOCK_NAME, TEST_CONSUMER_SOCK_NAME)));
81#endif
82}
83
84FakeProducer* TestHelper::ConnectFakeProducer() {
85 std::unique_ptr<FakeProducerDelegate> producer_delegate(
86 new FakeProducerDelegate(
87 TEST_PRODUCER_SOCK_NAME,
88 WrapTask(task_runner_->CreateCheckpoint("producer.enabled"))));
89 FakeProducerDelegate* producer_delegate_cached = producer_delegate.get();
90 producer_thread_.Start(std::move(producer_delegate));
91 return producer_delegate_cached->producer();
92}
93
94void TestHelper::ConnectConsumer() {
Lalit Maganti36557d82018-04-11 14:36:17 +010095 on_connect_callback_ = task_runner_->CreateCheckpoint("consumer.connected");
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010096 endpoint_ =
97 ConsumerIPCClient::Connect(TEST_CONSUMER_SOCK_NAME, this, task_runner_);
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010098}
99
100void TestHelper::StartTracing(const TraceConfig& config) {
Lalit Maganti36557d82018-04-11 14:36:17 +0100101 on_stop_tracing_callback_ = task_runner_->CreateCheckpoint("stop.tracing");
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100102 endpoint_->EnableTracing(config);
Lalit Maganti36557d82018-04-11 14:36:17 +0100103}
104
Lalit Maganti3f0b7c62018-04-18 19:10:09 +0100105void TestHelper::ReadData(uint32_t read_count) {
106 on_packets_finished_callback_ = task_runner_->CreateCheckpoint(
107 "readback.complete." + std::to_string(read_count));
Lalit Maganti36557d82018-04-11 14:36:17 +0100108 endpoint_->ReadBuffers();
109}
110
111void TestHelper::WaitForConsumerConnect() {
112 task_runner_->RunUntilCheckpoint("consumer.connected");
113}
114
115void TestHelper::WaitForProducerEnabled() {
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100116 task_runner_->RunUntilCheckpoint("producer.enabled");
117}
118
Lalit Maganti36557d82018-04-11 14:36:17 +0100119void TestHelper::WaitForTracingDisabled() {
120 task_runner_->RunUntilCheckpoint("stop.tracing");
121}
122
Lalit Maganti3f0b7c62018-04-18 19:10:09 +0100123void TestHelper::WaitForReadData(uint32_t read_count) {
124 task_runner_->RunUntilCheckpoint("readback.complete." +
125 std::to_string(read_count));
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100126}
127
128std::function<void()> TestHelper::WrapTask(
129 const std::function<void()>& function) {
130 return [this, function] { task_runner_->PostTask(function); };
131}
132
133} // namespace perfetto