// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT

package statsd

import (
	"testing"

	"github.com/stretchr/testify/assert"

	"github.com/aws/amazon-cloudwatch-agent/tool/data"
	"github.com/aws/amazon-cloudwatch-agent/tool/data/config/metric/statsd"
	"github.com/aws/amazon-cloudwatch-agent/tool/processors/collectd"
	"github.com/aws/amazon-cloudwatch-agent/tool/runtime"
	"github.com/aws/amazon-cloudwatch-agent/tool/testutil"
)

func TestProcessor_Process(t *testing.T) {
	inputChan := testutil.SetUpTestInputStream()

	ctx := new(runtime.Context)
	conf := new(data.Config)

	testutil.Type(inputChan, "2")
	Processor.Process(ctx, conf)
	assert.Nil(t, conf.MetricsConfig)

	testutil.Type(inputChan, "", "", "", "")
	Processor.Process(ctx, conf)
	statsConf := conf.MetricsConf().Collection().StatsD
	assert.NotNil(t, statsConf)
	assert.Equal(t, ":8125", statsConf.ServiceAddress)
	assert.Equal(t, 10, statsConf.MetricsCollectionInterval)
	assert.Equal(t, 60, statsConf.MetricsAggregationInterval)
}

func TestProcessor_NextProcessor(t *testing.T) {
	ctx := new(runtime.Context)
	assert.Equal(t, collectd.Processor, Processor.NextProcessor(ctx, nil))
}

func TestWhichPort(t *testing.T) {
	inputChan := testutil.SetUpTestInputStream()
	conf := new(statsd.StatsD)

	testutil.Type(inputChan, "")
	whichPort(conf)
	assert.Equal(t, ":8125", conf.ServiceAddress)

	testutil.Type(inputChan, "12345")
	whichPort(conf)
	assert.Equal(t, ":12345", conf.ServiceAddress)
}

func TestWhichCollectionInterval(t *testing.T) {
	inputChan := testutil.SetUpTestInputStream()
	conf := new(statsd.StatsD)

	testutil.Type(inputChan, "")
	whichMetricsCollectionInterval(conf)
	assert.Equal(t, 10, conf.MetricsCollectionInterval)

	testutil.Type(inputChan, "2")
	whichMetricsCollectionInterval(conf)
	assert.Equal(t, 30, conf.MetricsCollectionInterval)

	testutil.Type(inputChan, "3")
	whichMetricsCollectionInterval(conf)
	assert.Equal(t, 60, conf.MetricsCollectionInterval)
}

func TestWhichAggregationInterval(t *testing.T) {
	inputChan := testutil.SetUpTestInputStream()
	conf := new(statsd.StatsD)

	testutil.Type(inputChan, "1")
	whichMetricsAggregationInterval(conf)
	assert.Equal(t, 0, conf.MetricsAggregationInterval)

	testutil.Type(inputChan, "2")
	whichMetricsAggregationInterval(conf)
	assert.Equal(t, 10, conf.MetricsAggregationInterval)

	testutil.Type(inputChan, "3")
	whichMetricsAggregationInterval(conf)
	assert.Equal(t, 30, conf.MetricsAggregationInterval)

	testutil.Type(inputChan, "")
	whichMetricsAggregationInterval(conf)
	assert.Equal(t, 60, conf.MetricsAggregationInterval)
}