@@ -20,6 +20,7 @@ import (
2020 "os"
2121 "os/exec"
2222 "path/filepath"
23+ "runtime"
2324 "strconv"
2425 "strings"
2526 "testing"
@@ -53,15 +54,27 @@ func run(m *testing.M) int {
5354 fmt .Fprintf (os .Stderr , "e2e: %v\n " , err )
5455 return 1
5556 }
57+ cliBin = filepath .Join (root , "cmd" , "cli" , "model-cli" )
58+
59+ if runtime .GOOS == "darwin" {
60+ return runNative (m , root )
61+ }
62+ return runDocker (m , root )
63+ }
5664
57- fmt .Fprintln (os .Stderr , "e2e: building server and CLI..." )
65+ // runNative builds the server from source and runs it as a local process.
66+ func runNative (m * testing.M , root string ) int {
67+ fmt .Fprintln (os .Stderr , "e2e: building llama.cpp, server, and CLI..." )
68+ if err := makeTarget (root , "build-llamacpp" ); err != nil {
69+ fmt .Fprintf (os .Stderr , "e2e: make build-llamacpp failed: %v\n " , err )
70+ return 1
71+ }
5872 if err := makeTarget (root , "build" ); err != nil {
5973 fmt .Fprintf (os .Stderr , "e2e: make build failed: %v\n " , err )
6074 return 1
6175 }
6276
6377 serverBin := filepath .Join (root , "model-runner" )
64- cliBin = filepath .Join (root , "cmd" , "cli" , "model-cli" )
6578 llamaBin := filepath .Join (root , "llamacpp" , "install" , "bin" )
6679
6780 for _ , path := range []string {serverBin , cliBin , llamaBin } {
@@ -105,12 +118,50 @@ func run(m *testing.M) int {
105118 _ = server .Wait ()
106119 }()
107120
121+ return waitAndRunTests (m )
122+ }
123+
124+ // runDocker builds the Docker image and CLI from source, then lets the CLI
125+ // auto-start the model-runner container on the default Moby port (12434).
126+ func runDocker (m * testing.M , root string ) int {
127+ fmt .Fprintln (os .Stderr , "e2e: building Docker image and CLI..." )
128+ if err := makeTarget (root , "docker-build" ); err != nil {
129+ fmt .Fprintf (os .Stderr , "e2e: make docker-build failed: %v\n " , err )
130+ return 1
131+ }
132+ if err := makeTarget (root , "build-cli" ); err != nil {
133+ fmt .Fprintf (os .Stderr , "e2e: make build-cli failed: %v\n " , err )
134+ return 1
135+ }
136+
137+ // Tag the locally built image so install-runner uses it
138+ // instead of pulling from Docker Hub.
139+ tag := exec .Command ("docker" , "tag" , "docker/model-runner:latest" , "docker/model-runner:e2e-local" )
140+ if err := tag .Run (); err != nil {
141+ fmt .Fprintf (os .Stderr , "e2e: docker tag failed: %v\n " , err )
142+ return 1
143+ }
144+
145+ fmt .Fprintln (os .Stderr , "e2e: installing runner..." )
146+ cmd := exec .Command (cliBin , "install-runner" )
147+ cmd .Env = append (os .Environ (), "MODEL_RUNNER_CONTROLLER_VERSION=e2e-local" )
148+ cmd .Stdout = os .Stderr
149+ cmd .Stderr = os .Stderr
150+ if err := cmd .Run (); err != nil {
151+ fmt .Fprintf (os .Stderr , "e2e: install-runner failed: %v\n " , err )
152+ return 1
153+ }
154+
155+ serverURL = "http://localhost:12434"
156+ return waitAndRunTests (m )
157+ }
158+
159+ func waitAndRunTests (m * testing.M ) int {
108160 if err := waitForServer (serverURL + "/models" , serverStartTimeout ); err != nil {
109161 fmt .Fprintf (os .Stderr , "e2e: %v\n " , err )
110162 return 1
111163 }
112164 fmt .Fprintf (os .Stderr , "e2e: server ready at %s\n " , serverURL )
113-
114165 return m .Run ()
115166}
116167
0 commit comments