mirror of https://github.com/knative/func.git
88 lines
2.6 KiB
Go
88 lines
2.6 KiB
Go
//go:build e2e && linux
|
|
|
|
package e2e
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"net"
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
"strings"
|
|
"syscall"
|
|
"testing"
|
|
"time"
|
|
|
|
"gotest.tools/v3/assert"
|
|
"knative.dev/func/test/testhttp"
|
|
|
|
common "knative.dev/func/test/common"
|
|
)
|
|
|
|
// TestFunctionRunWithoutContainer tests the func runs on host without container (golang funcs only)
|
|
// In other words, it tests `func run --container=false`
|
|
func TestFunctionRunWithoutContainer(t *testing.T) {
|
|
|
|
var funcName = "func-no-container"
|
|
var funcPath = filepath.Join(t.TempDir(), funcName)
|
|
|
|
knFuncTerm1 := common.NewKnFuncShellCli(t)
|
|
knFuncTerm1.Exec("create", "--language", "go", "--template", "http", funcPath)
|
|
|
|
knFuncTerm1.ShouldDumpOnSuccess = false
|
|
knFuncTerm2 := common.NewKnFuncShellCli(t)
|
|
knFuncTerm2.ShouldDumpOnSuccess = true
|
|
|
|
portChannel := make(chan string)
|
|
go func() {
|
|
t.Log("----Checking for listening port")
|
|
// set the function that will be executed while "kn func run" is executed
|
|
knFuncTerm1.OnWaitCallback = func(stdout *bytes.Buffer) {
|
|
t.Log("-----Executing OnWaitCallback")
|
|
funcPort, attempts := "", 0
|
|
for funcPort == "" && attempts < 30 { // 15 secs
|
|
t.Logf("----Function Output:\n%v", stdout.String())
|
|
matches := regexp.MustCompile("Running on host port (.*)").FindStringSubmatch(stdout.String())
|
|
attempts++
|
|
if len(matches) > 1 {
|
|
funcPort = matches[1]
|
|
} else {
|
|
time.Sleep(500 * time.Millisecond)
|
|
}
|
|
}
|
|
// can proceed
|
|
portChannel <- funcPort
|
|
}
|
|
|
|
// Run without container (scaffolding)
|
|
knFuncTerm1.Exec("run", "--container=false", "--verbose", "--path", funcPath, "--registry", common.GetRegistry())
|
|
}()
|
|
|
|
knFuncRunCompleted := false
|
|
knFuncRunProcessFinalizer := func() {
|
|
if knFuncRunCompleted == false {
|
|
knFuncTerm1.ExecCmd.Process.Signal(syscall.SIGTERM)
|
|
knFuncRunCompleted = true
|
|
}
|
|
}
|
|
defer knFuncRunProcessFinalizer()
|
|
|
|
// Get running port (usually 8080) from func output. We can use it for test http.
|
|
funcPort := <-portChannel
|
|
assert.Assert(t, funcPort != "", "Unable to retrieve local port allocated for function")
|
|
|
|
// Wait Port to be available
|
|
net.DialTimeout("tcp", ":"+funcPort, 3*time.Second)
|
|
time.Sleep(time.Second)
|
|
|
|
// Assert Function endpoint responds
|
|
_, bodyResp := testhttp.TestGet(t, "http://localhost:"+funcPort+"?message=run-on-host")
|
|
assert.Assert(t, strings.Contains(bodyResp, `GET /?message=run-on-host`), "function response does not contain expected body.")
|
|
|
|
// Assert Func were not built
|
|
_, err := os.Stat(filepath.Join(funcPath, ".func", "built"))
|
|
assert.Assert(t, errors.Is(err, os.ErrNotExist), "File .func/built exists")
|
|
|
|
}
|