// Copyright 2018 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_TESTS_INTEGRATION_TEST_UTILS_H_
#define GARNET_BIN_TRACE_TESTS_INTEGRATION_TEST_UTILS_H_

#include <stddef.h>
#include <string>

#include <lib/async-loop/cpp/loop.h>
#include <lib/zx/time.h>
#include <trace-provider/provider.h>

#include "garnet/bin/trace/spec.h"

using TestRunner = bool(const tracing::Spec& spec);
using TestVerifier = bool(const tracing::Spec& spec,
                          const std::string& test_output_file);

struct IntegrationTest {
  const char* name;
  TestRunner* run;
  TestVerifier* verify;
};

// When emitting a small fixed number of events, emit this amount.
// We don't need many, and certainly not so much that we overflow the buffer:
// Here we can verify we got precisely the number of events we expected.
constexpr size_t kNumSimpleTestEvents = 10;

// When waiting for tracing to start, wait this long.
constexpr zx::duration kStartTimeout{zx::sec(10)};

// Given |test_name| return its |IntegrationTest| spec.
const IntegrationTest* LookupTest(const std::string& test_name);

// Create a provider and wait for tracing to start (if tracing is active).
// |loop| must be idle.
bool CreateProviderSynchronously(
    async::Loop& loop, const char* name,
    fbl::unique_ptr<trace::TraceProvider>* out_provider);

// Emit |num_iterations| records that |VerifyTestEvents()| knows how to test.
void WriteTestEvents(size_t num_records);

// Verify a trace generated with |WriteTestRecords()|.
// Returns a boolean indicating success.
// On success returns the number of events found in |*out_num_events|.
bool VerifyTestEvents(const std::string& test_output_file,
                      size_t* out_num_events);

// Write as many records as we can to ensure a buffer of size
// |buffer_size_in_mb| is full, and fill it |num_times|.
void FillBuffer(size_t num_times, size_t buffer_size_in_mb);

// Verify the trace generated by |FillBuffer()|.
// Returns a boolean indicating success.
bool VerifyFullBuffer(const std::string& test_output_file,
                      tracing::BufferingMode buffering_mode,
                      size_t buffer_size_in_mb);

// Wait for tracing to start or |timeout|.
// Basically this means waiting for the Start() request.
// |loop| must be idle.
// Returns true if tracing has started.
bool WaitForTracingToStart(async::Loop& loop, zx::duration timeout);

#endif  // GARNET_BIN_TRACE_TESTS_INTEGRATION_TEST_UTILS_H_
