package conprof

import (
	"testing"

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

func Test_extractFilenameFromObjectKey(t *testing.T) {
	key := "0/1369847559691427383/1369847559691457760/1373933076662920573/profiles/" +
		"1698657360-pd-cpu-ZGItcGQtMC5kYi1wZC1wZWVyLnRpZGIxMzczOTMzMDc2NjYyOTIwNTczLnN2YzoyMzc5.log"
	r := extractFilenameFromObjectKey(key)
	require.Equal(t, "1698657360-pd-cpu-ZGItcGQtMC5kYi1wZC1wZWVyLnRpZGIxMzczOTMzMDc2NjYyOTIwNTczLnN2YzoyMzc5", r)

	key = "0/1369847559691427383/1369847559691457760/1373933076662920573/profiles/" +
		"1698657360-pd-cpu-ZGItcGQtMC5kYi1wZC1wZWVyLnRpZGIxMzczOTMzMDc2NjYyOTIwNTczLnN2YzoyMzc5.log.gz"
	r = extractFilenameFromObjectKey(key)
	require.Equal(t, "1698657360-pd-cpu-ZGItcGQtMC5kYi1wZC1wZWVyLnRpZGIxMzczOTMzMDc2NjYyOTIwNTczLnN2YzoyMzc5", r)
}

func Test_extractTsFromFilename(t *testing.T) {
	filename := "1698657360-pd-cpu-ZGItcGQtMC5kYi1wZC1wZWVyLnRpZGIxMzczOTMzMDc2NjYyOTIwNTczLnN2YzoyMzc5"
	require.Equal(t, int64(1698657360), extractTsFromFilename(filename))
}

func Test_extractProfileMetaFromFilename(t *testing.T) {
	filename := "1698657360-pd-cpu-ZGItcGQtMC5kYi1wZC1wZWVyLnRpZGIxMzczOTMzMDc2NjYyOTIwNTczLnN2YzoyMzc5"
	meta := extractProfileMetaFromFilename(filename)
	require.Equal(t, int64(1698657360), meta.Ts)
	require.Equal(t, "pd", meta.Component)
	require.Equal(t, "cpu", meta.ProfileType)
	require.Equal(t, "db-pd-0.db-pd-peer.tidb1373933076662920573.svc:2379", meta.Address)

	// Component with underscore (e.g. coprocessor_worker) must be accepted.
	filename2 := "1772810040-coprocessor_worker-heap-MTAuMC4xOS41NDoxOTAwMA"
	meta2 := extractProfileMetaFromFilename(filename2)
	require.Equal(t, int64(1772810040), meta2.Ts)
	require.Equal(t, "coprocessor_worker", meta2.Component)
	require.Equal(t, "heap", meta2.ProfileType)
	require.Equal(t, "10.0.19.54:19000", meta2.Address)
}

func Test_extractProfileMetaFromFilename_RealS3Key(t *testing.T) {
	// Real key from S3: 1773049740-coprocessor_worker-heap-ZGItM2RhNjQ5NTktY29wcm9jZXNzb3ItdGlrdi13b3JrZXItcmJoY2V2.log.gz
	key := "0/tenant/project/cluster/profiles/1773049740-coprocessor_worker-heap-ZGItM2RhNjQ5NTktY29wcm9jZXNzb3ItdGlrdi13b3JrZXItcmJoY2V2.log.gz"
	filename := extractFilenameFromObjectKey(key)
	require.Equal(t, "1773049740-coprocessor_worker-heap-ZGItM2RhNjQ5NTktY29wcm9jZXNzb3ItdGlrdi13b3JrZXItcmJoY2V2", filename)

	meta := extractProfileMetaFromFilename(filename)
	require.Equal(t, int64(1773049740), meta.Ts, "Ts")
	require.Equal(t, "coprocessor_worker", meta.Component, "Component")
	require.Equal(t, "heap", meta.ProfileType, "ProfileType")
	require.NotEmpty(t, meta.Address, "Address (base64-decoded pod name)")
	require.Equal(t, "db-3da64959-coprocessor-tikv-worker-rbhcev", meta.Address, "Address")
}

func Test_extractProfileMetaFromFilename_WorkerTidb(t *testing.T) {
	// Component can contain hyphen, e.g. worker-tidb.
	key := "0/tenant/project/cluster/profiles/1773100020-worker-tidb-cpu-ZGItM2RhNjQ5NTktd29ya2VyLXRpZGItdTNlb3Az.log.gz"
	filename := extractFilenameFromObjectKey(key)
	require.Equal(t, "1773100020-worker-tidb-cpu-ZGItM2RhNjQ5NTktd29ya2VyLXRpZGItdTNlb3Az", filename)

	meta := extractProfileMetaFromFilename(filename)
	require.Equal(t, int64(1773100020), meta.Ts, "Ts")
	require.Equal(t, "worker-tidb", meta.Component, "Component")
	require.Equal(t, "cpu", meta.ProfileType, "ProfileType")
	require.NotEmpty(t, meta.Address, "Address")
	require.Equal(t, "db-3da64959-worker-tidb-u3eop3", meta.Address, "Address")
}

func Test_longestCommonPrefix(t *testing.T) {
	require.Equal(t, "fa", longestCommonPrefix([]string{"fan", "fat", "fame"}))
	require.Equal(t, "", longestCommonPrefix([]string{"bat", "van", "cat"}))
}
