package netflow

import (
	"testing"
)

func benchTemplatesAdd(ts NetFlowTemplateSystem, obs uint32, N int, b *testing.B) {
	for n := 0; n <= N; n++ {
		if _, err := ts.AddTemplate(10, obs, uint16(n), n); err != nil {
			b.Fatal(err)
		}
	}
}

func BenchmarkTemplatesAdd(b *testing.B) {
	ts := CreateTemplateSystem()
	b.Log("Creating", b.N, "templates")
	benchTemplatesAdd(ts, uint32(b.N)%0xffff+1, b.N, b)
}

func BenchmarkTemplatesAddGet(b *testing.B) {
	ts := CreateTemplateSystem()
	templates := 1000
	b.Log("Adding", templates, "templates")
	benchTemplatesAdd(ts, 1, templates, b)
	b.Log("Getting", b.N, "templates")

	for n := 0; n <= b.N; n++ {
		data, err := ts.GetTemplate(10, 1, uint16(n%templates))
		if err != nil {
			b.Fatal(err)
		}
		dataC, ok := data.(int)
		if !ok {
			b.Fatal("template not an integer")
		}
		if dataC != n%templates {
			b.Fatal("different values", dataC, "!=", n%templates)
		}
	}
}
