| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package main_test |
| |
| import ( |
| "bytes" |
| "fmt" |
| "io" |
| "io/ioutil" |
| "net/http" |
| "net/url" |
| "os" |
| "strings" |
| "testing" |
| "time" |
| |
| "v.io/x/ref/test/expect" |
| "v.io/x/ref/test/v23test" |
| ) |
| |
| func TestV23Benarchd(t *testing.T) { |
| v23test.SkipUnlessRunningIntegrationTests(t) |
| sh := v23test.NewShell(t, nil) |
| defer sh.Cleanup() |
| |
| // Startup benarchd |
| dbfile := tempFile(t) |
| defer os.Remove(dbfile) |
| benarchd := sh.Cmd( |
| v23test.BuildGoPkg(sh, "v.io/x/ref/services/ben/benarchd"), |
| "--store=sqlite3:"+dbfile, |
| "--v23.tcp.address=127.0.0.1:0", |
| "--logtostderr"). |
| WithCredentials(sh.ForkCredentials("benarchd")) |
| S := expect.NewSession(t, benarchd.StderrPipe(), time.Minute/2) |
| benarchd.Start() |
| S.SetVerbosity(testing.Verbose()) |
| var httpaddr, v23addr string |
| if e := S.ExpectSetEventuallyRE(".*HTTP server at (.*)$"); len(e) > 0 && len(e[0]) > 1 { |
| httpaddr = e[0][1] |
| } |
| if e := S.ExpectSetEventuallyRE(".*v23 server at (.*)$"); len(e) > 0 && len(e[0]) > 1 { |
| v23addr = e[0][1] |
| } |
| |
| // Fire up a few uploads from benup |
| benup := sh.Cmd(v23test.BuildGoPkg(sh, "v.io/x/ref/services/ben/benup"), "--archiver", v23addr).WithCredentials(sh.ForkCredentials("benupuser")) |
| benup.SetStdinReader(bytes.NewBufferString(` |
| BENDROIDCPU_ARCHITECTURE=arm64-v8a,armeabi-v7a,armeabi |
| BENDROIDCPU_DESCRIPTION=google Nexus 5X bullhead |
| BENDROIDOS_VERSION=6.0.1 (Build MMB29Q Release 2480792 SDK 23) |
| PASS |
| BenchmarkGood-4 1111111111 1 ns/op |
| BenchmarkThroughput-4 2222222222 2 ns/op 3 MB/s |
| BenchmarkAllocs-4 33333333 4 ns/op 5 B/op 6 allocs/op |
| BenchmarkAllMetrics-4 44444444 700 ns/op 80 MB/s 90 B/op 10 allocs/op |
| BenchmarkBad-4 --- FAIL: BenchmarkBad-4 |
| testdata_test.go:54: BenchmarkBad intentionally fails |
| ok path/to/some/package 4.728s |
| |
| `)) |
| benup.Run() |
| |
| benup = benup.Clone() |
| benup.SetStdinReader(bytes.NewBufferString(` |
| BENDROIDCPU_ARCHITECTURE=armeabi-v7a,armeabi |
| BENDROIDCPU_DESCRIPTION=google Nexus 7 razor |
| BENDROIDOS_VERSION=5.1.1 (Build LMY48I Release 2074855 SDK 22) |
| PASS |
| BenchmarkGood-4 5555555555 10 ns/op |
| BenchmarkThroughput-4 6666666666 11 ns/op 12.13 MB/s |
| BenchmarkAllocs-4 77777777 140 ns/op 150 B/op 16 allocs/op |
| BenchmarkAllMetrics-4 88888888 170 ns/op 180 MB/s 190 B/op 20 allocs/op |
| BenchmarkBad-4 --- FAIL: BenchmarkBad-4 |
| testdata_test.go:54: BenchmarkBad intentionally fails |
| ok path/to/some/package 4.728s |
| `)) |
| benup.Run() |
| |
| // Sanity check: HTTP requests made to the web ui. |
| mkurl := func(query string) string { |
| return fmt.Sprintf("%v/?q=%v", httpaddr, url.QueryEscape(query)) |
| } |
| // Homepage: |
| if err := testHTTP(httpaddr); err != nil { |
| t.Error(err) |
| } |
| // Query that leads to empty results |
| if err := testHTTP(mkurl("ThisHasNoResult"), "No results for [ThisHasNoResult]"); err != nil { |
| t.Error(err) |
| } |
| // Query that is satisfied by one benchmark, so runs will be rendered |
| if err := testHTTP(mkurl(`cpu:"Nexus 7 RAZOR" Throughput`), |
| "path/to/some/package.BenchmarkThroughput", |
| "android (5.1.1 (build lmy48i release 2074855 sdk 22))", |
| "root:benupuser", |
| "11</span>ns</div></td>", // ns/op |
| "<td>12.13</td>", |
| "<td>6666666666</td>"); err != nil { |
| t.Error(err) |
| } |
| // Query that leads to multiple benchmarks/scenarios |
| if err := testHTTP(mkurl(`cpu:nexus os:android Benchmark`), |
| "path/to/some/package.BenchmarkGood", |
| "path/to/some/package.BenchmarkThroughput", |
| "path/to/some/package.BenchmarkAllocs", |
| "path/to/some/package.BenchmarkAllMetrics", |
| "google nexus 5x bullhead", |
| "google nexus 7 razor"); err != nil { |
| t.Error(err) |
| } |
| } |
| |
| func testHTTP(url string, expect ...string) error { |
| resp, err := http.Get(url) |
| if err != nil { |
| return fmt.Errorf("GET %v failed: %v", url, err) |
| } |
| defer resp.Body.Close() |
| if resp.StatusCode != http.StatusOK { |
| return fmt.Errorf("GET %v returned %v", url, resp.StatusCode) |
| } |
| if len(expect) == 0 { |
| return nil |
| } |
| buf := bytes.NewBuffer(nil) |
| io.Copy(buf, resp.Body) |
| body := buf.String() |
| for _, e := range expect { |
| if !strings.Contains(body, e) { |
| return fmt.Errorf("failed to find [%v] in contents of %q\n%v\n", e, url, body) |
| } |
| } |
| return nil |
| } |
| |
| func tempFile(t *testing.T) string { |
| f, err := ioutil.TempFile(os.TempDir(), "TestV23Benarchd") |
| if err != nil { |
| t.Fatal(err) |
| } |
| defer f.Close() |
| return f.Name() |
| } |
| |
| func TestMain(m *testing.M) { |
| v23test.TestMain(m) |
| } |