mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
fn: add tester image (#609)
* fn: add fn-test-utils image New tester image that uses go-fdk for advanced test scenarios. Right now, this is an enhanced 'hello/sleeper' rolled into one that echos the received headers/env to allow writing test cases.
This commit is contained in:
1
images/fn-test-utils/.gitignore
vendored
Normal file
1
images/fn-test-utils/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
vendor
|
||||||
16
images/fn-test-utils/Dockerfile
Normal file
16
images/fn-test-utils/Dockerfile
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
# build stage
|
||||||
|
FROM golang:1.9-alpine AS build-env
|
||||||
|
RUN apk --no-cache add build-base git bzr mercurial gcc
|
||||||
|
ENV D=/go/src/github.com/fnproject/fn/images/fn-test-utils
|
||||||
|
RUN go get -u github.com/golang/dep/cmd/dep
|
||||||
|
ADD Gopkg.* $D/
|
||||||
|
RUN cd $D && dep ensure --vendor-only
|
||||||
|
ADD . $D
|
||||||
|
RUN cd $D && go build -o fn-test-utils && cp fn-test-utils /tmp/
|
||||||
|
|
||||||
|
# final stage
|
||||||
|
FROM alpine
|
||||||
|
WORKDIR /function
|
||||||
|
COPY --from=build-env /tmp/fn-test-utils /function
|
||||||
|
ENTRYPOINT ["./fn-test-utils"]
|
||||||
15
images/fn-test-utils/Gopkg.lock
generated
Normal file
15
images/fn-test-utils/Gopkg.lock
generated
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
||||||
|
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/fnproject/fdk-go"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "ce12b15e559bb56980c4134cbeadb99db9cd563a"
|
||||||
|
|
||||||
|
[solve-meta]
|
||||||
|
analyzer-name = "dep"
|
||||||
|
analyzer-version = 1
|
||||||
|
inputs-digest = "c55f0d3da5ec2e9e5c9a7c563702e4cf28513fa1aaea1c18664ca2cb7d726f89"
|
||||||
|
solver-name = "gps-cdcl"
|
||||||
|
solver-version = 1
|
||||||
25
images/fn-test-utils/Gopkg.toml
Normal file
25
images/fn-test-utils/Gopkg.toml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Gopkg.toml example
|
||||||
|
#
|
||||||
|
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
|
||||||
|
# for detailed Gopkg.toml documentation.
|
||||||
|
#
|
||||||
|
# required = ["github.com/user/thing/cmd/thing"]
|
||||||
|
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
|
||||||
|
#
|
||||||
|
# [[constraint]]
|
||||||
|
# name = "github.com/user/project"
|
||||||
|
# version = "1.0.0"
|
||||||
|
#
|
||||||
|
# [[constraint]]
|
||||||
|
# name = "github.com/user/project2"
|
||||||
|
# branch = "dev"
|
||||||
|
# source = "github.com/myfork/project2"
|
||||||
|
#
|
||||||
|
# [[override]]
|
||||||
|
# name = "github.com/x/y"
|
||||||
|
# version = "2.4.0"
|
||||||
|
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/fnproject/fdk-go"
|
||||||
2
images/fn-test-utils/build.sh
Executable file
2
images/fn-test-utils/build.sh
Executable file
@@ -0,0 +1,2 @@
|
|||||||
|
set -e
|
||||||
|
docker build -t fnproject/fn-test-utils:latest .
|
||||||
92
images/fn-test-utils/fn-test-utils.go
Normal file
92
images/fn-test-utils/fn-test-utils.go
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
fdk "github.com/fnproject/fdk-go"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AppRequest struct {
|
||||||
|
// if specified we 'sleep' the specified msecs
|
||||||
|
SleepTime int `json:"sleepTime,omitempty"`
|
||||||
|
// if specified, this is our response http status code
|
||||||
|
ResponseCode int `json:"responseCode,omitempty"`
|
||||||
|
// if specified, this is our response content-type
|
||||||
|
ResponseContentType string `json:"responseContentType,omitempty"`
|
||||||
|
// if specified, this is echoed back to client
|
||||||
|
EchoContent string `json:"echoContent,omitempty"`
|
||||||
|
// verbose mode
|
||||||
|
IsDebug bool `json:"isDebug,omitempty"`
|
||||||
|
// simulate crash
|
||||||
|
IsCrash bool `json:"isCrash,omitempty"`
|
||||||
|
// TODO: simulate slow read/slow write
|
||||||
|
// TODO: simulate partial write/read
|
||||||
|
// TODO: simulate mem leak
|
||||||
|
// TODO: simulate high cpu usage
|
||||||
|
// TODO: simulate high mem usage
|
||||||
|
// TODO: simulate large body upload/download
|
||||||
|
}
|
||||||
|
|
||||||
|
type AppResponse struct {
|
||||||
|
Request AppRequest `json:"request"`
|
||||||
|
Headers http.Header `json:"header"`
|
||||||
|
Config map[string]string `json:"config"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func AppHandler(ctx context.Context, in io.Reader, out io.Writer) {
|
||||||
|
|
||||||
|
fnctx := fdk.Context(ctx)
|
||||||
|
|
||||||
|
var request AppRequest
|
||||||
|
json.NewDecoder(in).Decode(&request)
|
||||||
|
|
||||||
|
if request.IsDebug {
|
||||||
|
log.Printf("Received request %v", request)
|
||||||
|
log.Printf("Received headers %v", fnctx.Header)
|
||||||
|
log.Printf("Received config %v", fnctx.Config)
|
||||||
|
}
|
||||||
|
|
||||||
|
// simulate load if requested
|
||||||
|
if request.SleepTime > 0 {
|
||||||
|
if request.IsDebug {
|
||||||
|
log.Printf("Sleeping %d", request.SleepTime)
|
||||||
|
}
|
||||||
|
time.Sleep(time.Duration(request.SleepTime) * time.Millisecond)
|
||||||
|
}
|
||||||
|
|
||||||
|
// simulate crash
|
||||||
|
if request.IsCrash {
|
||||||
|
panic("Crash requested")
|
||||||
|
}
|
||||||
|
|
||||||
|
// custom response code
|
||||||
|
if request.ResponseCode != 0 {
|
||||||
|
fdk.WriteStatus(out, request.ResponseCode)
|
||||||
|
} else {
|
||||||
|
fdk.WriteStatus(out, 200)
|
||||||
|
}
|
||||||
|
|
||||||
|
// custom content type
|
||||||
|
if request.ResponseContentType != "" {
|
||||||
|
fdk.SetHeader(out, "Content-Type", request.ResponseContentType)
|
||||||
|
} else {
|
||||||
|
fdk.SetHeader(out, "Content-Type", "application/json")
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := AppResponse{
|
||||||
|
Request: request,
|
||||||
|
Headers: fnctx.Header,
|
||||||
|
Config: fnctx.Config,
|
||||||
|
}
|
||||||
|
|
||||||
|
json.NewEncoder(out).Encode(&resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fdk.Handle(fdk.HandlerFunc(AppHandler))
|
||||||
|
}
|
||||||
4
images/fn-test-utils/release.sh
Executable file
4
images/fn-test-utils/release.sh
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
set -e
|
||||||
|
|
||||||
|
./build.sh
|
||||||
|
docker push fnproject/fn-test-utils:latest
|
||||||
@@ -45,6 +45,9 @@ docker tag $user/$image:latest $user/$image_deprecated:latest
|
|||||||
docker push $user/$image_deprecated:$version
|
docker push $user/$image_deprecated:$version
|
||||||
docker push $user/$image_deprecated:latest
|
docker push $user/$image_deprecated:latest
|
||||||
|
|
||||||
|
# release test utils docker image
|
||||||
|
(cd images/fn-test-utils && ./release.sh)
|
||||||
|
|
||||||
cd fnlb
|
cd fnlb
|
||||||
./release.sh
|
./release.sh
|
||||||
cd ..
|
cd ..
|
||||||
|
|||||||
5
test.sh
5
test.sh
@@ -29,6 +29,9 @@ docker run --name func-mysql-test -p 3306:3306 -e MYSQL_DATABASE=funcs -e MYSQL_
|
|||||||
docker rm -fv func-minio-test || echo No prev minio test container
|
docker rm -fv func-minio-test || echo No prev minio test container
|
||||||
docker run -d -p 9000:9000 --name func-minio-test -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=password" minio/minio server /data
|
docker run -d -p 9000:9000 --name func-minio-test -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=password" minio/minio server /data
|
||||||
|
|
||||||
|
# build test image locally first
|
||||||
|
(cd images/fn-test-utils && ./build.sh)
|
||||||
|
|
||||||
# pull all images used in tests so that tests don't time out and fail spuriously
|
# pull all images used in tests so that tests don't time out and fail spuriously
|
||||||
docker pull fnproject/sleeper
|
docker pull fnproject/sleeper
|
||||||
docker pull fnproject/error
|
docker pull fnproject/error
|
||||||
@@ -47,7 +50,7 @@ export POSTGRES_URL="postgres://postgres:root@${POSTGRES_HOST}:${POSTGRES_PORT}/
|
|||||||
export MYSQL_URL="mysql://root:root@tcp(${MYSQL_HOST}:${MYSQL_PORT})/funcs"
|
export MYSQL_URL="mysql://root:root@tcp(${MYSQL_HOST}:${MYSQL_PORT})/funcs"
|
||||||
export MINIO_URL="s3://admin:password@${MINIO_HOST}:${MINIO_PORT}/us-east-1/fnlogs"
|
export MINIO_URL="s3://admin:password@${MINIO_HOST}:${MINIO_PORT}/us-east-1/fnlogs"
|
||||||
|
|
||||||
go test -v $(go list ./... | grep -v vendor | grep -v examples | grep -v test/fn-api-tests)
|
go test -v $(go list ./... | grep -v vendor | grep -v examples | grep -v test/fn-api-tests | grep -v images/fn-test-utils)
|
||||||
go vet $(go list ./... | grep -v vendor)
|
go vet $(go list ./... | grep -v vendor)
|
||||||
docker rm --force func-postgres-test
|
docker rm --force func-postgres-test
|
||||||
docker rm --force func-mysql-test
|
docker rm --force func-mysql-test
|
||||||
|
|||||||
Reference in New Issue
Block a user