// 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 ZIRCON_SYSTEM_UTEST_TRACE_FIXTURE_MACROS_H_
#define ZIRCON_SYSTEM_UTEST_TRACE_FIXTURE_MACROS_H_

#include <trace-test-utils/fixture.h>
#include <zxtest/zxtest.h>

#define DEFAULT_BUFFER_SIZE_BYTES (1024u * 1024u)

// This isn't a do-while because of the cleanup.
#define BEGIN_TRACE_TEST_ETC(attach_to_thread, mode, buffer_size)   \
  __attribute__((cleanup(fixture_scope_cleanup))) bool __scope = 0; \
  (void)__scope;                                                    \
  fixture_set_up((attach_to_thread), (mode), (buffer_size))

#define BEGIN_TRACE_TEST \
  BEGIN_TRACE_TEST_ETC(kNoAttachToThread, TRACE_BUFFERING_MODE_ONESHOT, DEFAULT_BUFFER_SIZE_BYTES)

#define END_TRACE_TEST

#ifndef NTRACE

#ifdef __cplusplus
#define ASSERT_RECORDS(expected_c, expected_cpp) \
  ASSERT_TRUE(fixture_compare_records(expected_c expected_cpp), "record mismatch")
#define ASSERT_N_RECORDS(max_num_recs, expected_c, expected_cpp, records, skip_count)              \
  ASSERT_TRUE(                                                                                     \
      fixture_compare_n_records((max_num_recs), expected_c expected_cpp, (records), (skip_count)), \
      "record mismatch")
#else
#define ASSERT_RECORDS(expected_c, expected_cpp) \
  ASSERT_TRUE(fixture_compare_records(expected_c), "record mismatch")
#endif  // __cplusplus

#else  // NTRACE

#define ASSERT_RECORDS(expected_c, expected_cpp) \
  ASSERT_TRUE(fixture_compare_records(""), "record mismatch")
#ifdef __cplusplus
#define ASSERT_N_RECORDS(max_num_recs, expected_c, expected_cpp, records, skip_count) \
  ASSERT_TRUE(fixture_compare_records((max_num_recs), "", (records), (skip_count)),   \
              "record mismatch")
#endif

#endif  // NTRACE

#endif  // ZIRCON_SYSTEM_UTEST_TRACE_FIXTURE_MACROS_H_
