github.com/jgbaldwinbrown/perf@v0.1.1/storage/client_test.go (about)

     1  // Copyright 2017 The Go Authors.  All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package storage
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"io"
    11  	"net/http"
    12  	"net/http/httptest"
    13  	"reflect"
    14  	"testing"
    15  
    16  	"golang.org/x/net/context"
    17  	"golang.org/x/perf/internal/diff"
    18  	"golang.org/x/perf/storage/benchfmt"
    19  )
    20  
    21  func TestQueryError(t *testing.T) {
    22  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    23  		http.Error(w, "invalid query", 500)
    24  	}))
    25  	defer ts.Close()
    26  
    27  	c := &Client{BaseURL: ts.URL}
    28  
    29  	q := c.Query(context.Background(), "invalid query")
    30  	defer q.Close()
    31  
    32  	if q.Next() {
    33  		t.Error("Next = true, want false")
    34  	}
    35  	if q.Err() == nil {
    36  		t.Error("Err = nil, want error")
    37  	}
    38  }
    39  
    40  func TestQuery(t *testing.T) {
    41  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    42  		if have, want := r.URL.RequestURI(), "/search?q=key1%3Avalue+key2%3Avalue"; have != want {
    43  			t.Errorf("RequestURI = %q, want %q", have, want)
    44  		}
    45  		fmt.Fprintf(w, "key: value\nBenchmarkOne 5 ns/op\nkey: value2\nBenchmarkTwo 10 ns/op\n")
    46  	}))
    47  	defer ts.Close()
    48  
    49  	c := &Client{BaseURL: ts.URL}
    50  
    51  	q := c.Query(context.Background(), "key1:value key2:value")
    52  	defer q.Close()
    53  
    54  	var buf bytes.Buffer
    55  	bp := benchfmt.NewPrinter(&buf)
    56  
    57  	for q.Next() {
    58  		if err := bp.Print(q.Result()); err != nil {
    59  			t.Fatalf("Print: %v", err)
    60  		}
    61  	}
    62  	if err := q.Err(); err != nil {
    63  		t.Fatalf("Err: %v", err)
    64  	}
    65  	want := "key: value\nBenchmarkOne 5 ns/op\nkey: value2\nBenchmarkTwo 10 ns/op\n"
    66  	if diff := diff.Diff(buf.String(), want); diff != "" {
    67  		t.Errorf("wrong results: (- have/+ want)\n%s", diff)
    68  	}
    69  }
    70  
    71  func TestListUploads(t *testing.T) {
    72  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    73  		if have, want := r.URL.RequestURI(), "/uploads?extra_label=key1&extra_label=key2&limit=10&q=key1%3Avalue+key2%3Avalue"; have != want {
    74  			t.Errorf("RequestURI = %q, want %q", have, want)
    75  		}
    76  		fmt.Fprintf(w, "%s\n", `{"UploadID": "id", "Count": 100, "LabelValues": {"key1": "value"}}`)
    77  	}))
    78  	defer ts.Close()
    79  
    80  	c := &Client{BaseURL: ts.URL}
    81  
    82  	r := c.ListUploads(context.Background(), "key1:value key2:value", []string{"key1", "key2"}, 10)
    83  	defer r.Close()
    84  
    85  	if !r.Next() {
    86  		t.Errorf("Next = false, want true")
    87  	}
    88  	if have, want := r.Info(), (UploadInfo{Count: 100, UploadID: "id", LabelValues: benchfmt.Labels{"key1": "value"}}); !reflect.DeepEqual(have, want) {
    89  		t.Errorf("Info = %#v, want %#v", have, want)
    90  	}
    91  	if err := r.Err(); err != nil {
    92  		t.Fatalf("Err: %v", err)
    93  	}
    94  }
    95  
    96  func TestNewUpload(t *testing.T) {
    97  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    98  		if have, want := r.URL.RequestURI(), "/upload"; have != want {
    99  			t.Errorf("RequestURI = %q, want %q", have, want)
   100  		}
   101  		mr, err := r.MultipartReader()
   102  		if err != nil {
   103  			t.Error(err)
   104  		}
   105  		i := 0
   106  		for i = 0; ; i++ {
   107  			p, err := mr.NextPart()
   108  			if err == io.EOF {
   109  				break
   110  			}
   111  			name := p.FormName()
   112  			if name == "commit" {
   113  				continue
   114  			}
   115  			if name != "file" {
   116  				t.Errorf("unexpected field %q, want file", name)
   117  			}
   118  			if have, want := p.FileName(), fmt.Sprintf("want%d.txt", i); have != want {
   119  				t.Errorf("file name = %q, want %q", have, want)
   120  			}
   121  			content, _ := io.ReadAll(p)
   122  			if have, want := string(content), "content"; have != want {
   123  				t.Errorf("unexpected content %q, want %q", have, want)
   124  			}
   125  		}
   126  		if i != 3 {
   127  			t.Errorf("number of files = %d, want %d", i, 3)
   128  		}
   129  		fmt.Fprintf(w, "%s\n", `{"uploadid": "id", "fileids": ["id/1", "id/2"]}`)
   130  	}))
   131  	defer ts.Close()
   132  
   133  	c := &Client{BaseURL: ts.URL}
   134  
   135  	u := c.NewUpload(context.Background())
   136  	for i := 0; i < 2; i++ {
   137  		w, err := u.CreateFile(fmt.Sprintf("want%d.txt", i))
   138  		if err != nil {
   139  			t.Fatalf("CreateFile = %v", err)
   140  		}
   141  		if _, err := fmt.Fprintf(w, "content"); err != nil {
   142  			t.Fatalf("Write returned %v", err)
   143  		}
   144  	}
   145  	status, err := u.Commit()
   146  	if err != nil {
   147  		t.Errorf("Commit = %v", err)
   148  	}
   149  	if status.UploadID != "id" {
   150  		t.Errorf("status.UploadID = %q, want %q", status.UploadID, "id")
   151  	}
   152  }
   153  
   154  func TestNewUploadAbort(t *testing.T) {
   155  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   156  		if have, want := r.URL.RequestURI(), "/upload"; have != want {
   157  			t.Errorf("RequestURI = %q, want %q", have, want)
   158  		}
   159  		mr, err := r.MultipartReader()
   160  		if err != nil {
   161  			t.Error(err)
   162  		}
   163  		i := 0
   164  		for i = 0; ; i++ {
   165  			p, err := mr.NextPart()
   166  			if err == io.EOF {
   167  				break
   168  			}
   169  			name := p.FormName()
   170  			if name == "abort" {
   171  				continue
   172  			}
   173  			if name != "file" {
   174  				t.Errorf("unexpected field %q, want file or abort", name)
   175  			}
   176  			if have, want := p.FileName(), fmt.Sprintf("want%d.txt", i); have != want {
   177  				t.Errorf("file name = %q, want %q", have, want)
   178  			}
   179  			content, _ := io.ReadAll(p)
   180  			if have, want := string(content), "content"; have != want {
   181  				t.Errorf("unexpected content %q, want %q", have, want)
   182  			}
   183  		}
   184  		if i != 3 {
   185  			t.Errorf("number of files = %d, want %d", i, 3)
   186  		}
   187  		fmt.Fprintf(w, "%s\n", `{"uploadid": "id", "fileids": ["id/1", "id/2"]}`)
   188  	}))
   189  	defer ts.Close()
   190  
   191  	c := &Client{BaseURL: ts.URL}
   192  
   193  	u := c.NewUpload(context.Background())
   194  	for i := 0; i < 2; i++ {
   195  		w, err := u.CreateFile(fmt.Sprintf("want%d.txt", i))
   196  		if err != nil {
   197  			t.Fatalf("CreateFile = %v", err)
   198  		}
   199  		if _, err := fmt.Fprintf(w, "content"); err != nil {
   200  			t.Fatalf("Write returned %v", err)
   201  		}
   202  	}
   203  	if err := u.Abort(); err != nil {
   204  		t.Errorf("Abort = %v", err)
   205  	}
   206  }