blob: 00f458795831ffcb03caf8bec11dbdcd117fcecc [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GARNET_BIN_TRACE_MANAGER_TESTS_FAKE_PROVIDER_H_
#define GARNET_BIN_TRACE_MANAGER_TESTS_FAKE_PROVIDER_H_
#include <fuchsia/tracing/controller/cpp/fidl.h>
#include <fuchsia/tracing/provider/cpp/fidl.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/trace-engine/buffer_internal.h>
#include <lib/zx/fifo.h>
#include <gtest/gtest.h>
#include <trace-provider/provider.h>
#include <trace-reader/reader.h>
namespace tracing {
namespace test {
namespace provider = ::fuchsia::tracing::provider;
class FakeProvider : public provider::Provider {
public:
// Track the last request made.
enum State {
// Provider has not received any requests yet.
kReady,
// Upon receipt of |Initialize()| transition immediately to |kInitialized|.
kInitialized,
// Have received |Start()| but have not started yet.
kStarting,
// Provider has started tracing.
kStarted,
// Have received |Stop()| but have not stopped yet.
kStopping,
// Provider has stopped tracing.
kStopped,
// Have received |Terminate()| but have not terminated yet.
kTerminating,
// Provider has terminated tracing.
// There is no transition from |kTerminated| to |kReady| in the tests.
kTerminated,
};
static constexpr size_t kHeaderSize = sizeof(trace::internal::trace_buffer_header);
// The size of our durable buffer in CIRCULAR,STREAMING modes.
static constexpr size_t kDurableBufferSize = 4096;
FakeProvider(zx_koid_t pid, const std::string& name);
std::string PrettyName() const;
// |Provider| implementation.
void Initialize(provider::ProviderConfig config) override;
void Start(provider::StartOptions options) override;
void Stop() override;
void Terminate() override;
// Helpers to provide discrete advancement of provider state.
// These should only be called when the provider is in the preceding state,
// e.g., kStarting, kStopping, kTerminating.
void MarkStarted();
void MarkStopped();
void MarkTerminated();
// Raw state advancement.
// This should only be called under exceptional circumstances, e.g., to
// test the handling of broken providers.
void AdvanceToState(State state);
zx_koid_t pid() const { return pid_; }
const std::string& name() const { return name_; }
State state() const { return state_; }
int initialize_count() const { return initialize_count_; }
int start_count() const { return start_count_; }
int stop_count() const { return stop_count_; }
int terminate_count() const { return terminate_count_; }
void SendAlert(const char* alert_name);
private:
friend std::ostream& operator<<(std::ostream& out, FakeProvider::State state);
bool SendFifoPacket(const trace_provider_packet_t* packet);
void InitializeBuffer();
// These functions have the same names as their trace-engine counterparts.
void ComputeBufferSizes();
void ResetBufferPointers();
void InitBufferHeader();
void UpdateBufferHeaderAfterStopped();
void WriteInitRecord();
void WriteBlobRecord();
void WriteRecordToBuffer(const uint8_t* data, size_t size);
void WriteZeroLengthRecord(size_t offset);
void WriteBytes(const uint8_t* data, size_t offset, size_t size);
const zx_koid_t pid_;
const std::string name_;
State state_ = State::kReady;
provider::BufferingMode buffering_mode_;
zx::vmo buffer_vmo_;
zx::fifo fifo_;
std::vector<std::string> categories_;
size_t total_buffer_size_ = 0;
size_t durable_buffer_size_ = 0;
size_t rolling_buffer_size_ = 0;
size_t buffer_next_ = 0;
int initialize_count_ = 0;
int start_count_ = 0;
int stop_count_ = 0;
int terminate_count_ = 0;
};
using FakeProviderBinding = fidl::Binding<provider::Provider, std::unique_ptr<FakeProvider>>;
} // namespace test
} // namespace tracing
#endif // GARNET_BIN_TRACE_MANAGER_TESTS_FAKE_PROVIDER_H_