/*
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You 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 consumer

import (
	"testing"
	"time"
)

func almostEqual(a, b float64) bool {
	diff := abs(a - b)
	return diff/a < 0.01
}

func abs(a float64) float64 {
	if a > 0 {
		return a
	}
	return -a
}

func TestNextMinuteTime(t *testing.T) {
	nextMinute := nextMinutesTime()
	minuteElapse := nextMinute.Sub(time.Now()).Minutes()
	if !almostEqual(minuteElapse, 1.0) {
		t.Errorf("wrong next one minute. want=%f, got=%f", 1.0, minuteElapse)
	}
}

func TestNextHourTime(t *testing.T) {
	nextHour := nextHourTime()
	hourElapse := nextHour.Sub(time.Now()).Hours()
	if !almostEqual(hourElapse, 1.0) {
		t.Errorf("wrong next one hour. want=%f, got=%f", 1.0, hourElapse)
	}
}

func TestIncreasePullRTGetPullRT(t *testing.T) {
	mgr := NewStatsManager()
	mgr.ShutDownStat()

	tests := []struct {
		RT        int64
		ExpectSum int64
	}{
		{1, 0},
		{1, 1},
		{1, 2},
		{1, 3},
		{1, 4},
		{1, 5},
		{1, 6},
		{1, 6},
	}
	for _, tt := range tests {
		mgr.increasePullRT("rocketmq", "default", tt.RT)
		mgr.topicAndGroupPullRT.samplingInSeconds()
		snapshot := mgr.getPullRT("rocketmq", "default")
		if snapshot.sum != tt.ExpectSum {
			t.Errorf("wrong Pull RT sum. want=%d, got=%d", tt.ExpectSum, snapshot.sum)
		}
	}
}

//func TestIncreaseConsumeRTGetConsumeRT(t *testing.T) {
//	ShutDownStat()
//	tests := []struct {
//		RT        int64
//		ExpectSum int64
//	}{
//		{1, 0},
//		{1, 1},
//		{1, 2},
//		{1, 3},
//		{1, 4},
//		{1, 5},
//		{1, 6},
//		{1, 6},
//	}
//	for _, tt := range tests {
//		increaseConsumeRT("rocketmq", "default", tt.RT)
//		topicAndGroupConsumeRT.samplingInMinutes()
//		snapshot := getConsumeRT("rocketmq", "default")
//		if snapshot.sum != tt.ExpectSum {
//			t.Errorf("wrong consume RT sum. want=%d, got=%d", tt.ExpectSum, snapshot.sum)
//		}
//	}
//}

func TestIncreasePullTPSGetPullTPS(t *testing.T) {
	mgr := NewStatsManager()
	mgr.ShutDownStat()
	tests := []struct {
		RT        int
		ExpectSum int64
	}{
		{1, 0},
		{1, 1},
		{1, 2},
		{1, 3},
		{1, 4},
		{1, 5},
		{1, 6},
		{1, 6},
	}
	for _, tt := range tests {
		mgr.increasePullTPS("rocketmq", "default", tt.RT)
		mgr.topicAndGroupPullTPS.samplingInSeconds()
		snapshot := mgr.getPullTPS("rocketmq", "default")
		if snapshot.sum != tt.ExpectSum {
			t.Errorf("wrong Pull TPS sum. want=%d, got=%d", tt.ExpectSum, snapshot.sum)
		}
	}
}

func TestIncreaseConsumeOKTPSGetConsumeOKTPS(t *testing.T) {
	mgr := NewStatsManager()
	mgr.ShutDownStat()
	tests := []struct {
		RT        int
		ExpectSum int64
	}{
		{1, 0},
		{1, 1},
		{1, 2},
		{1, 3},
		{1, 4},
		{1, 5},
		{1, 6},
		{1, 6},
	}
	for _, tt := range tests {
		mgr.increaseConsumeOKTPS("rocketmq", "default", tt.RT)
		mgr.topicAndGroupConsumeOKTPS.samplingInSeconds()
		snapshot := mgr.getConsumeOKTPS("rocketmq", "default")
		if snapshot.sum != tt.ExpectSum {
			t.Errorf("wrong Consume OK TPS sum. want=%d, got=%d", tt.ExpectSum, snapshot.sum)
		}
	}
}

func TestIncreaseConsumeFailedTPSGetConsumeFailedTPS(t *testing.T) {
	mgr := NewStatsManager()
	mgr.ShutDownStat()
	tests := []struct {
		RT        int
		ExpectSum int64
	}{
		{1, 0},
		{1, 1},
		{1, 2},
		{1, 3},
		{1, 4},
		{1, 5},
		{1, 6},
		{1, 6},
	}
	for _, tt := range tests {
		mgr.increaseConsumeFailedTPS("rocketmq", "default", tt.RT)
		mgr.topicAndGroupConsumeFailedTPS.samplingInSeconds()
		snapshot := mgr.getConsumeFailedTPS("rocketmq", "default")
		if snapshot.sum != tt.ExpectSum {
			t.Errorf("wrong Consume Failed TPS sum. want=%d, got=%d", tt.ExpectSum, snapshot.sum)
		}
	}
}

func TestGetConsumeStatus(t *testing.T) {
	mgr := NewStatsManager()
	mgr.ShutDownStat()
	group, topic := "rocketmq", "default"

	tests := []struct {
		RT                int
		ExpectFailMessage int64
	}{
		{1, 0},
		{1, 1},
		{1, 2},
		{1, 3},
		{1, 4},
	}
	for _, tt := range tests {
		mgr.increasePullRT(group, topic, int64(tt.RT))
		mgr.increasePullTPS(group, topic, tt.RT)
		mgr.increaseConsumeRT(group, topic, int64(tt.RT))
		mgr.increaseConsumeOKTPS(group, topic, tt.RT)
		mgr.increaseConsumeFailedTPS(group, topic, tt.RT)
		mgr.topicAndGroupPullRT.samplingInSeconds()
		mgr.topicAndGroupPullTPS.samplingInSeconds()
		mgr.topicAndGroupConsumeRT.samplingInMinutes()
		mgr.topicAndGroupConsumeOKTPS.samplingInSeconds()
		mgr.topicAndGroupConsumeFailedTPS.samplingInMinutes()
		status := mgr.GetConsumeStatus(group, topic)
		if status.ConsumeFailedMsgs != tt.ExpectFailMessage {
			t.Errorf("wrong ConsumeFailedMsg. want=0, got=%d", status.ConsumeFailedMsgs)
		}
	}
}
