/*
 * Copyright 2014-2015 Jason Woods.
 *
 * This file is a modification of code from Logstash Forwarder.
 * Copyright 2012-2013 Jordan Sissel and contributors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package main

import (
	"github.com/driskell/log-courier/lc-lib/core"
	"github.com/driskell/log-courier/lc-lib/registrar"
	"testing"
	"time"
)

func newTestStdinRegistrar() (*core.Pipeline, *StdinRegistrar) {
	pipeline := core.NewPipeline()
	return pipeline, newStdinRegistrar(pipeline)
}

func newEventSpool(offset int64) []*core.EventDescriptor {
	// Prepare an event spool with single event of specified offset
	return []*core.EventDescriptor{
		&core.EventDescriptor{
			Stream: nil,
			Offset: offset,
			Event: []byte{},
		},
	}
}

func TestStdinRegistrarWait(t *testing.T) {
	p, r := newTestStdinRegistrar()

	// Start the stdin registrar
	go func() {
		r.Run()
	}()

	c := r.Connect()
	c.Add(registrar.NewAckEvent(newEventSpool(13)))
	c.Send()

	r.Wait(13)

	wait := make(chan int)
	go func() {
		p.Wait()
		wait <- 1
	}()

	select {
	case <-wait:
		break
	case <-time.After(5 * time.Second):
		t.Error("Timeout waiting for stdin registrar shutdown")
		return
	}

	if r.last_offset != 13 {
		t.Error("Last offset was incorrect: ", r.last_offset)
	} else if r.wait_offset == nil || *r.wait_offset != 13 {
		t.Error("Wait offset was incorrect: ", r.wait_offset)
	}
}
