From f01de5c80205aa1745604ae2f2d5b6745f394af1 Mon Sep 17 00:00:00 2001 From: Harsh Thakur Date: Thu, 10 Jun 2021 06:57:20 +0000 Subject: [PATCH] Add websocket test (#2053) * Add websocket test Signed-off-by: Harsh Thakur * Use trap for exit code Signed-off-by: Harsh Thakur * Remove readme Signed-off-by: Harsh Thakur * Format, go version fix Signed-off-by: Harsh Thakur * Update image name Signed-off-by: Harsh Thakur * Use spec dir Signed-off-by: Harsh Thakur * Change directory before running file Signed-off-by: Harsh Thakur * Use Signed-off-by: Harsh Thakur --- test/kind_CI.sh | 1 + test/test_utils.sh | 1 + test/tests/websocket/broadcast.js | 15 ++++ test/tests/websocket/go.mod | 5 ++ test/tests/websocket/go.sum | 2 + test/tests/websocket/main.go | 68 +++++++++++++++++++ test/tests/websocket/specs/env-nodejs.yaml | 29 ++++++++ .../specs/fission-deployment-config.yaml | 7 ++ test/tests/websocket/specs/function-bs.yaml | 56 +++++++++++++++ test/tests/websocket/test_ws.sh | 27 ++++++++ 10 files changed, 211 insertions(+) create mode 100644 test/tests/websocket/broadcast.js create mode 100644 test/tests/websocket/go.mod create mode 100644 test/tests/websocket/go.sum create mode 100644 test/tests/websocket/main.go create mode 100644 test/tests/websocket/specs/env-nodejs.yaml create mode 100644 test/tests/websocket/specs/fission-deployment-config.yaml create mode 100644 test/tests/websocket/specs/function-bs.yaml create mode 100755 test/tests/websocket/test_ws.sh diff --git a/test/kind_CI.sh b/test/kind_CI.sh index 4fc8b7c1..dbd82583 100755 --- a/test/kind_CI.sh +++ b/test/kind_CI.sh @@ -85,6 +85,7 @@ main() { $ROOT/test/tests/mqtrigger/nats/test_mqtrigger_error.sh \ $ROOT/test/tests/test_huge_response/test_huge_response.sh \ $ROOT/test/tests/test_kubectl/test_kubectl.sh + $ROOT/test/tests/websocket/test_ws.sh export JOBS=3 source $ROOT/test/run_test.sh \ diff --git a/test/test_utils.sh b/test/test_utils.sh index 03eb36c3..b71930d3 100755 --- a/test/test_utils.sh +++ b/test/test_utils.sh @@ -540,6 +540,7 @@ run_all_tests() { $ROOT/test/tests/mqtrigger/nats/test_mqtrigger_error.sh \ $ROOT/test/tests/test_huge_response/test_huge_response.sh \ $ROOT/test/tests/test_kubectl/test_kubectl.sh + $ROOT/test/tests/websocket/test_ws.sh FAILURES=$? export JOBS=3 diff --git a/test/tests/websocket/broadcast.js b/test/tests/websocket/broadcast.js new file mode 100644 index 00000000..d54de37a --- /dev/null +++ b/test/tests/websocket/broadcast.js @@ -0,0 +1,15 @@ +module.exports = async function(ws, clients) { + + ws.on('message', function incoming(data) { + clients.forEach(function each(client) { + client.send(data); + }); + }); + + ws.on('close', function close() { + return { + status: 200, + message: "I am done" + } + }); +} diff --git a/test/tests/websocket/go.mod b/test/tests/websocket/go.mod new file mode 100644 index 00000000..0f87417b --- /dev/null +++ b/test/tests/websocket/go.mod @@ -0,0 +1,5 @@ +module ws + +go 1.15 + +require github.com/gorilla/websocket v1.4.2 diff --git a/test/tests/websocket/go.sum b/test/tests/websocket/go.sum new file mode 100644 index 00000000..85efffd9 --- /dev/null +++ b/test/tests/websocket/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/test/tests/websocket/main.go b/test/tests/websocket/main.go new file mode 100644 index 00000000..cc9a3fee --- /dev/null +++ b/test/tests/websocket/main.go @@ -0,0 +1,68 @@ +package main + +import ( + "log" + "os" + "time" + + "github.com/gorilla/websocket" +) + +func main() { + router := os.Getenv("FISSION_ROUTER") + if len(router) == 0 { + log.Fatal("FISSION_ROUTER variable is not set") + } + funcURL := "ws://" + router + "/fission-function/bs" + + conn, _, err := websocket.DefaultDialer.Dial(funcURL, nil) + if err != nil { + log.Fatal(err) + } + defer conn.Close() + done := make(chan struct{}) + + go func() { + defer close(done) + for { + _, message, err := conn.ReadMessage() + if err != nil { + log.Println("read:", err) + return + } + log.Printf("recv: %s", message) + } + }() + + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + stop := time.After(10 * time.Second) + for i := 0; i < 30; i++ { + + select { + case <-done: + return + case t := <-ticker.C: + err := conn.WriteMessage(websocket.TextMessage, []byte(t.String())) + if err != nil { + log.Fatal("write:", err) + } + case <-stop: + log.Println("Closing") + + // Cleanly close the connection by sending a close message and then + // waiting (with timeout) for the server to close the connection. + err := conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) + if err != nil { + log.Fatal("write close:", err) + } + select { + case <-done: + case <-time.After(time.Second): + } + return + } + } + +} diff --git a/test/tests/websocket/specs/env-nodejs.yaml b/test/tests/websocket/specs/env-nodejs.yaml new file mode 100644 index 00000000..c2667e43 --- /dev/null +++ b/test/tests/websocket/specs/env-nodejs.yaml @@ -0,0 +1,29 @@ +apiVersion: fission.io/v1 +kind: Environment +metadata: + creationTimestamp: null + name: nodejs + namespace: default +spec: + builder: {} + imagepullsecret: "" + keeparchive: false + poolsize: 3 + resources: + # limits: + # cpu: 80m + # memory: 100Mi + requests: + cpu: 10m + memory: 80Mi + runtime: + image: fission/node-env:latest + podspec: + containers: + - name: nodejs + imagepullpolicy: Always + env: + - name: TIMEOUT + value: 1000 + + version: 1 diff --git a/test/tests/websocket/specs/fission-deployment-config.yaml b/test/tests/websocket/specs/fission-deployment-config.yaml new file mode 100644 index 00000000..5d111711 --- /dev/null +++ b/test/tests/websocket/specs/fission-deployment-config.yaml @@ -0,0 +1,7 @@ +# This file is generated by the 'fission spec init' command. +# See the README in this directory for background and usage information. +# Do not edit the UID below: that will break 'fission spec apply' +apiVersion: fission.io/v1 +kind: DeploymentConfig +name: websocket +uid: 1df9464b-5f73-4623-8187-a2f431d5c828 diff --git a/test/tests/websocket/specs/function-bs.yaml b/test/tests/websocket/specs/function-bs.yaml new file mode 100644 index 00000000..c0c0ed5c --- /dev/null +++ b/test/tests/websocket/specs/function-bs.yaml @@ -0,0 +1,56 @@ +include: +- broadcast.js +kind: ArchiveUploadSpec +name: broadcast-js-LHtQ + +--- +apiVersion: fission.io/v1 +kind: Package +metadata: + creationTimestamp: null + name: bs-7baf1b6f-f876-436f-a2b2-ae1a3e3af8b7 + namespace: default +spec: + deployment: + checksum: {} + type: url + url: archive://broadcast-js-LHtQ + environment: + name: nodejs + namespace: default + source: + checksum: {} +status: + buildstatus: none + lastUpdateTimestamp: "2021-04-07T10:13:22Z" + +--- +apiVersion: fission.io/v1 +kind: Function +metadata: + creationTimestamp: null + name: bs + namespace: default +spec: + InvokeStrategy: + ExecutionStrategy: + ExecutorType: poolmgr + MaxScale: 0 + MinScale: 0 + SpecializationTimeout: 120 + TargetCPUPercent: 0 + StrategyType: execution + concurrency: 5 + configmaps: null + environment: + name: nodejs + namespace: default + functionTimeout: 60 + idletimeout: 120 + package: + packageref: + name: bs-7baf1b6f-f876-436f-a2b2-ae1a3e3af8b7 + namespace: default + requestsPerPod: 5 + resources: {} + secrets: null diff --git a/test/tests/websocket/test_ws.sh b/test/tests/websocket/test_ws.sh new file mode 100755 index 00000000..b0a7a419 --- /dev/null +++ b/test/tests/websocket/test_ws.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# +# Create a function and trigger it using NATS +# + +set -euo pipefail +source $(dirname $0)/../../utils.sh + +cleanup() { + log "Deleting websocket setup" + fission spec destroy +} + +DIR=$(dirname $0) + +if [ -z "${TEST_NOCLEANUP:-}" ]; then + trap cleanup EXIT +else + log "TEST_NOCLEANUP is set; not cleaning up test artifacts afterwards." +fi + +log "Creating websocket setup.." +fission spec apply --specdir=$DIR/specs + +log "Testing websocket connection" +cd $DIR && go run main.go