// 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.

#include <trace-reader/file_reader.h>

#include <memory>
#include <stdint.h>
#include <stdio.h>
#include <utility>

#include <fbl/algorithm.h>
#include <fbl/vector.h>
#include <trace-engine/fields.h>
#include <trace-engine/types.h>
#include <zxtest/zxtest.h>

#include "reader_tests.h"

namespace trace {
namespace {

const char kTestInputFile[] = "/tmp/trace-reader-test.fxt";

TEST(TraceFileReader, Records) {
    FILE* f = fopen(kTestInputFile, "wb");
    ASSERT_NOT_NULL(f);

    constexpr zx_koid_t kProcessKoid = 42;
    constexpr zx_koid_t kThreadKoid = 43;
    constexpr trace_thread_index_t kThreadIndex = 99;

    uint64_t thread_record[3]{};
    ThreadRecordFields::Type::Set(thread_record[0],
                                  static_cast<uint64_t>(RecordType::kThread));
    ThreadRecordFields::RecordSize::Set(thread_record[0], fbl::count_of(thread_record));
    ThreadRecordFields::ThreadIndex::Set(thread_record[0], kThreadIndex);
    thread_record[1] = kProcessKoid;
    thread_record[2] = kThreadKoid;

    ASSERT_EQ(fwrite(&thread_record[0], sizeof(thread_record[0]),
                     fbl::count_of(thread_record), f),
              fbl::count_of(thread_record));
    ASSERT_EQ(fclose(f), 0);

    std::unique_ptr<trace::FileReader> reader;
    fbl::Vector<trace::Record> records;
    fbl::String error;
    ASSERT_TRUE(trace::FileReader::Create(
        kTestInputFile, test::MakeRecordConsumer(&records),
        test::MakeErrorHandler(&error), &reader));

    reader->ReadFile();
    EXPECT_TRUE(error.empty());
    ASSERT_EQ(records.size(), 1u);
    const trace::Record& rec = records[0];
    EXPECT_EQ(rec.type(), RecordType::kThread);
    const trace::Record::Thread& thread = rec.GetThread();
    EXPECT_EQ(thread.index, kThreadIndex);
    EXPECT_EQ(thread.process_thread.process_koid(), kProcessKoid);
    EXPECT_EQ(thread.process_thread.thread_koid(), kThreadKoid);
}

// NOTE: Most of the reader is covered by the libtrace tests.

} // namespace
} // namespace trace
