// Copyright 2015 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 (
	"fmt"
	"sync"
	"testing"

	test "mojo/public/interfaces/bindings/tests/regression_tests"
)

type methodWithEmptyResponseValidator struct {
	mu           sync.Mutex
	methodCalled bool
}

func (v *methodWithEmptyResponseValidator) WithoutParameterAndEmptyResponse() error {
	v.mu.Lock()
	v.methodCalled = true
	v.mu.Unlock()
	return nil
}

func (v *methodWithEmptyResponseValidator) WithParameterAndEmptyResponse(b bool) error {
	return nil
}

// TestCheckMethodWithEmptyResponse checks that the proxy waits for a server
// response if a method has 0 response arguments.
func TestCheckMethodWithEmptyResponse(t *testing.T) {
	iterations := 50
	for i := 0; i < iterations; i++ {
		interfaceRequest, interfacePointer := test.CreateMessagePipeForCheckMethodWithEmptyResponse()
		proxy := test.NewCheckMethodWithEmptyResponseProxy(interfacePointer, waiter)
		v := &methodWithEmptyResponseValidator{}
		stub := test.NewCheckMethodWithEmptyResponseStub(interfaceRequest, v, waiter)
		go func() {
			if err := stub.ServeRequest(); err != nil {
				panic(fmt.Sprintf("can't serve a request: %v", err))
			}
		}()
		if err := proxy.WithoutParameterAndEmptyResponse(); err != nil {
			t.Fatalf("error sending request: %v", err)
		}
		v.mu.Lock()
		if !v.methodCalled {
			t.Fatal("proxy returned from the call before the stub sent the response")
		}
		v.mu.Unlock()
	}
}
