// Copyright 2017 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_LIB_MEASURE_TEST_EVENTS_H_
#define GARNET_LIB_MEASURE_TEST_EVENTS_H_

#include <trace-reader/reader.h>

namespace tracing {
namespace measure {
namespace test {

trace::Record::Event DurationBegin(fbl::String name, fbl::String category,
                                   uint64_t timestamp);

trace::Record::Event DurationEnd(fbl::String name, fbl::String category,
                                 uint64_t timestamp);

trace::Record::Event DurationComplete(fbl::String name, fbl::String category,
                                      uint64_t timestamp, uint64_t end_time);

trace::Record::Event AsyncBegin(uint64_t id, fbl::String name,
                                fbl::String category, uint64_t timestamp);

trace::Record::Event AsyncEnd(uint64_t id, fbl::String name,
                              fbl::String category, uint64_t timestamp);

trace::Record::Event FlowBegin(uint64_t id, fbl::String name,
                               fbl::String category, uint64_t timestamp);

trace::Record::Event FlowEnd(uint64_t id, fbl::String name,
                             fbl::String category, uint64_t timestamp);

trace::Record::Event Instant(fbl::String name, fbl::String category,
                             uint64_t timestamp,
                             fbl::Vector<trace::Argument> args = {});
}  // namespace test

}  // namespace measure
}  // namespace tracing

#endif  // GARNET_LIB_MEASURE_TEST_EVENTS_H_
