mirror of https://github.com/databricks/cli.git
52 lines
1.3 KiB
Go
52 lines
1.3 KiB
Go
|
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))
|
||
|
}
|