// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package vault

import (
	"testing"
	"time"

	"github.com/hashicorp/go-uuid"
	"github.com/hashicorp/vault/helper/namespace"
	"github.com/hashicorp/vault/sdk/logical"
)

func TestCanSendEventsFromBuiltinPlugin(t *testing.T) {
	c, _, _ := TestCoreUnsealed(t)

	ctx := namespace.RootContext(nil)

	// subscribe to an event type
	eventType, err := uuid.GenerateUUID()
	if err != nil {
		t.Fatal(err)
	}
	ch, cancel, err := c.events.Subscribe(ctx, namespace.RootNamespace, eventType)
	if err != nil {
		t.Fatal(err)
	}
	defer cancel()

	// generate the event in a plugin
	event, err := logical.NewEvent()
	if err != nil {
		t.Fatal(err)
	}
	err = c.cubbyholeBackend.SendEvent(ctx, logical.EventType(eventType), event)
	if err != nil {
		t.Fatal(err)
	}

	// check that the event is routed to the subscription
	select {
	case receivedEvent := <-ch:
		received := receivedEvent.Payload.(*logical.EventReceived)
		if event.Id != received.Event.Id {
			t.Errorf("Got wrong event: %+v, expected %+v", received, event)
		}
		if received.PluginInfo == nil {
			t.Error("Expected plugin info but got nil")
		} else {
			if received.PluginInfo.Plugin != "cubbyhole" {
				t.Errorf("Expected cubbyhole plugin but got %s", received.PluginInfo.Plugin)
			}
		}

	case <-time.After(1 * time.Second):
		t.Error("timeout waiting for event")
	}
}
