Skip to content

Commit e0a1f3e

Browse files
committed
make storage tests synchronous
1 parent 43fadfe commit e0a1f3e

File tree

10 files changed

+759
-488
lines changed

10 files changed

+759
-488
lines changed

.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
.idea
2-
go.sum
32
bin
43
testapp
54
!testapp/

cmd/testapp/main.go

+87-24
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"crypto/tls"
66
"fmt"
77
"io/ioutil"
8+
"math/rand"
89
"net/http"
910
"os"
1011
"os/signal"
@@ -15,13 +16,15 @@ import (
1516

1617
"github.com/gorilla/mux"
1718
_ "github.com/lib/pq"
19+
log "github.com/sirupsen/logrus"
20+
flag "github.com/spf13/pflag"
21+
1822
"github.com/nais/testapp/pkg/bigquery"
1923
"github.com/nais/testapp/pkg/bucket"
2024
"github.com/nais/testapp/pkg/database"
2125
"github.com/nais/testapp/pkg/metrics"
26+
"github.com/nais/testapp/pkg/testable"
2227
"github.com/nais/testapp/pkg/version"
23-
log "github.com/sirupsen/logrus"
24-
flag "github.com/spf13/pflag"
2528
)
2629

2730
var (
@@ -107,6 +110,9 @@ func timeSinceDeploy() float64 {
107110
}
108111

109112
func main() {
113+
programContext, cancel := context.WithCancel(context.Background())
114+
defer cancel()
115+
110116
interrupt := make(chan os.Signal, 1)
111117
signal.Notify(interrupt, syscall.SIGTERM, syscall.SIGINT)
112118
hostname, _ := os.Hostname()
@@ -207,32 +213,56 @@ func main() {
207213
w.WriteHeader(http.StatusOK)
208214
_, _ = fmt.Fprintf(w, "HTTP status: %d, body:\n%s", resp.StatusCode, string(b))
209215
})
210-
// Bucket set-ups and endpoints
211-
r.HandleFunc("/readbucket", bucket.ReadBucketHandler(bucketName, bucketObjectName))
212-
r.HandleFunc("/writebucket", bucket.WriteBucketHandler(bucketName, bucketObjectName)).Methods(http.MethodPost)
213216

214-
// Ceph bucket set-ups and endpoints
217+
// Holds all tests. Possible feature: /test to run all tests
218+
var tests []testable.Testable
219+
220+
// Set up google bucket test
221+
bucketTest, err := bucket.NewGoogleBucketTest(programContext, bucketName, bucketObjectName)
222+
if err != nil {
223+
log.Errorf("Error setting up bucket test: %v", err)
224+
} else {
225+
tests = append(tests, bucketTest)
226+
}
227+
228+
// Set up ceph test
215229
if rgwAddress != "" && rgwAccessKey != "" && rgwSecretKey != "" {
216-
bucket.Ceph.CephInit(rgwAddress, bucketName, "us-east-1", rgwAccessKey, rgwSecretKey)
217-
r.HandleFunc("/readrgwbucket", bucket.Ceph.ReadBucketHandler(bucketObjectName))
218-
r.HandleFunc("/writergwbucket", bucket.Ceph.WriteBucketHandler(bucketObjectName)).Methods(http.MethodPost)
230+
cephTest, err := bucket.NewCephBucketTest(rgwAddress, bucketName, "us-east-1", rgwAccessKey, rgwSecretKey, bucketObjectName)
231+
if err != nil {
232+
log.Errorf("Error setting up ceph bucket test: %v", err)
233+
} else {
234+
tests = append(tests, cephTest)
235+
}
219236
}
220237

221-
// DB set-ups and endpoints
222-
r.HandleFunc("/writedb", database.WriteDatabaseHandler(dbUser, dbPassword, dbName, dbHost)).Methods(http.MethodPost)
223-
r.HandleFunc("/readdb", database.ReadDatabaseHandler(dbUser, dbPassword, dbName, dbHost))
238+
// Set up database test
239+
databaseTest, err := database.NewDatabaseTest(dbUser, dbPassword, dbName, dbHost)
240+
if err != nil {
241+
log.Errorf("Error setting up bucket test: %v", err)
242+
} else {
243+
tests = append(tests, databaseTest)
244+
}
224245

225-
// Bigquery set-ups and endpoints
246+
// Set up bigquery test
226247
if bigqueryName != "" && bigqueryTableName != "" {
227-
// Use input parameters as feature toggle for bigquery
228-
// since testrig will crash apparently
229-
err := bigquery.CreateDatasetAndTable(projectID, bigqueryName, bigqueryTableName)
230-
switch {
231-
case err != nil:
232-
log.Errorf("Unable to create bigquery dataset and table, all tests will return HTTP STATUS 404: %v", err)
233-
default:
234-
r.HandleFunc("/writebigquery", bigquery.WriteBigQueryHandler(projectID, bigqueryName, bigqueryTableName)).Methods(http.MethodPost)
235-
r.HandleFunc("/readbigquery", bigquery.ReadBigQueryHandler(projectID, bigqueryName, bigqueryTableName))
248+
bq, err := bigquery.NewBigqueryTest(programContext, projectID, bigqueryName, bigqueryTableName)
249+
err = bq.Init(programContext)
250+
if err != nil {
251+
log.Errorf("Error setting up bigquery test: %v", err)
252+
} else {
253+
tests = append(tests, bq)
254+
}
255+
}
256+
257+
for _, test := range tests {
258+
err := test.Init(programContext)
259+
if err != nil {
260+
log.Errorf("Error initializing test: %s, will not set up handler.", test.Name())
261+
} else {
262+
setupTestHandler(r, test)
263+
264+
//goland:noinspection GoDeferInLoop
265+
defer test.Cleanup()
236266
}
237267
}
238268

@@ -243,7 +273,10 @@ func main() {
243273
server := &http.Server{Addr: bindAddr, Handler: r}
244274

245275
go func() {
246-
log.Fatal(server.ListenAndServe())
276+
err := server.ListenAndServe()
277+
if err != http.ErrServerClosed {
278+
log.Errorf("closing http server: %v", err)
279+
}
247280
}()
248281

249282
<-interrupt
@@ -252,5 +285,35 @@ func main() {
252285
time.Sleep(time.Duration(gracefulShutdownPeriodSeconds) * time.Second)
253286
log.Print("shutting down")
254287

255-
_ = server.Shutdown(context.Background())
288+
_ = server.Shutdown(programContext)
289+
}
290+
291+
func setupTestHandler(router *mux.Router, test testable.Testable) {
292+
log.Infof("setting up %s test handler", test.Name())
293+
294+
path := fmt.Sprintf("%s/test", test.Name())
295+
router.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
296+
expected := fmt.Sprintf("%x", 9999+rand.Intn(999999))[:4]
297+
result, err := test.Test(r.Context(), expected)
298+
if err != nil {
299+
w.WriteHeader(http.StatusInternalServerError)
300+
_, respondErr := fmt.Fprintf(w, "%s test: error: %v", test.Name(), err)
301+
if respondErr != nil {
302+
log.Errorf("%s test: write response err: %v (test err: %v)", test.Name(), respondErr, err)
303+
} else {
304+
log.Warnf("%s test: failed, %v", test.Name(), err)
305+
}
306+
return
307+
}
308+
309+
if expected != result {
310+
w.WriteHeader(http.StatusInternalServerError)
311+
_, err := fmt.Fprintf(w, "%s test: data missmatch, epected: %s got: %s", test.Name(), expected, result)
312+
if err != nil {
313+
log.Errorf("%s test: unable to write response: %v", test.Name(), err)
314+
}
315+
} else {
316+
w.WriteHeader(http.StatusOK)
317+
}
318+
})
256319
}

go.mod

+30-1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,33 @@ require (
1313
google.golang.org/api v0.9.0
1414
)
1515

16-
go 1.16
16+
require (
17+
cloud.google.com/go v0.46.3 // indirect
18+
github.com/BurntSushi/toml v0.3.1 // indirect
19+
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 // indirect
20+
github.com/golang/protobuf v1.3.2 // indirect
21+
github.com/googleapis/gax-go/v2 v2.0.5 // indirect
22+
github.com/hashicorp/golang-lru v0.5.1 // indirect
23+
github.com/jmespath/go-jmespath v0.4.0 // indirect
24+
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 // indirect
25+
github.com/konsorten/go-windows-terminal-sequences v1.0.1 // indirect
26+
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
27+
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 // indirect
28+
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 // indirect
29+
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a // indirect
30+
go.opencensus.io v0.22.0 // indirect
31+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect
32+
golang.org/x/exp v0.0.0-20190912063710-ac5d2bfcbfe0 // indirect
33+
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac // indirect
34+
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b // indirect
35+
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 // indirect
36+
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f // indirect
37+
golang.org/x/text v0.3.3 // indirect
38+
golang.org/x/tools v0.0.0-20190917162342-3b4f30a44f3b // indirect
39+
google.golang.org/appengine v1.6.1 // indirect
40+
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51 // indirect
41+
google.golang.org/grpc v1.21.1 // indirect
42+
honnef.co/go/tools v0.0.1-2019.2.3 // indirect
43+
)
44+
45+
go 1.17

0 commit comments

Comments
 (0)