// Copyright 2017 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build cgo
// +build cgo

package app

import (
	"encoding/json"
	"fmt"
	"io"
	"mime/multipart"
	"net/http"
	"net/url"
	"reflect"
	"testing"

	"golang.org/x/build/perfdata"
	"golang.org/x/perf/storage/benchfmt"
)

func TestQuery(t *testing.T) {
	app := createTestApp(t)
	defer app.Close()

	// Write 1024 test results to the database.  These results
	// have labels named label0, label1, etc. Each label's value
	// is an integer whose value is (record number) / (1 << label
	// number).  So 1 record has each value of label0, 2 records
	// have each value of label1, 4 records have each value of
	// label2, etc. This allows writing queries that match 2^n records.
	status := app.uploadFiles(t, func(mpw *multipart.Writer) {
		w, err := mpw.CreateFormFile("file", "path/1.txt")
		if err != nil {
			t.Errorf("CreateFormFile: %v", err)
		}
		bp := benchfmt.NewPrinter(w)
		for i := 0; i < 1024; i++ {
			r := &benchfmt.Result{Labels: make(map[string]string), NameLabels: make(map[string]string), Content: "BenchmarkName 1 ns/op"}
			for j := uint(0); j < 10; j++ {
				r.Labels[fmt.Sprintf("label%d", j)] = fmt.Sprintf("%d", i/(1<<j))
			}
			r.NameLabels["name"] = "Name"
			if err := bp.Print(r); err != nil {
				t.Fatalf("Print: %v", err)
			}
		}
	})

	tests := []struct {
		q    string
		want []int
	}{
		{"label0:0", []int{0}},
		{"label1:0", []int{0, 1}},
		{"label0:5 name:Name", []int{5}},
		{"label0:0 label0:5", nil},
	}
	for _, test := range tests {
		t.Run("query="+test.q, func(t *testing.T) {
			u := app.srv.URL + "/search?" + url.Values{"q": []string{test.q}}.Encode()
			resp, err := http.Get(u)
			if err != nil {
				t.Fatal(err)
			}
			defer resp.Body.Close()
			if resp.StatusCode != 200 {
				t.Fatalf("get /search: %v", resp.Status)
			}
			br := benchfmt.NewReader(resp.Body)
			for i, num := range test.want {
				if !br.Next() {
					t.Fatalf("#%d: Next() = false, want true (Err() = %v)", i, br.Err())
				}
				r := br.Result()
				if r.Labels["upload"] != status.UploadID {
					t.Errorf("#%d: upload = %q, want %q", i, r.Labels["upload"], status.UploadID)
				}
				if r.Labels["upload-part"] != status.FileIDs[0] {
					t.Errorf("#%d: upload-part = %q, want %q", i, r.Labels["upload-part"], status.FileIDs[0])
				}
				if r.Labels["upload-file"] != "1.txt" {
					t.Errorf("#%d: upload-file = %q, want %q", i, r.Labels["upload-file"], "1.txt")
				}
				if r.Labels["label0"] != fmt.Sprintf("%d", num) {
					t.Errorf("#%d: label0 = %q, want %d", i, r.Labels["label0"], num)
				}
				if r.NameLabels["name"] != "Name" {
					t.Errorf("#%d: name = %q, want %q", i, r.NameLabels["name"], "Name")
				}
				if r.Labels["by"] != "user" {
					t.Errorf("#%d: by = %q, want %q", i, r.Labels["uploader"], "user")
				}
			}
			if br.Next() {
				t.Fatalf("Next() = true, want false")
			}
			if err := br.Err(); err != nil {
				t.Errorf("Err() = %v, want nil", err)
			}
		})
	}
}

func TestUploads(t *testing.T) {
	app := createTestApp(t)
	defer app.Close()

	// Write 9 uploads to the database. These uploads have 1-9
	// results each, a common label "i" set to the upload number,
	// and a label "j" set to the record number within the upload.
	var uploadIDs []string
	for i := 0; i < 9; i++ {
		status := app.uploadFiles(t, func(mpw *multipart.Writer) {
			w, err := mpw.CreateFormFile("file", "path/1.txt")
			if err != nil {
				t.Errorf("CreateFormFile: %v", err)
			}
			bp := benchfmt.NewPrinter(w)
			for j := 0; j <= i; j++ {
				r := &benchfmt.Result{Labels: map[string]string{"i": fmt.Sprintf("%d", i)}, NameLabels: make(map[string]string), Content: "BenchmarkName 1 ns/op"}
				r.Labels["j"] = fmt.Sprintf("%d", j)
				if err := bp.Print(r); err != nil {
					t.Fatalf("Print: %v", err)
				}
			}
		})
		uploadIDs = append(uploadIDs, status.UploadID)
	}

	tests := []struct {
		q           string
		extraLabels []string
		want        []perfdata.UploadInfo
	}{
		{"", nil, []perfdata.UploadInfo{
			{9, uploadIDs[8], nil}, {8, uploadIDs[7], nil}, {7, uploadIDs[6], nil}, {6, uploadIDs[5], nil}, {5, uploadIDs[4], nil}, {4, uploadIDs[3], nil}, {3, uploadIDs[2], nil}, {2, uploadIDs[1], nil}, {1, uploadIDs[0], nil},
		}},
		{"j:5", nil, []perfdata.UploadInfo{{1, uploadIDs[8], nil}, {1, uploadIDs[7], nil}, {1, uploadIDs[6], nil}, {1, uploadIDs[5], nil}}},
		{"i:5", []string{"i"}, []perfdata.UploadInfo{{6, uploadIDs[5], benchfmt.Labels{"i": "5"}}}},
		{"not:found", nil, nil},
	}
	for _, test := range tests {
		t.Run("query="+test.q, func(t *testing.T) {
			u := app.srv.URL + "/uploads"
			uv := url.Values{}
			if test.q != "" {
				uv["q"] = []string{test.q}
			}
			if test.extraLabels != nil {
				uv["extra_label"] = test.extraLabels
			}
			if len(uv) > 0 {
				u += "?" + uv.Encode()
			}

			resp, err := http.Get(u)
			if err != nil {
				t.Fatal(err)
			}
			defer resp.Body.Close()
			if resp.StatusCode != 200 {
				t.Fatalf("get /uploads: %v", resp.Status)
			}
			dec := json.NewDecoder(resp.Body)
			i := 0
			for {
				var ui perfdata.UploadInfo
				if err := dec.Decode(&ui); err == io.EOF {
					break
				} else if err != nil {
					t.Fatalf("failed to parse UploadInfo: %v", err)
				}
				if i > len(test.want) {
					t.Fatalf("too many responses: have %d+ want %d", i, len(test.want))
				}
				if !reflect.DeepEqual(ui, test.want[i]) {
					t.Errorf("uploadinfo = %#v, want %#v", ui, test.want[i])
				}
				i++
			}
			if i < len(test.want) {
				t.Fatalf("missing responses: have %d want %d", i, len(test.want))
			}
		})
	}
}
