mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
Merge branch 'move-api-tests' into 'master'
Moving tests from CLI to server See merge request !118
This commit is contained in:
@@ -35,7 +35,7 @@ esac
|
|||||||
|
|
||||||
case ${DOCKER_LOCATION:-localhost} in
|
case ${DOCKER_LOCATION:-localhost} in
|
||||||
localhost)
|
localhost)
|
||||||
cd fn/tests && API_URL="http://localhost:8080" go test -v ./...; cd ../../
|
cd test/fn-api-tests && API_URL="http://localhost:8080" go test -v ./...; cd ../../
|
||||||
;;
|
;;
|
||||||
docker_ip)
|
docker_ip)
|
||||||
if [[ ! -z ${DOCKER_HOST} ]]
|
if [[ ! -z ${DOCKER_HOST} ]]
|
||||||
@@ -43,9 +43,9 @@ docker_ip)
|
|||||||
DOCKER_IP=`echo ${DOCKER_HOST} | awk -F/ '{print $3}'| awk -F: '{print $1}'`
|
DOCKER_IP=`echo ${DOCKER_HOST} | awk -F/ '{print $3}'| awk -F: '{print $1}'`
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd fn/tests && API_URL="http://${DOCKER_IP:-localhost}:8080" go test -v ./...; cd ../../
|
cd test/fn-api-tests && API_URL="http://${DOCKER_IP:-localhost}:8080" go test -v ./...; cd ../../
|
||||||
;;
|
;;
|
||||||
container_ip)
|
container_ip)
|
||||||
cd fn/tests && API_URL="http://"$(docker inspect -f '{{.NetworkSettings.IPAddress}}' func-server)":8080" go test -v ./...; cd ../../
|
cd test/fn-api-tests && API_URL="http://"$(docker inspect -f '{{.NetworkSettings.IPAddress}}' func-server)":8080" go test -v ./...; cd ../../
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/funcy/functions_go/client/call"
|
"github.com/funcy/functions_go/client/call"
|
||||||
"gitlab-odx.oracle.com/odx/functions/fn/client"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCalls(t *testing.T) {
|
func TestCalls(t *testing.T) {
|
||||||
@@ -30,7 +29,7 @@ func TestCalls(t *testing.T) {
|
|||||||
|
|
||||||
u := url.URL{
|
u := url.URL{
|
||||||
Scheme: "http",
|
Scheme: "http",
|
||||||
Host: client.Host(),
|
Host: Host(),
|
||||||
}
|
}
|
||||||
u.Path = path.Join(u.Path, "r", s.AppName, s.RoutePath)
|
u.Path = path.Join(u.Path, "r", s.AppName, s.RoutePath)
|
||||||
|
|
||||||
@@ -12,7 +12,6 @@ import (
|
|||||||
|
|
||||||
"github.com/funcy/functions_go/client/call"
|
"github.com/funcy/functions_go/client/call"
|
||||||
"github.com/funcy/functions_go/client/operations"
|
"github.com/funcy/functions_go/client/operations"
|
||||||
"gitlab-odx.oracle.com/odx/functions/fn/client"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ErrMsg struct {
|
type ErrMsg struct {
|
||||||
@@ -26,7 +25,7 @@ type TimeoutBody struct {
|
|||||||
|
|
||||||
func CallAsync(t *testing.T, u url.URL, content io.Reader) string {
|
func CallAsync(t *testing.T, u url.URL, content io.Reader) string {
|
||||||
output := &bytes.Buffer{}
|
output := &bytes.Buffer{}
|
||||||
err := client.CallFN(u.String(), content, output, "POST", []string{})
|
err := CallFN(u.String(), content, output, "POST", []string{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Got unexpected error: %v", err)
|
t.Fatalf("Got unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@@ -60,14 +59,14 @@ func TestRouteExecutions(t *testing.T) {
|
|||||||
|
|
||||||
u := url.URL{
|
u := url.URL{
|
||||||
Scheme: "http",
|
Scheme: "http",
|
||||||
Host: client.Host(),
|
Host: Host(),
|
||||||
}
|
}
|
||||||
u.Path = path.Join(u.Path, "r", s.AppName, s.RoutePath)
|
u.Path = path.Join(u.Path, "r", s.AppName, s.RoutePath)
|
||||||
|
|
||||||
t.Run("run-sync-funcy/hello-no-input", func(t *testing.T) {
|
t.Run("run-sync-funcy/hello-no-input", func(t *testing.T) {
|
||||||
content := &bytes.Buffer{}
|
content := &bytes.Buffer{}
|
||||||
output := &bytes.Buffer{}
|
output := &bytes.Buffer{}
|
||||||
err := client.CallFN(u.String(), content, output, "POST", []string{})
|
err := CallFN(u.String(), content, output, "POST", []string{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Got unexpected error: %v", err)
|
t.Fatalf("Got unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@@ -84,7 +83,7 @@ func TestRouteExecutions(t *testing.T) {
|
|||||||
Name string
|
Name string
|
||||||
}{Name: "John"})
|
}{Name: "John"})
|
||||||
output := &bytes.Buffer{}
|
output := &bytes.Buffer{}
|
||||||
err := client.CallFN(u.String(), content, output, "POST", []string{})
|
err := CallFN(u.String(), content, output, "POST", []string{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Got unexpected error: %v", err)
|
t.Fatalf("Got unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@@ -153,7 +152,7 @@ func TestRouteExecutions(t *testing.T) {
|
|||||||
|
|
||||||
u := url.URL{
|
u := url.URL{
|
||||||
Scheme: "http",
|
Scheme: "http",
|
||||||
Host: client.Host(),
|
Host: Host(),
|
||||||
}
|
}
|
||||||
u.Path = path.Join(u.Path, "r", s.AppName, routePath)
|
u.Path = path.Join(u.Path, "r", s.AppName, routePath)
|
||||||
|
|
||||||
@@ -163,7 +162,7 @@ func TestRouteExecutions(t *testing.T) {
|
|||||||
}{Seconds: 31})
|
}{Seconds: 31})
|
||||||
output := &bytes.Buffer{}
|
output := &bytes.Buffer{}
|
||||||
|
|
||||||
client.CallFN(u.String(), content, output, "POST", []string{})
|
CallFN(u.String(), content, output, "POST", []string{})
|
||||||
|
|
||||||
if !strings.Contains(output.String(), "Timed out") {
|
if !strings.Contains(output.String(), "Timed out") {
|
||||||
t.Fatalf("Must fail because of timeout, but got error message: %v", output.String())
|
t.Fatalf("Must fail because of timeout, but got error message: %v", output.String())
|
||||||
@@ -199,7 +198,7 @@ func TestRouteExecutions(t *testing.T) {
|
|||||||
t.Run("exec-multi-log-test", func(t *testing.T) {
|
t.Run("exec-multi-log-test", func(t *testing.T) {
|
||||||
u := url.URL{
|
u := url.URL{
|
||||||
Scheme: "http",
|
Scheme: "http",
|
||||||
Host: client.Host(),
|
Host: Host(),
|
||||||
}
|
}
|
||||||
u.Path = path.Join(u.Path, "r", s.AppName, routePath)
|
u.Path = path.Join(u.Path, "r", s.AppName, routePath)
|
||||||
|
|
||||||
@@ -239,7 +238,7 @@ func TestRouteExecutions(t *testing.T) {
|
|||||||
t.Run("exec-log-test", func(t *testing.T) {
|
t.Run("exec-log-test", func(t *testing.T) {
|
||||||
u := url.URL{
|
u := url.URL{
|
||||||
Scheme: "http",
|
Scheme: "http",
|
||||||
Host: client.Host(),
|
Host: Host(),
|
||||||
}
|
}
|
||||||
u.Path = path.Join(u.Path, "r", s.AppName, routePath)
|
u.Path = path.Join(u.Path, "r", s.AppName, routePath)
|
||||||
content := &bytes.Buffer{}
|
content := &bytes.Buffer{}
|
||||||
@@ -268,7 +267,7 @@ func TestRouteExecutions(t *testing.T) {
|
|||||||
size := 1 * 1024 * 1024 * 1024
|
size := 1 * 1024 * 1024 * 1024
|
||||||
u := url.URL{
|
u := url.URL{
|
||||||
Scheme: "http",
|
Scheme: "http",
|
||||||
Host: client.Host(),
|
Host: Host(),
|
||||||
}
|
}
|
||||||
u.Path = path.Join(u.Path, "r", s.AppName, routePath)
|
u.Path = path.Join(u.Path, "r", s.AppName, routePath)
|
||||||
content := &bytes.Buffer{}
|
content := &bytes.Buffer{}
|
||||||
@@ -6,16 +6,48 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
fn "github.com/funcy/functions_go/client"
|
"fmt"
|
||||||
|
"github.com/funcy/functions_go/client"
|
||||||
"github.com/funcy/functions_go/client/apps"
|
"github.com/funcy/functions_go/client/apps"
|
||||||
"github.com/funcy/functions_go/client/routes"
|
"github.com/funcy/functions_go/client/routes"
|
||||||
"github.com/funcy/functions_go/models"
|
"github.com/funcy/functions_go/models"
|
||||||
"gitlab-odx.oracle.com/odx/functions/fn/client"
|
httptransport "github.com/go-openapi/runtime/client"
|
||||||
|
"github.com/go-openapi/strfmt"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func Host() string {
|
||||||
|
apiURL := os.Getenv("API_URL")
|
||||||
|
if apiURL == "" {
|
||||||
|
apiURL = "http://localhost:8080"
|
||||||
|
}
|
||||||
|
|
||||||
|
u, err := url.Parse(apiURL)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("Couldn't parse API URL:", err)
|
||||||
|
}
|
||||||
|
return u.Host
|
||||||
|
}
|
||||||
|
|
||||||
|
func APIClient() *client.Functions {
|
||||||
|
transport := httptransport.New(Host(), "/v1", []string{"http"})
|
||||||
|
if os.Getenv("FN_TOKEN") != "" {
|
||||||
|
transport.DefaultAuthentication = httptransport.BearerToken(os.Getenv("FN_TOKEN"))
|
||||||
|
}
|
||||||
|
|
||||||
|
// create the API client, with the transport
|
||||||
|
client := client.New(transport, strfmt.Default)
|
||||||
|
|
||||||
|
return client
|
||||||
|
}
|
||||||
|
|
||||||
type SuiteSetup struct {
|
type SuiteSetup struct {
|
||||||
Context context.Context
|
Context context.Context
|
||||||
Client *fn.Functions
|
Client *client.Functions
|
||||||
AppName string
|
AppName string
|
||||||
RoutePath string
|
RoutePath string
|
||||||
Image string
|
Image string
|
||||||
@@ -29,7 +61,7 @@ type SuiteSetup struct {
|
|||||||
func SetupDefaultSuite() *SuiteSetup {
|
func SetupDefaultSuite() *SuiteSetup {
|
||||||
return &SuiteSetup{
|
return &SuiteSetup{
|
||||||
Context: context.Background(),
|
Context: context.Background(),
|
||||||
Client: client.APIClient(),
|
Client: APIClient(),
|
||||||
AppName: "test-app",
|
AppName: "test-app",
|
||||||
RoutePath: "/hello",
|
RoutePath: "/hello",
|
||||||
Image: "funcy/hello",
|
Image: "funcy/hello",
|
||||||
@@ -91,7 +123,7 @@ func CheckAppResponseError(t *testing.T, err error) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateAppNoAssert(ctx context.Context, fnclient *fn.Functions, appName string, config map[string]string) (*apps.PostAppsOK, error) {
|
func CreateAppNoAssert(ctx context.Context, fnclient *client.Functions, appName string, config map[string]string) (*apps.PostAppsOK, error) {
|
||||||
cfg := &apps.PostAppsParams{
|
cfg := &apps.PostAppsParams{
|
||||||
Body: &models.AppWrapper{
|
Body: &models.AppWrapper{
|
||||||
App: &models.App{
|
App: &models.App{
|
||||||
@@ -105,7 +137,7 @@ func CreateAppNoAssert(ctx context.Context, fnclient *fn.Functions, appName stri
|
|||||||
return fnclient.Apps.PostApps(cfg)
|
return fnclient.Apps.PostApps(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateApp(t *testing.T, ctx context.Context, fnclient *fn.Functions, appName string, config map[string]string) {
|
func CreateApp(t *testing.T, ctx context.Context, fnclient *client.Functions, appName string, config map[string]string) {
|
||||||
appPayload, err := CreateAppNoAssert(ctx, fnclient, appName, config)
|
appPayload, err := CreateAppNoAssert(ctx, fnclient, appName, config)
|
||||||
CheckAppResponseError(t, err)
|
CheckAppResponseError(t, err)
|
||||||
if !strings.Contains(appName, appPayload.Payload.App.Name) {
|
if !strings.Contains(appName, appPayload.Payload.App.Name) {
|
||||||
@@ -114,7 +146,7 @@ func CreateApp(t *testing.T, ctx context.Context, fnclient *fn.Functions, appNam
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func UpdateApp(t *testing.T, ctx context.Context, fnclient *fn.Functions, appName string, config map[string]string) *apps.PatchAppsAppOK {
|
func UpdateApp(t *testing.T, ctx context.Context, fnclient *client.Functions, appName string, config map[string]string) *apps.PatchAppsAppOK {
|
||||||
CreateApp(t, ctx, fnclient, appName, map[string]string{"A": "a"})
|
CreateApp(t, ctx, fnclient, appName, map[string]string{"A": "a"})
|
||||||
cfg := &apps.PatchAppsAppParams{
|
cfg := &apps.PatchAppsAppParams{
|
||||||
App: appName,
|
App: appName,
|
||||||
@@ -131,7 +163,7 @@ func UpdateApp(t *testing.T, ctx context.Context, fnclient *fn.Functions, appNam
|
|||||||
return appPayload
|
return appPayload
|
||||||
}
|
}
|
||||||
|
|
||||||
func DeleteApp(t *testing.T, ctx context.Context, fnclient *fn.Functions, appName string) {
|
func DeleteApp(t *testing.T, ctx context.Context, fnclient *client.Functions, appName string) {
|
||||||
cfg := &apps.DeleteAppsAppParams{
|
cfg := &apps.DeleteAppsAppParams{
|
||||||
App: appName,
|
App: appName,
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
@@ -248,7 +280,7 @@ func assertRouteFields(t *testing.T, routeObject *models.Route, path, image, rou
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func createRoute(ctx context.Context, fnclient *fn.Functions, appName, image, routePath, routeType string, routeConfig map[string]string, headers map[string][]string) (*routes.PostAppsAppRoutesOK, error) {
|
func createRoute(ctx context.Context, fnclient *client.Functions, appName, image, routePath, routeType string, routeConfig map[string]string, headers map[string][]string) (*routes.PostAppsAppRoutesOK, error) {
|
||||||
cfg := &routes.PostAppsAppRoutesParams{
|
cfg := &routes.PostAppsAppRoutesParams{
|
||||||
App: appName,
|
App: appName,
|
||||||
Body: &models.RouteWrapper{
|
Body: &models.RouteWrapper{
|
||||||
@@ -267,14 +299,14 @@ func createRoute(ctx context.Context, fnclient *fn.Functions, appName, image, ro
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateRoute(t *testing.T, ctx context.Context, fnclient *fn.Functions, appName, routePath, image, routeType string, routeConfig map[string]string, headers map[string][]string) {
|
func CreateRoute(t *testing.T, ctx context.Context, fnclient *client.Functions, appName, routePath, image, routeType string, routeConfig map[string]string, headers map[string][]string) {
|
||||||
routeResponse, err := createRoute(ctx, fnclient, appName, image, routePath, routeType, routeConfig, headers)
|
routeResponse, err := createRoute(ctx, fnclient, appName, image, routePath, routeType, routeConfig, headers)
|
||||||
CheckRouteResponseError(t, err)
|
CheckRouteResponseError(t, err)
|
||||||
|
|
||||||
assertRouteFields(t, routeResponse.Payload.Route, routePath, image, routeType)
|
assertRouteFields(t, routeResponse.Payload.Route, routePath, image, routeType)
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteRoute(ctx context.Context, fnclient *fn.Functions, appName, routePath string) (*routes.DeleteAppsAppRoutesRouteOK, error) {
|
func deleteRoute(ctx context.Context, fnclient *client.Functions, appName, routePath string) (*routes.DeleteAppsAppRoutesRouteOK, error) {
|
||||||
cfg := &routes.DeleteAppsAppRoutesRouteParams{
|
cfg := &routes.DeleteAppsAppRoutesRouteParams{
|
||||||
App: appName,
|
App: appName,
|
||||||
Route: routePath,
|
Route: routePath,
|
||||||
@@ -284,12 +316,12 @@ func deleteRoute(ctx context.Context, fnclient *fn.Functions, appName, routePath
|
|||||||
return fnclient.Routes.DeleteAppsAppRoutesRoute(cfg)
|
return fnclient.Routes.DeleteAppsAppRoutesRoute(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func DeleteRoute(t *testing.T, ctx context.Context, fnclient *fn.Functions, appName, routePath string) {
|
func DeleteRoute(t *testing.T, ctx context.Context, fnclient *client.Functions, appName, routePath string) {
|
||||||
_, err := deleteRoute(ctx, fnclient, appName, routePath)
|
_, err := deleteRoute(ctx, fnclient, appName, routePath)
|
||||||
CheckRouteResponseError(t, err)
|
CheckRouteResponseError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ListRoutes(t *testing.T, ctx context.Context, fnclient *fn.Functions, appName string) []*models.Route {
|
func ListRoutes(t *testing.T, ctx context.Context, fnclient *client.Functions, appName string) []*models.Route {
|
||||||
cfg := &routes.GetAppsAppRoutesParams{
|
cfg := &routes.GetAppsAppRoutesParams{
|
||||||
App: appName,
|
App: appName,
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
@@ -300,7 +332,7 @@ func ListRoutes(t *testing.T, ctx context.Context, fnclient *fn.Functions, appNa
|
|||||||
return routesResponse.Payload.Routes
|
return routesResponse.Payload.Routes
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetRoute(t *testing.T, ctx context.Context, fnclient *fn.Functions, appName, routePath string) *models.Route {
|
func GetRoute(t *testing.T, ctx context.Context, fnclient *client.Functions, appName, routePath string) *models.Route {
|
||||||
cfg := &routes.GetAppsAppRoutesRouteParams{
|
cfg := &routes.GetAppsAppRoutesRouteParams{
|
||||||
App: appName,
|
App: appName,
|
||||||
Route: routePath,
|
Route: routePath,
|
||||||
@@ -312,7 +344,7 @@ func GetRoute(t *testing.T, ctx context.Context, fnclient *fn.Functions, appName
|
|||||||
return routeResponse.Payload.Route
|
return routeResponse.Payload.Route
|
||||||
}
|
}
|
||||||
|
|
||||||
func UpdateRoute(t *testing.T, ctx context.Context, fnclient *fn.Functions, appName, routePath, image, routeType, format string, memory int64, routeConfig map[string]string, headers map[string][]string, newRoutePath string) (*routes.PatchAppsAppRoutesRouteOK, error) {
|
func UpdateRoute(t *testing.T, ctx context.Context, fnclient *client.Functions, appName, routePath, image, routeType, format string, memory int64, routeConfig map[string]string, headers map[string][]string, newRoutePath string) (*routes.PatchAppsAppRoutesRouteOK, error) {
|
||||||
|
|
||||||
routeObject := GetRoute(t, ctx, fnclient, appName, routePath)
|
routeObject := GetRoute(t, ctx, fnclient, appName, routePath)
|
||||||
if routeObject.Config == nil {
|
if routeObject.Config == nil {
|
||||||
@@ -383,3 +415,46 @@ func assertContainsRoute(routeModels []*models.Route, expectedRoute string) bool
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func EnvAsHeader(req *http.Request, selectedEnv []string) {
|
||||||
|
detectedEnv := os.Environ()
|
||||||
|
if len(selectedEnv) > 0 {
|
||||||
|
detectedEnv = selectedEnv
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, e := range detectedEnv {
|
||||||
|
kv := strings.Split(e, "=")
|
||||||
|
name := kv[0]
|
||||||
|
req.Header.Set(name, os.Getenv(name))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func CallFN(u string, content io.Reader, output io.Writer, method string, env []string) error {
|
||||||
|
if method == "" {
|
||||||
|
if content == nil {
|
||||||
|
method = "GET"
|
||||||
|
} else {
|
||||||
|
method = "POST"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := http.NewRequest(method, u, content)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error running route: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
|
||||||
|
if len(env) > 0 {
|
||||||
|
EnvAsHeader(req, env)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.DefaultClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error running route: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
io.Copy(output, resp.Body)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user