blob: e5b78c927f6decd54b011528d0eb7a4df6c4dddb [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));
63 if (packet.has_clock_snapshot() || packet.has_trace_config())
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010064 continue;
65 ASSERT_EQ(protos::TracePacket::kTrustedUid,
Primiano Tucci07e104d2018-04-03 20:45:35 +020066 packet.optional_trusted_uid_case());
Lalit Maganti36557d82018-04-11 14:36:17 +010067 trace_.push_back(std::move(packet));
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010068 }
69
70 if (!has_more) {
Lalit Maganti36557d82018-04-11 14:36:17 +010071 std::move(on_packets_finished_callback_)();
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010072 }
73}
74
75void TestHelper::StartServiceIfRequired() {
76#if PERFETTO_BUILDFLAG(PERFETTO_START_DAEMONS)
77 service_thread_.Start(std::unique_ptr<ServiceDelegate>(
78 new ServiceDelegate(TEST_PRODUCER_SOCK_NAME, TEST_CONSUMER_SOCK_NAME)));
79#endif
80}
81
82FakeProducer* TestHelper::ConnectFakeProducer() {
83 std::unique_ptr<FakeProducerDelegate> producer_delegate(
84 new FakeProducerDelegate(
85 TEST_PRODUCER_SOCK_NAME,
86 WrapTask(task_runner_->CreateCheckpoint("producer.enabled"))));
87 FakeProducerDelegate* producer_delegate_cached = producer_delegate.get();
88 producer_thread_.Start(std::move(producer_delegate));
89 return producer_delegate_cached->producer();
90}
91
92void TestHelper::ConnectConsumer() {
Lalit Maganti36557d82018-04-11 14:36:17 +010093 on_connect_callback_ = task_runner_->CreateCheckpoint("consumer.connected");
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010094 endpoint_ =
95 ConsumerIPCClient::Connect(TEST_CONSUMER_SOCK_NAME, this, task_runner_);
Lalit Magantic4c3ceb2018-03-29 20:38:13 +010096}
97
98void TestHelper::StartTracing(const TraceConfig& config) {
Lalit Maganti36557d82018-04-11 14:36:17 +010099 on_stop_tracing_callback_ = task_runner_->CreateCheckpoint("stop.tracing");
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100100 endpoint_->EnableTracing(config);
Lalit Maganti36557d82018-04-11 14:36:17 +0100101}
102
103void TestHelper::ReadData() {
104 on_packets_finished_callback_ =
105 task_runner_->CreateCheckpoint("readback.complete");
106 endpoint_->ReadBuffers();
107}
108
109void TestHelper::WaitForConsumerConnect() {
110 task_runner_->RunUntilCheckpoint("consumer.connected");
111}
112
113void TestHelper::WaitForProducerEnabled() {
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100114 task_runner_->RunUntilCheckpoint("producer.enabled");
115}
116
Lalit Maganti36557d82018-04-11 14:36:17 +0100117void TestHelper::WaitForTracingDisabled() {
118 task_runner_->RunUntilCheckpoint("stop.tracing");
119}
120
121void TestHelper::WaitForReadData() {
122 task_runner_->RunUntilCheckpoint("readback.complete");
Lalit Magantic4c3ceb2018-03-29 20:38:13 +0100123}
124
125std::function<void()> TestHelper::WrapTask(
126 const std::function<void()>& function) {
127 return [this, function] { task_runner_->PostTask(function); };
128}
129
130} // namespace perfetto