| OLD | NEW |
| (Empty) |
| 1 // Copyright 2016 The LUCI Authors. All rights reserved. | |
| 2 // Use of this source code is governed under the Apache License, Version 2.0 | |
| 3 // that can be found in the LICENSE file. | |
| 4 | |
| 5 package buildbot | |
| 6 | |
| 7 import ( | |
| 8 "testing" | |
| 9 | |
| 10 "google.golang.org/grpc" | |
| 11 "google.golang.org/grpc/codes" | |
| 12 | |
| 13 "github.com/luci/gae/impl/memory" | |
| 14 ds "github.com/luci/gae/service/datastore" | |
| 15 "github.com/luci/luci-go/common/clock/testclock" | |
| 16 milo "github.com/luci/luci-go/milo/api/proto" | |
| 17 . "github.com/smartystreets/goconvey/convey" | |
| 18 "golang.org/x/net/context" | |
| 19 ) | |
| 20 | |
| 21 func TestGRPC(t *testing.T) { | |
| 22 c := memory.Use(context.Background()) | |
| 23 c, _ = testclock.UseTime(c, testclock.TestTimeUTC) | |
| 24 | |
| 25 Convey(`A test environment`, t, func() { | |
| 26 name := "testmaster" | |
| 27 bname := "testbuilder" | |
| 28 master := &buildbotMaster{ | |
| 29 Name: name, | |
| 30 Builders: map[string]*buildbotBuilder{"fake": {}}, | |
| 31 Slaves: map[string]*buildbotSlave{ | |
| 32 "foo": { | |
| 33 RunningbuildsMap: map[string][]int{ | |
| 34 "fake": {1}, | |
| 35 }, | |
| 36 }, | |
| 37 }, | |
| 38 } | |
| 39 | |
| 40 So(putDSMasterJSON(c, master, false), ShouldBeNil) | |
| 41 So(ds.Put(c, &buildbotBuild{ | |
| 42 Master: name, | |
| 43 Buildername: "fake", | |
| 44 Number: 1, | |
| 45 }), ShouldBeNil) | |
| 46 ds.GetTestable(c).Consistent(true) | |
| 47 ds.GetTestable(c).AutoIndex(true) | |
| 48 svc := Service{} | |
| 49 | |
| 50 Convey(`Get finished builds`, func() { | |
| 51 // Add in some builds. | |
| 52 for i := 0; i < 5; i++ { | |
| 53 ds.Put(c, &buildbotBuild{ | |
| 54 Master: name, | |
| 55 Buildername: bname, | |
| 56 Number: i, | |
| 57 Finished: true, | |
| 58 }) | |
| 59 } | |
| 60 ds.Put(c, &buildbotBuild{ | |
| 61 Master: name, | |
| 62 Buildername: bname, | |
| 63 Number: 6, | |
| 64 Finished: false, | |
| 65 }) | |
| 66 ds.GetTestable(c).CatchupIndexes() | |
| 67 | |
| 68 r := &milo.BuildbotBuildsRequest{ | |
| 69 Master: name, | |
| 70 Builder: bname, | |
| 71 } | |
| 72 result, err := svc.GetBuildbotBuildsJSON(c, r) | |
| 73 So(err, ShouldBeNil) | |
| 74 So(len(result.Builds), ShouldEqual, 5) | |
| 75 | |
| 76 Convey(`Also get incomplete builds`, func() { | |
| 77 r := &milo.BuildbotBuildsRequest{ | |
| 78 Master: name, | |
| 79 Builder: bname, | |
| 80 IncludeCurrent: true, | |
| 81 } | |
| 82 result, err := svc.GetBuildbotBuildsJSON(c, r) | |
| 83 So(err, ShouldBeNil) | |
| 84 So(len(result.Builds), ShouldEqual, 6) | |
| 85 }) | |
| 86 | |
| 87 Convey(`Good cursor`, func() { | |
| 88 r.Cursor = result.GetCursor() | |
| 89 _, err := svc.GetBuildbotBuildsJSON(c, r) | |
| 90 So(err, ShouldBeNil) | |
| 91 }) | |
| 92 Convey(`Bad cursor`, func() { | |
| 93 r.Cursor = "foobar" | |
| 94 _, err := svc.GetBuildbotBuildsJSON(c, r) | |
| 95 So(err, ShouldResemble, | |
| 96 grpc.Errorf(codes.InvalidArgument, | |
| 97 "Invalid cursor: Failed to Base6
4-decode cursor: illegal base64 data at input byte 4")) | |
| 98 }) | |
| 99 Convey(`Bad request`, func() { | |
| 100 _, err := svc.GetBuildbotBuildsJSON(c, &milo.Bui
ldbotBuildsRequest{}) | |
| 101 So(err, ShouldResemble, grpc.Errorf(codes.Invali
dArgument, "No master specified")) | |
| 102 _, err = svc.GetBuildbotBuildsJSON(c, &milo.Buil
dbotBuildsRequest{Master: name}) | |
| 103 So(err, ShouldResemble, grpc.Errorf(codes.Invali
dArgument, "No builder specified")) | |
| 104 }) | |
| 105 }) | |
| 106 | |
| 107 Convey(`Get Master`, func() { | |
| 108 Convey(`Bad request`, func() { | |
| 109 _, err := svc.GetCompressedMasterJSON(c, &milo.M
asterRequest{}) | |
| 110 So(err, ShouldResemble, grpc.Errorf(codes.Invali
dArgument, "No master specified")) | |
| 111 }) | |
| 112 _, err := svc.GetCompressedMasterJSON(c, &milo.MasterReq
uest{Name: name}) | |
| 113 So(err, ShouldBeNil) | |
| 114 }) | |
| 115 | |
| 116 Convey(`Get Build`, func() { | |
| 117 Convey(`Invalid input`, func() { | |
| 118 _, err := svc.GetBuildbotBuildJSON(c, &milo.Buil
dbotBuildRequest{}) | |
| 119 So(err, ShouldResemble, grpc.Errorf(codes.Invali
dArgument, "No master specified")) | |
| 120 _, err = svc.GetBuildbotBuildJSON(c, &milo.Build
botBuildRequest{ | |
| 121 Master: "foo", | |
| 122 }) | |
| 123 So(err, ShouldResemble, grpc.Errorf(codes.Invali
dArgument, "No builder specified")) | |
| 124 }) | |
| 125 Convey(`Basic`, func() { | |
| 126 _, err := svc.GetBuildbotBuildJSON(c, &milo.Buil
dbotBuildRequest{ | |
| 127 Master: name, | |
| 128 Builder: "fake", | |
| 129 BuildNum: 1, | |
| 130 }) | |
| 131 So(err, ShouldBeNil) | |
| 132 }) | |
| 133 Convey(`Basic Not found`, func() { | |
| 134 _, err := svc.GetBuildbotBuildJSON(c, &milo.Buil
dbotBuildRequest{ | |
| 135 Master: name, | |
| 136 Builder: "fake", | |
| 137 BuildNum: 2, | |
| 138 }) | |
| 139 So(err, ShouldResemble, grpc.Errorf(codes.Unauth
enticated, "Unauthenticated request")) | |
| 140 }) | |
| 141 }) | |
| 142 }) | |
| 143 } | |
| OLD | NEW |