/*
* Copyright 2018-2023 Open Networking Foundation (ONF) and the ONF Contributors

* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at

* http://www.apache.org/licenses/LICENSE-2.0

* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
 */
package stats

import (
	"context"
	"fmt"
	"io/ioutil"
	"net/http"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

// TODO: Check how to reset the prom counters and histogram
func TestPromStatsServer_Start(t *testing.T) {
	serverCtx, serverCancel := context.WithCancel(context.Background())
	defer serverCancel()

	testPort := 34201

	StatsServer.Start(serverCtx, testPort, VCore)

	//give time to the prom server to start
	time.Sleep(time.Millisecond * 300)

	StatsServer.Count(NumErrorsWritingToBus)
	StatsServer.Count(NumErrorsWritingToBus)

	StatsServer.CountForDevice("dev1", "serial1", NumOnusActivated)
	StatsServer.CountForDevice("dev1", "serial1", NumOnusActivated)
	StatsServer.CountForDevice("dev1", "serial1", NumOnusActivated)

	StatsServer.Add(NumCoreRpcErrors, 4.0)

	StatsServer.AddForDevice("dev2", "serial2", NumDiscoveriesReceived, 56)

	startTime := time.Now()

	time.Sleep(100 * time.Millisecond)
	StatsServer.CollectDurationForDevice("dev3", "sn3", OnuDiscoveryProcTime, startTime)

	StatsServer.CollectDuration(DBWriteTime, startTime)

	clientCtx, clientCancel := context.WithTimeout(context.Background(), time.Second)
	defer clientCancel()

	req, err := http.NewRequest("GET", fmt.Sprintf("http://127.0.0.1:%d/metrics", testPort), nil)
	require.NoError(t, err)
	req = req.WithContext(clientCtx)

	client := http.DefaultClient
	res, err := client.Do(req)
	require.NoError(t, err)
	defer res.Body.Close()

	assert.Equal(t, 200, res.StatusCode)

	bodyBytes, err := ioutil.ReadAll(res.Body)
	require.NoError(t, err)

	assert.Contains(t, string(bodyBytes), `voltha_rw_core_counters{counter="bus_write_errors_total"} 2`)
	assert.Contains(t, string(bodyBytes), `voltha_rw_core_device_counters{counter="activated_onus_total",device_id="dev1",serial_no="serial1"} 3`)
	assert.Contains(t, string(bodyBytes), `voltha_rw_core_counters{counter="core_rpc_errors_total"} 4`)
	assert.Contains(t, string(bodyBytes), `voltha_rw_core_device_counters{counter="discoveries_received_total",device_id="dev2",serial_no="serial2"} 56`)
	assert.Contains(t, string(bodyBytes), `voltha_rw_core_device_durations_bucket{device_id="dev3",duration="onu_discovery_proc_time",serial_no="sn3",le="300"} 1`)
}
