// 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 "zircon/syscalls/port.h"
#include <perftest/perftest.h>
#include <zircon/errors.h>
#include <zircon/syscalls.h>
#include <zircon/types.h>

namespace {

bool ObjectWaitAsyncTest(perftest::RepeatState* state) {
    state->DeclareStep("CreateEvent");
    state->DeclareStep("CreatePort");
    state->DeclareStep("ObjectWaitAsync");
    state->DeclareStep("Close");

    zx_handle_t event;
    zx_handle_t port;
    while (state->KeepRunning()) {
        zx_status_t status = zx_event_create(0u, &event);
        ZX_ASSERT(status == ZX_OK);
        state->NextStep();

        status = zx_port_create(0, &port);
        ZX_ASSERT(status == ZX_OK);
        state->NextStep();

        status = zx_object_wait_async(event, port, 0, ZX_EVENT_SIGNALED, ZX_WAIT_ASYNC_ONCE);
        ZX_ASSERT(status == ZX_OK);
        state->NextStep();

        status = zx_handle_close(event);
        ZX_ASSERT(status == ZX_OK);
        status = zx_handle_close(port);
        ZX_ASSERT(status == ZX_OK);
    }

    return true;
}

void RegisterTests() {
    perftest::RegisterTest("ObjectWaitAsync", ObjectWaitAsyncTest);
}
PERFTEST_CTOR(RegisterTests)

}  // namespace
