package vm

import (
	"bytes"
	"testing"
)

var args = metricsQueryArgs{
	Provider:  "aws",
	Region:    "us-west-2",
	TenantID:  10,
	ProjectID: 20,
	ClusterID: 30,

	Instance:     "tidb:10080",
	InstanceType: "tidb",
	Topk:         5,
	WindowSecs:   15,
	RangeSecs:    10000000,

	TopkRegex:       "a|b|c|d",
	PlanDigestRegex: "i|j|k|l",
}

func TestTopKQuery(t *testing.T) {
	buf := bytes.NewBuffer(nil)
	if err := topkQueryTmp.Execute(buf, args); err != nil {
		t.Fatal(err)
	}

	expected := `
topk(
  5,
  sum by (sql_digest) (
    sum_over_time(
      topsql_cpu_time_ms{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",
      }[10000000s]
    )
  )
)`
	got := buf.String()
	if got != expected {
		t.Fatalf("expected %q, got %q", expected, got)
	}
}

func TestCpuTimeQuery(t *testing.T) {
	buf := bytes.NewBuffer(nil)
	if err := cpuTimeQueryTmp.Execute(buf, args); err != nil {
		t.Fatal(err)
	}

	expected := `
label_set(
  sum by (sql_digest, plan_digest) (
    sum_over_time(
      topsql_cpu_time_ms{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest=~"a|b|c|d",
      }[15s]
    )
  ),
  "is_other", "false"
) or label_set(
  sum(
    sum_over_time(
      topsql_cpu_time_ms{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest!~"a|b|c|d",
      }[15s]
    )
  ),
  "is_other", "true"
)`

	got := buf.String()
	if got != expected {
		t.Fatalf("expected %q, got %q", expected, got)
	}
}

func TestSummaryQuery(t *testing.T) {
	buf := bytes.NewBuffer(nil)
	if err := summaryQueryTmp.Execute(buf, args); err != nil {
		t.Fatal(err)
	}

	expected := `
label_set(
  (
    label_set(
      sum by (sql_digest) (sum_over_time(topsql_cpu_time_ms{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest=~"a|b|c|d",
      }[10000000s])),
      "summary_type", "cpu_time_ms"
    ) or label_set(
      sum by (sql_digest) (sum_over_time(topsql_stmt_exec_count{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest=~"a|b|c|d",
      }[10000000s])) / 10000000,
      "summary_type", "exec_count_per_sec"
    ) or label_set(
      (sum by (sql_digest) (sum_over_time(topsql_stmt_duration_sum_ns{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",
        
        sql_digest=~"a|b|c|d",
      }[10000000s])) / 1000000) /
      (sum by (sql_digest) (sum_over_time(topsql_stmt_duration_count{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest=~"a|b|c|d",
      }[10000000s]))),
      "summary_type", "duration_per_exec_ms"
    ) or label_set(
      sum by (sql_digest) (sum_over_time(topsql_read_keys{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest=~"a|b|c|d",
        tag_label="row",
      }[10000000s])) / 10000000,
      "summary_type", "scan_records_per_sec"
    ) or label_set(
      sum by (sql_digest) (sum_over_time(topsql_read_keys{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest=~"a|b|c|d",
        tag_label="index",
      }[10000000s])) / 10000000,
      "summary_type", "scan_indexes_per_sec"
    )
  ),
  "is_grouped", "true", "is_other", "false"
) or label_set(
  (
    label_set(
      sum by (sql_digest, plan_digest) (sum_over_time(topsql_stmt_exec_count{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",
        
        sql_digest=~"a|b|c|d",
      }[10000000s])) / 10000000,
      "summary_type", "exec_count_per_sec"
    ) or label_set(
      (sum by (sql_digest, plan_digest) (sum_over_time(topsql_stmt_duration_sum_ns{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest=~"a|b|c|d",
      }[10000000s])) / 1000000) /
      (sum by (sql_digest, plan_digest) (sum_over_time(topsql_stmt_duration_count{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest=~"a|b|c|d",
      }[10000000s]))),
      "summary_type", "duration_per_exec_ms"
    ) or label_set(
      sum by (sql_digest, plan_digest) (sum_over_time(topsql_read_keys{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest=~"a|b|c|d",
        tag_label="row",
      }[10000000s])) / 10000000,
      "summary_type", "scan_records_per_sec"
    ) or label_set(
      sum by (sql_digest, plan_digest) (sum_over_time(topsql_read_keys{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest=~"a|b|c|d",
        tag_label="index",
      }[10000000s])) / 10000000,
      "summary_type", "scan_indexes_per_sec"
    )
  ),
  "is_grouped", "false", "is_other", "false"
) or label_set(
  (
    label_set(
      sum(sum_over_time(topsql_cpu_time_ms{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest!~"a|b|c|d",
      }[10000000s])),
      "summary_type", "cpu_time_ms"
    ) or label_set(
      sum(sum_over_time(topsql_stmt_exec_count{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest!~"a|b|c|d",
      }[10000000s])) / 10000000,
      "summary_type", "exec_count_per_sec"
    ) or label_set(
      (sum(sum_over_time(topsql_stmt_duration_sum_ns{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest!~"a|b|c|d",
      }[10000000s])) / 1000000) /
      (sum(sum_over_time(topsql_stmt_duration_count{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest!~"a|b|c|d",
      }[10000000s]))),
      "summary_type", "duration_per_exec_ms"
    ) or label_set(
      sum(sum_over_time(topsql_read_keys{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest!~"a|b|c|d",
        tag_label="row",
      }[10000000s])) / 10000000,
      "summary_type", "scan_records_per_sec"
    ) or label_set(
      sum(sum_over_time(topsql_read_keys{
        provider="aws",
        region="us-west-2",
        tenant_id="10",
        project_id="20",
        cluster_id="30",

        instance="tidb:10080",
        instance_type="tidb",

        sql_digest!~"a|b|c|d",
        tag_label="index",
      }[10000000s])) / 10000000,
      "summary_type", "scan_indexes_per_sec"
    )
  ),
  "is_grouped", "true", "is_other", "true"
)`

	got := buf.String()
	if got != expected {
		t.Fatalf("expected %q, got %q", expected, got)
	}
}

func TestMetaQuery(t *testing.T) {
	buf := bytes.NewBuffer(nil)
	if err := metaQueryTmp.Execute(buf, args); err != nil {
		t.Fatal(err)
	}

	expected := `
(
  present_over_time(topsql_sql_meta{
    provider="aws",
    region="us-west-2",
    tenant_id="10",
    project_id="20",
    cluster_id="30",

    sql_digest=~"a|b|c|d",
  }[10000000s])
) or (
  present_over_time(topsql_plan_meta{
    provider="aws",
    region="us-west-2",
    tenant_id="10",
    project_id="20",
    cluster_id="30",

    plan_digest=~"i|j|k|l",
  }[10000000s])
)`

	got := buf.String()
	if got != expected {
		t.Fatalf("expected %q, got %q", expected, got)
	}
}
