fix: test framework supports ensuring specific port is open (#606)

Jonatan Wallmander and Jonatan Wallmander created

The generic "waitforserver" has been renamed to
"ensureserverrunning".

This command now also takes an argument which denotes
which environment variable to pick the port from.

This is needed as the ports are randomized by the test.

Co-authored-by: Jonatan Wallmander <jonatan.wallmander@kdab.com>

Change summary

testscript/script_test.go                 | 44 +++++++++++++++---------
testscript/testdata/anon-access.txtar     |  4 +-
testscript/testdata/help.txtar            |  4 +-
testscript/testdata/http.txtar            |  4 +-
testscript/testdata/jwt.txtar             |  4 +-
testscript/testdata/mirror.txtar          |  4 +-
testscript/testdata/repo-blob.txtar       |  4 +-
testscript/testdata/repo-collab.txtar     |  4 +-
testscript/testdata/repo-commit.txtar     |  4 +-
testscript/testdata/repo-create.txtar     |  4 +-
testscript/testdata/repo-delete.txtar     |  4 +-
testscript/testdata/repo-import.txtar     |  4 +-
testscript/testdata/repo-perms.txtar      |  4 +-
testscript/testdata/repo-push.txtar       |  4 +-
testscript/testdata/repo-tree.txtar       |  4 +-
testscript/testdata/repo-webhooks.txtar   |  4 +-
testscript/testdata/set-username.txtar    |  4 +-
testscript/testdata/settings.txtar        |  4 +-
testscript/testdata/ssh-lfs.txtar         |  4 +-
testscript/testdata/ssh.txtar             |  4 +-
testscript/testdata/token.txtar           |  4 +-
testscript/testdata/ui-home.txtar         |  4 +-
testscript/testdata/user_management.txtar |  4 +-
23 files changed, 71 insertions(+), 61 deletions(-)

Detailed changes

testscript/script_test.go 🔗

@@ -79,20 +79,20 @@ func TestScript(t *testing.T) {
 		UpdateScripts:       *update,
 		RequireExplicitExec: true,
 		Cmds: map[string]func(ts *testscript.TestScript, neg bool, args []string){
-			"soft":          cmdSoft("admin", admin1.Signer()),
-			"usoft":         cmdSoft("user1", user1.Signer()),
-			"git":           cmdGit(admin1Key),
-			"ugit":          cmdGit(user1Key),
-			"curl":          cmdCurl,
-			"mkfile":        cmdMkfile,
-			"envfile":       cmdEnvfile,
-			"readfile":      cmdReadfile,
-			"dos2unix":      cmdDos2Unix,
-			"new-webhook":   cmdNewWebhook,
-			"waitforserver": cmdWaitforserver,
-			"stopserver":    cmdStopserver,
-			"ui":            cmdUI(admin1.Signer()),
-			"uui":           cmdUI(user1.Signer()),
+			"soft":                cmdSoft("admin", admin1.Signer()),
+			"usoft":               cmdSoft("user1", user1.Signer()),
+			"git":                 cmdGit(admin1Key),
+			"ugit":                cmdGit(user1Key),
+			"curl":                cmdCurl,
+			"mkfile":              cmdMkfile,
+			"envfile":             cmdEnvfile,
+			"readfile":            cmdReadfile,
+			"dos2unix":            cmdDos2Unix,
+			"new-webhook":         cmdNewWebhook,
+			"ensureserverrunning": cmdEnsureServerRunning,
+			"stopserver":          cmdStopserver,
+			"ui":                  cmdUI(admin1.Signer()),
+			"uui":                 cmdUI(user1.Signer()),
 		},
 		Setup: func(e *testscript.Env) error {
 			// Add binPath to PATH
@@ -470,9 +470,18 @@ func cmdCurl(ts *testscript.TestScript, neg bool, args []string) {
 	check(ts, cmd.Execute(), neg)
 }
 
-func cmdWaitforserver(ts *testscript.TestScript, neg bool, args []string) {
-	// wait until the server is up
-	addr := net.JoinHostPort("localhost", ts.Getenv("SSH_PORT"))
+func cmdEnsureServerRunning(ts *testscript.TestScript, neg bool, args []string) {
+	if len(args) < 1 {
+		ts.Fatalf("Must supply a TCP port of one of the services to connect to. " +
+			"These are set as env vars as they are randomized. " +
+			"Example usage: \"cmdensureserverrunning SSH_PORT\"\n" +
+			"Valid values for the env var: SSH_PORT|HTTP_PORT|GIT_PORT|STATS_PORT")
+	}
+
+	port := ts.Getenv(args[0])
+
+	// verify that the server is up
+	addr := net.JoinHostPort("localhost", port)
 	for {
 		conn, _ := net.DialTimeout(
 			"tcp",
@@ -480,6 +489,7 @@ func cmdWaitforserver(ts *testscript.TestScript, neg bool, args []string) {
 			time.Second,
 		)
 		if conn != nil {
+			ts.Logf("Server is running on port: %s", port)
 			conn.Close()
 			break
 		}

testscript/testdata/anon-access.txtar 🔗

@@ -2,8 +2,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # set settings
 soft settings allow-keyless true

testscript/testdata/help.txtar 🔗

@@ -3,8 +3,8 @@
 
 # start soft serve
 exec soft serve --sync-hooks &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 soft --help
 cmpenv stdout help.txt

testscript/testdata/http.txtar 🔗

@@ -8,8 +8,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # create user
 soft user create user1 --key "$USER1_AUTHORIZED_KEY"

testscript/testdata/jwt.txtar 🔗

@@ -2,8 +2,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # create user
 soft user create user1 --key "$USER1_AUTHORIZED_KEY"

testscript/testdata/mirror.txtar 🔗

@@ -5,8 +5,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # import a repo
 soft repo import --mirror charmbracelet/catwalk https://github.com/charmbracelet/catwalk.git

testscript/testdata/repo-blob.txtar 🔗

@@ -5,8 +5,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # create a repo
 soft repo create repo1

testscript/testdata/repo-collab.txtar 🔗

@@ -2,8 +2,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # setup
 soft repo import test https://github.com/charmbracelet/catwalk.git

testscript/testdata/repo-commit.txtar 🔗

@@ -5,8 +5,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # create a repo
 soft repo import basic1 https://github.com/git-fixtures/basic

testscript/testdata/repo-create.txtar 🔗

@@ -5,8 +5,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # create a repo
 soft repo create repo1 -d 'description' -H -p -n 'repo11'

testscript/testdata/repo-delete.txtar 🔗

@@ -2,8 +2,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 soft repo create repo1
 soft repo create repo-to-delete

testscript/testdata/repo-import.txtar 🔗

@@ -5,8 +5,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # import private
 soft repo import --private repo1 https://github.com/charmbracelet/catwalk.git

testscript/testdata/repo-perms.txtar 🔗

@@ -5,8 +5,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # create a repo & user1 with admin
 soft repo create repo1 -p

testscript/testdata/repo-push.txtar 🔗

@@ -2,8 +2,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # create a repo
 soft repo create repo-empty -d 'description' -H -p -n 'repo-empty'

testscript/testdata/repo-tree.txtar 🔗

@@ -5,8 +5,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # create a repo
 soft repo create repo1

testscript/testdata/repo-webhooks.txtar 🔗

@@ -2,8 +2,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # create a repo
 soft repo create repo-123

testscript/testdata/set-username.txtar 🔗

@@ -5,8 +5,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # get original username
 soft info

testscript/testdata/settings.txtar 🔗

@@ -2,8 +2,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # check default allow-keyless
 soft settings allow-keyless true

testscript/testdata/ssh-lfs.txtar 🔗

@@ -8,8 +8,8 @@ skip 'breaks with git-lfs 3.5.1'
 env SOFT_SERVE_LFS_SSH_ENABLED=true
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # create a user
 soft user create foo --key "$USER1_AUTHORIZED_KEY"

testscript/testdata/ssh.txtar 🔗

@@ -4,8 +4,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # create a user
 soft user create foo --key "$USER1_AUTHORIZED_KEY"

testscript/testdata/token.txtar 🔗

@@ -2,8 +2,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # create user
 soft user create user1 --key "$USER1_AUTHORIZED_KEY"

testscript/testdata/ui-home.txtar 🔗

@@ -2,8 +2,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # test repositories tab
 ui '"    q"'

testscript/testdata/user_management.txtar 🔗

@@ -5,8 +5,8 @@
 
 # start soft serve
 exec soft serve &
-# wait for server to start
-waitforserver
+# wait for SSH server to start
+ensureserverrunning SSH_PORT
 
 # add key to admin
 soft user add-pubkey admin "$ADMIN2_AUTHORIZED_KEY"