// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package tests

import (
	"bytes"
	"testing"
	"unsafe"

	"mojo/go/system/embedder"
	"mojo/public/go/system"
	m "mojo/public/go/system/impl"
)

var core system.Core

func init() {
	embedder.InitializeMojoEmbedder()
	core = m.GetCore()
}

func TestGetTimeTicksNow(t *testing.T) {
	x := core.GetTimeTicksNow()
	if x < 10 {
		t.Error("Invalid GetTimeTicksNow return value")
	}
}

func TestMessagePipe(t *testing.T) {
	var h0, h1 m.MojoHandle
	var r m.MojoResult

	if r, h0, h1 = core.CreateMessagePipe(nil); r != m.MOJO_RESULT_OK {
		t.Fatalf("CreateMessagePipe failed:%v", r)
	}
	if h0 == m.MOJO_HANDLE_INVALID || h1 == m.MOJO_HANDLE_INVALID {
		t.Fatalf("CreateMessagePipe returned invalid handles h0:%v h1:%v", h0, h1)
	}
	if r = core.Wait(h0, m.MOJO_HANDLE_SIGNAL_READABLE, 0); r != m.MOJO_RESULT_DEADLINE_EXCEEDED {
		t.Fatalf("h0 should not be readable:%v", r)
	}
	if r = core.Wait(h0, m.MOJO_HANDLE_SIGNAL_WRITABLE, 0); r != m.MOJO_RESULT_OK {
		t.Fatalf("h0 should be writeable:%v", r)
	}
	if r, _, _, _, _ = core.ReadMessage(h0, m.MOJO_READ_MESSAGE_FLAG_NONE); r != m.MOJO_RESULT_SHOULD_WAIT {
		t.Fatalf("Read on h0 did not return wait:%v", r)
	}
	kHello := []byte("hello")
	if r = core.WriteMessage(h1, kHello, nil, m.MOJO_WRITE_MESSAGE_FLAG_NONE); r != m.MOJO_RESULT_OK {
		t.Fatalf("Failed WriteMessage on h1:%v", r)
	}
	if r = core.Wait(h0, m.MOJO_HANDLE_SIGNAL_READABLE, m.MOJO_DEADLINE_INDEFINITE); r != m.MOJO_RESULT_OK {
		t.Fatalf("h0 should be readable after WriteMessage to h1:%v", r)
	}
	r, msg, _, _, _ := core.ReadMessage(h0, m.MOJO_READ_MESSAGE_FLAG_NONE)
	if r != m.MOJO_RESULT_OK {
		t.Fatalf("Failed ReadMessage on h0:%v", r)
	}
	if !bytes.Equal(msg, kHello) {
		t.Fatalf("Invalid message expected:%s, got:%s", kHello, msg)
	}
	if r = core.WaitMany([]m.MojoHandle{h0}, []m.MojoHandleSignals{m.MOJO_HANDLE_SIGNAL_READABLE}, 10); r != m.MOJO_RESULT_DEADLINE_EXCEEDED {
		t.Fatalf("h0 should not be readable after reading message:%v", r)
	}
	if r = core.Close(h0); r != m.MOJO_RESULT_OK {
		t.Fatalf("Close on h0 failed:%v", r)
	}
	if r = core.Wait(h1, m.MOJO_HANDLE_SIGNAL_READABLE|m.MOJO_HANDLE_SIGNAL_WRITABLE, 100); r != m.MOJO_RESULT_FAILED_PRECONDITION {
		t.Fatalf("h1 should not be readable/writeable after h0 has been closed:%v", r)
	}
	if r = core.Close(h1); r != m.MOJO_RESULT_OK {
		t.Fatalf("Close on h1 failed:%v", r)
	}
}

func TestDataPipe(t *testing.T) {
	var hp, hc m.MojoHandle
	var r m.MojoResult

	if r, hp, hc = core.CreateDataPipe(nil); r != m.MOJO_RESULT_OK {
		t.Fatalf("CreateDataPipe failed:%v", r)
	}
	if hp == m.MOJO_HANDLE_INVALID || hc == m.MOJO_HANDLE_INVALID {
		t.Fatalf("CreateDataPipe returned invalid handles hp:%v hc:%v", hp, hc)
	}
	if r = core.Wait(hc, m.MOJO_HANDLE_SIGNAL_READABLE, 0); r != m.MOJO_RESULT_DEADLINE_EXCEEDED {
		t.Fatalf("hc should not be readable:%v", r)
	}
	if r = core.Wait(hp, m.MOJO_HANDLE_SIGNAL_WRITABLE, 0); r != m.MOJO_RESULT_OK {
		t.Fatalf("hp should be writeable:%v", r)
	}
	kHello := []byte("hello")
	r, numBytes := core.WriteData(hp, kHello, m.MOJO_WRITE_DATA_FLAG_NONE)
	if r != m.MOJO_RESULT_OK || numBytes != (uint32)(len(kHello)) {
		t.Fatalf("Failed WriteData on hp:%v numBytes:%d", r, numBytes)
	}
	if r = core.Wait(hc, m.MOJO_HANDLE_SIGNAL_READABLE, 1000); r != m.MOJO_RESULT_OK {
		t.Fatalf("hc should be readable after WriteData on hp:%v", r)
	}
	r, data := core.ReadData(hc, m.MOJO_READ_DATA_FLAG_NONE)
	if r != m.MOJO_RESULT_OK {
		t.Fatalf("Failed ReadData on hc:%v", r)
	}
	if !bytes.Equal(data, kHello) {
		t.Fatalf("Invalid data expected:%s, got:%s", kHello, data)
	}
	if r = core.Close(hp); r != m.MOJO_RESULT_OK {
		t.Fatalf("Close on hp failed:%v", r)
	}
	if r = core.Wait(hc, m.MOJO_HANDLE_SIGNAL_READABLE, 100); r != m.MOJO_RESULT_FAILED_PRECONDITION {
		t.Fatalf("hc should not be readable after hp closed:%v", r)
	}
	if r = core.Close(hc); r != m.MOJO_RESULT_OK {
		t.Fatalf("Close on hc failed:%v", r)
	}
}

func TestSharedBuffer(t *testing.T) {
	var h0, h1 m.MojoHandle
	var bufPtr unsafe.Pointer
	var r m.MojoResult

	if r, h0 = core.CreateSharedBuffer(nil, 100); r != m.MOJO_RESULT_OK {
		t.Fatalf("CreateSharedBuffer failed:%v", r)
	}
	if h0 == m.MOJO_HANDLE_INVALID {
		t.Fatalf("CreateSharedBuffer returned an invalid handle h0:%v", h0)
	}
	if r, bufPtr = core.MapBuffer(h0, 0, 100, m.MOJO_MAP_BUFFER_FLAG_NONE); r != m.MOJO_RESULT_OK {
		t.Fatalf("MapBuffer failed to map buffer with h0:%v", r)
	}
	bufArrayh0 := (*[100]byte)(bufPtr)
	bufArrayh0[50] = 'x'
	if r, h1 = core.DuplicateBufferHandle(h0, nil); r != m.MOJO_RESULT_OK {
		t.Fatalf("DuplicateBufferHandle of h0 failed:%v", r)
	}
	if h1 == m.MOJO_HANDLE_INVALID {
		t.Fatalf("DuplicateBufferHandle returned an invalid handle h1:%v", h1)
	}
	if r = core.Close(h0); r != m.MOJO_RESULT_OK {
		t.Fatalf("Close on h0 failed:%v", r)
	}
	bufArrayh0[51] = 'y'
	if r = core.UnmapBuffer(bufPtr); r != m.MOJO_RESULT_OK {
		t.Fatalf("UnmapBuffer failed:%v", r)
	}
	if r, bufPtr = core.MapBuffer(h1, 50, 50, m.MOJO_MAP_BUFFER_FLAG_NONE); r != m.MOJO_RESULT_OK {
		t.Fatalf("MapBuffer failed to map buffer with h1:%v", r)
	}
	bufArrayh1 := (*[50]byte)(bufPtr)
	if bufArrayh1[0] != 'x' || bufArrayh1[1] != 'y' {
		t.Fatalf("Failed to validate shared buffer. expected:x,y got:%s,%s", bufArrayh1[0], bufArrayh1[1])
	}
	if r = core.UnmapBuffer(bufPtr); r != m.MOJO_RESULT_OK {
		t.Fatalf("UnmapBuffer failed:%v", r)
	}
	if r = core.Close(h1); r != m.MOJO_RESULT_OK {
		t.Fatalf("Close on h1 failed:%v", r)
	}
}
