// Copyright 2020 The Go 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 ocagent_test

import (
	"context"
	"errors"
	"testing"

	"golang.org/x/tools/internal/event"
	"golang.org/x/tools/internal/event/keys"
)

func TestEncodeMetric(t *testing.T) {
	exporter := registerExporter()
	const prefix = testNodeStr + `
	"metrics":[`
	const suffix = `]}`
	tests := []struct {
		name string
		run  func(ctx context.Context)
		want string
	}{
		{
			name: "HistogramFloat64, HistogramInt64",
			run: func(ctx context.Context) {
				ctx = event.Label(ctx, keyMethod.Of("godoc.ServeHTTP"))
				event.Metric(ctx, latencyMs.Of(96.58))
				ctx = event.Label(ctx, keys.Err.Of(errors.New("panic: fatal signal")))
				event.Metric(ctx, bytesIn.Of(97e2))
			},
			want: prefix + `
			{
				"metric_descriptor": {
					"name": "latency_ms",
					"description": "The latency of calls in milliseconds",
					"type": 6,
					"label_keys": [
						{
							"key": "method"
						},
						{
							"key": "route"
						}
					]
				},
				"timeseries": [
					{
						"start_timestamp": "1970-01-01T00:00:00Z",
						"points": [
							{
								"timestamp": "1970-01-01T00:00:40Z",
								"distributionValue": {
									"count": 1,
									"sum": 96.58,
									"bucket_options": {
										"explicit": {
											"bounds": [
												0,
												5,
												10,
												25,
												50
											]
										}
									},
									"buckets": [
										{},
										{},
										{},
										{},
										{}
									]
								}
							}
						]
					}
				]
			},
			{
				"metric_descriptor": {
					"name": "latency_ms",
					"description": "The latency of calls in milliseconds",
					"type": 6,
					"label_keys": [
						{
							"key": "method"
						},
						{
							"key": "route"
						}
					]
				},
				"timeseries": [
					{
						"start_timestamp": "1970-01-01T00:00:00Z",
						"points": [
							{
								"timestamp": "1970-01-01T00:00:40Z",
								"distributionValue": {
									"count": 1,
									"sum": 9700,
									"bucket_options": {
										"explicit": {
											"bounds": [
												0,
												10,
												50,
												100,
												500,
												1000,
												2000
											]
										}
									},
									"buckets": [
										{},
										{},
										{},
										{},
										{},
										{},
										{}
									]
								}
							}
						]
					}
				]
			}` + suffix,
		},
	}

	ctx := context.TODO()
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			tt.run(ctx)
			got := exporter.Output("/v1/metrics")
			checkJSON(t, got, []byte(tt.want))
		})
	}
}
