package envoyconfig

import (
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/pomerium/pomerium/config"
	"github.com/pomerium/pomerium/internal/testutil"
)

func TestBuildTracingCluster(t *testing.T) {
	t.Run("datadog", func(t *testing.T) {
		c, err := buildTracingCluster(&config.Options{
			TracingProvider: "datadog",
		})
		require.NoError(t, err)
		testutil.AssertProtoJSONEqual(t, `
			{
				"name": "datadog-apm",
				"type": "STATIC",
				"connectTimeout": "5s",
				"loadAssignment": {
					"clusterName": "datadog-apm",
					"endpoints": [{
						"lbEndpoints": [{
							"endpoint": {
								"address": {
									"socketAddress": {
										"address": "127.0.0.1",
										"portValue": 8126
									}
								}
							}
						}]
					}]
				}
			}
		`, c)

		c, err = buildTracingCluster(&config.Options{
			TracingProvider:       "datadog",
			TracingDatadogAddress: "example.com:8126",
		})
		require.NoError(t, err)
		testutil.AssertProtoJSONEqual(t, `
			{
				"name": "datadog-apm",
				"type": "STRICT_DNS",
				"connectTimeout": "5s",
				"loadAssignment": {
					"clusterName": "datadog-apm",
					"endpoints": [{
						"lbEndpoints": [{
							"endpoint": {
								"address": {
									"socketAddress": {
										"address": "example.com",
										"portValue": 8126
									}
								}
							}
						}]
					}]
				}
			}
		`, c)
	})
	t.Run("zipkin", func(t *testing.T) {
		c, err := buildTracingCluster(&config.Options{
			TracingProvider: "zipkin",
			ZipkinEndpoint:  "https://example.com/api/v2/spans",
		})
		require.NoError(t, err)
		testutil.AssertProtoJSONEqual(t, `
			{
				"name": "zipkin",
				"type": "STRICT_DNS",
				"connectTimeout": "5s",
				"loadAssignment": {
					"clusterName": "zipkin",
					"endpoints": [{
						"lbEndpoints": [{
							"endpoint": {
								"address": {
									"socketAddress": {
										"address": "example.com",
										"portValue": 443
									}
								}
							}
						}]
					}]
				}
			}
		`, c)
	})
}

func TestBuildTracingHTTP(t *testing.T) {
	t.Run("datadog", func(t *testing.T) {
		h, err := buildTracingHTTP(&config.Options{
			TracingProvider: "datadog",
		})
		require.NoError(t, err)
		testutil.AssertProtoJSONEqual(t, `
			{
				"name": "envoy.tracers.datadog",
				"typedConfig": {
					"@type": "type.googleapis.com/envoy.config.trace.v3.DatadogConfig",
					"collectorCluster": "datadog-apm",
					"serviceName": "pomerium"
				}
			}
		`, h)
	})
	t.Run("zipkin", func(t *testing.T) {
		h, err := buildTracingHTTP(&config.Options{
			TracingProvider: "zipkin",
			ZipkinEndpoint:  "https://example.com/api/v2/spans",
		})
		require.NoError(t, err)
		testutil.AssertProtoJSONEqual(t, `
			{
				"name": "envoy.tracers.zipkin",
				"typedConfig": {
					"@type": "type.googleapis.com/envoy.config.trace.v3.ZipkinConfig",
					"collectorCluster": "zipkin",
					"collectorEndpoint": "/api/v2/spans",
					"collectorEndpointVersion": "HTTP_JSON"
				}
			}
		`, h)
	})
}