// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1

package agent

import (
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/hashicorp/consul/sdk/testutil"
	"github.com/hashicorp/consul/testrpc"
)

func testGRPCStreamingWorking(t *testing.T, config string) {
	if testing.Short() {
		t.Skip("too slow for testing.Short")
	}

	a := NewTestAgent(t, config)
	defer a.Shutdown()

	testrpc.WaitForLeader(t, a.RPC, "dc1")

	req, _ := http.NewRequest("GET", "/v1/health/service/consul?index=3", nil)
	resp := httptest.NewRecorder()
	_, err := a.srv.HealthServiceNodes(resp, req)
	if err != nil {
		t.Fatalf("err: %v", err)
	}

	assertIndex(t, resp)
	require.NotEmpty(t, resp.Header().Get("X-Consul-Index"))
	require.Equal(t, "streaming", resp.Header().Get("X-Consul-Query-Backend"))
}

func TestGRPCWithTLSConfigs(t *testing.T) {
	// if this test is failing because of expired certificates
	// use the procedure in test/CA-GENERATION.md
	t.Parallel()
	testCases := []struct {
		name   string
		config string
	}{
		{
			name:   "no-tls",
			config: "",
		},
		{
			name: "tls-all-enabled",
			config: `
				# tls
				ca_file   = "../test/hostname/CertAuth.crt"
				cert_file = "../test/hostname/Bob.crt"
				key_file  = "../test/hostname/Bob.key"
				verify_incoming               = true
				verify_outgoing               = true
				verify_server_hostname        = true
				`,
		},
		{
			name: "tls ready no verify incoming",
			config: `
				# tls
				ca_file   = "../test/hostname/CertAuth.crt"
				cert_file = "../test/hostname/Bob.crt"
				key_file  = "../test/hostname/Bob.key"
				verify_incoming               = false
				verify_outgoing               = true
				verify_server_hostname        = false
				`,
		},
		{
			name: "tls ready no verify outgoing and incoming",
			config: `
				# tls
				ca_file   = "../test/hostname/CertAuth.crt"
				cert_file = "../test/hostname/Bob.crt"
				key_file  = "../test/hostname/Bob.key"
				verify_incoming               = false
				verify_outgoing               = false
				verify_server_hostname        = false
				`,
		},
		{
			name: "tls ready, all defaults",
			config: `
				# tls
				ca_file   = "../test/hostname/CertAuth.crt"
				cert_file = "../test/hostname/Bob.crt"
				key_file  = "../test/hostname/Bob.key"
				`,
		},
	}
	for _, tt := range testCases {
		t.Run(tt.name, func(t *testing.T) {
			dataDir := testutil.TempDir(t, "agent") // we manage the data dir
			cfg := `data_dir = "` + dataDir + `"
					domain = "consul"
					node_name = "my-fancy-server"
					datacenter = "dc1"
					primary_datacenter = "dc1"
					rpc {
						enable_streaming = true
					}
					use_streaming_backend = true
			       ` + tt.config
			testGRPCStreamingWorking(t, cfg)
		})
	}
}
