// 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 "gtest/gtest.h"
#include "fuchsia/msd_img_connection.h"
#include "fuchsia/msd_img_semaphore.h"

extern "C"
{
#include "osfunc.h"
#include "osfunc_fuchsia.h"
}

namespace
{
class FakeOwner : public MsdImgConnection::Owner
{
	PVRSRV_DEVICE_NODE* device_node() override { return nullptr; }
};
} // namespace


class TestOsFunc
{
public:
	static void EventObject()
	{
		IMG_HANDLE event_object;
		EXPECT_EQ(PVRSRV_OK, OSEventObjectCreate("test", &event_object));
		EXPECT_EQ(PVRSRV_OK, OSEventObjectSignal(event_object));


		IMG_HANDLE hOSEvent;
		EXPECT_EQ(PVRSRV_OK, OSEventObjectOpen(event_object, &hOSEvent));

		// Should wake because the object was signaled before the open.
		EXPECT_EQ(PVRSRV_OK, OSEventObjectWait(hOSEvent));

		EXPECT_EQ(PVRSRV_ERROR_TIMEOUT, OSEventObjectWaitTimeout(hOSEvent, 100));

		FakeOwner fake_owner;
		MsdImgConnection connection(&fake_owner, 0);

		std::shared_ptr<MsdImgSemaphore> semaphore(MsdImgSemaphore::Create());
		connection.additional_semaphore_ = semaphore;

		IMG_HANDLE hOSEvent2;

		EXPECT_EQ(PVRSRV_OK, OSEventObjectOpenWithConnection(event_object, &connection, &hOSEvent2));
		EXPECT_FALSE(connection.additional_semaphore_);
		EXPECT_EQ(MAGMA_STATUS_OK, semaphore->platform_semaphore()->Wait().get());
		EXPECT_EQ(MAGMA_STATUS_TIMED_OUT, semaphore->platform_semaphore()->Wait(10).get());

		EXPECT_EQ(PVRSRV_OK, OSEventObjectSignal(event_object));

		EXPECT_EQ(PVRSRV_OK, OSEventObjectWait(hOSEvent));
		EXPECT_EQ(PVRSRV_OK, OSEventObjectWait(hOSEvent2));
		EXPECT_EQ(MAGMA_STATUS_OK, semaphore->platform_semaphore()->Wait().get());

		EXPECT_EQ(PVRSRV_ERROR_TIMEOUT, OSEventObjectWaitTimeout(hOSEvent, 100));

		EXPECT_EQ(PVRSRV_OK, OSEventObjectClose(hOSEvent2));
		EXPECT_EQ(PVRSRV_OK, OSEventObjectClose(hOSEvent));
		EXPECT_EQ(PVRSRV_OK, OSEventObjectDestroy(event_object));
	}
};

TEST(OSFunc, EventObject) { TestOsFunc::EventObject(); }
