databricks-cli/libs/daemon/daemon_test.go

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

52 lines
1.3 KiB
Go
Raw Normal View History

package daemon
import (
"io"
"net/http"
"os"
"os/exec"
"path/filepath"
"strconv"
"testing"
"time"
"github.com/databricks/cli/internal/testutil"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestDaemon(t *testing.T) {
tmpDir := t.TempDir()
cmd := exec.Command("go", "run", "internal/parent_process/main.go", tmpDir)
// cmd.Run() will block until the parent process exits.
err := cmd.Run()
require.NoError(t, err)
// Assert that a PID file was created for the child process.
assert.FileExists(t, filepath.Join(tmpDir, "child.pid"))
// Wait 10 seconds for the server to start and to write the port number to
// a file.
portFilePath := filepath.Join(tmpDir, "port.txt")
assert.Eventually(t, func() bool {
_, err := os.Stat(portFilePath)
return err == nil
}, 10*time.Second, 100*time.Millisecond)
port, err := strconv.Atoi(testutil.ReadFile(t, portFilePath))
require.NoError(t, err)
// Query the local server, which should be alive even after the parent process
// has exited.
r, err := http.Get("http://localhost:" + strconv.Itoa(port))
require.NoError(t, err)
defer r.Body.Close()
// The server should respond with "child says hi".
assert.Equal(t, http.StatusOK, r.StatusCode)
b, err := io.ReadAll(r.Body)
require.NoError(t, err)
assert.Equal(t, "child says hi", string(b))
}