/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef TEST_FAKE_PRODUCER_H_ #define TEST_FAKE_PRODUCER_H_ #include #include #include #include "perfetto/ext/base/thread_checker.h" #include "perfetto/ext/base/unix_socket.h" #include "perfetto/ext/tracing/core/producer.h" #include "perfetto/ext/tracing/ipc/producer_ipc_client.h" #include "perfetto/tracing/core/data_source_descriptor.h" #include "perfetto/tracing/core/trace_config.h" #include "src/base/test/test_task_runner.h" namespace perfetto { namespace protos { namespace gen { class TestConfig; } // namespace gen } // namespace protos class FakeProducer : public Producer { public: explicit FakeProducer(const std::string& name, base::TaskRunner* task_runner); ~FakeProducer() override; void Connect(const char* socket_name, std::function on_connect, std::function on_setup_data_source_instance, std::function on_create_data_source_instance, std::unique_ptr shm = nullptr, std::unique_ptr shm_arbiter = nullptr); // Produces a batch of events (as configured by the passed config) before the // producer is connected to the service using the provided unbound arbiter. // Posts |callback| once the data was written. May only be called once. void ProduceStartupEventBatch( const protos::gen::TestConfig& config, SharedMemoryArbiter* arbiter, std::function callback = [] {}); // Produces a batch of events (as configured in the DataSourceConfig) and // posts a callback when the service acknowledges the commit. void ProduceEventBatch(std::function callback = [] {}); void RegisterDataSource(const DataSourceDescriptor&); void CommitData(const CommitDataRequest&, std::function callback); void Sync(std::function callback); bool IsShmemProvidedByProducer() const { return endpoint_->IsShmemProvidedByProducer(); } // Producer implementation. void OnConnect() override; void OnDisconnect() override; void SetupDataSource(DataSourceInstanceID, const DataSourceConfig& source_config) override; void StartDataSource(DataSourceInstanceID, const DataSourceConfig& source_config) override; void StopDataSource(DataSourceInstanceID) override; void OnTracingSetup() override; void Flush(FlushRequestID, const DataSourceInstanceID*, size_t) override; void ClearIncrementalState(const DataSourceInstanceID* /*data_source_ids*/, size_t /*num_data_sources*/) override {} // For testing, access to the fd used to communicate with the TracingService. base::SocketHandle unix_socket_fd(); private: void SetupFromConfig(const protos::gen::TestConfig& config); void EmitEventBatchOnTaskRunner(std::function callback); base::ThreadChecker thread_checker_; std::string name_; base::TaskRunner* task_runner_ = nullptr; std::minstd_rand0 rnd_engine_; uint32_t message_size_ = 0; uint32_t message_count_ = 0; uint32_t max_messages_per_second_ = 0; std::function on_connect_; std::function on_setup_data_source_instance_; std::function on_create_data_source_instance_; std::unique_ptr endpoint_; std::unique_ptr trace_writer_; }; } // namespace perfetto #endif // TEST_FAKE_PRODUCER_H_