11package api
22
33import (
4+ "fmt"
45 "testing"
56 "time"
67
@@ -39,7 +40,21 @@ func TestCreateImage_Async(t *testing.T) {
3940 svc := newTestService (t )
4041 ctx := ctx ()
4142
42- t .Log ("Creating image..." )
43+ // Create images before alpine to populate the queue
44+ t .Log ("Creating image queue..." )
45+ queueImages := []string {
46+ "docker.io/library/busybox:latest" ,
47+ "docker.io/library/nginx:alpine" ,
48+ }
49+ for _ , name := range queueImages {
50+ _ , err := svc .CreateImage (ctx , oapi.CreateImageRequestObject {
51+ Body : & oapi.CreateImageRequest {Name : name },
52+ })
53+ require .NoError (t , err )
54+ }
55+
56+ // Create alpine (should be last in queue)
57+ t .Log ("Creating alpine image (should be queued)..." )
4358 createResp , err := svc .CreateImage (ctx , oapi.CreateImageRequestObject {
4459 Body : & oapi.CreateImageRequest {
4560 Name : "docker.io/library/alpine:latest" ,
@@ -53,22 +68,35 @@ func TestCreateImage_Async(t *testing.T) {
5368 img := oapi .Image (acceptedResp )
5469 require .Equal (t , "docker.io/library/alpine:latest" , img .Name )
5570 require .Equal (t , "img-alpine-latest" , img .Id )
56- t .Logf ("Image created: id=%s, initial_status=%s" , img .Id , img .Status )
71+ t .Logf ("Image created: id=%s, initial_status=%s, queue_position=%v" ,
72+ img .Id , img .Status , img .QueuePosition )
5773
5874 // Poll until ready
5975 t .Log ("Polling for completion..." )
60- for i := 0 ; i < 300 ; i ++ {
76+ lastStatus := img .Status
77+ lastQueuePos := getQueuePos (img .QueuePosition )
78+
79+ for i := 0 ; i < 3000 ; i ++ {
6180 getResp , err := svc .GetImage (ctx , oapi.GetImageRequestObject {Id : img .Id })
6281 require .NoError (t , err )
6382
6483 imgResp , ok := getResp .(oapi.GetImage200JSONResponse )
6584 require .True (t , ok , "expected 200 response" )
6685
6786 currentImg := oapi .Image (imgResp )
87+ currentQueuePos := getQueuePos (currentImg .QueuePosition )
6888
69- if i % 10 == 0 || currentImg .Status != img .Status {
70- t .Logf ("Poll #%d: status=%s, queue_position=%v, has_size=%v" ,
71- i + 1 , currentImg .Status , currentImg .QueuePosition , currentImg .SizeBytes != nil )
89+ // Log when status or queue position changes
90+ if currentImg .Status != lastStatus || currentQueuePos != lastQueuePos {
91+ t .Logf ("Update: status=%s, queue_position=%v" , currentImg .Status , formatQueuePos (currentImg .QueuePosition ))
92+
93+ // Queue position should only decrease (never increase)
94+ if lastQueuePos > 0 && currentQueuePos > lastQueuePos {
95+ t .Errorf ("Queue position increased: %d -> %d" , lastQueuePos , currentQueuePos )
96+ }
97+
98+ lastStatus = currentImg .Status
99+ lastQueuePos = currentQueuePos
72100 }
73101
74102 if currentImg .Status == oapi .ImageStatus (images .StatusReady ) {
@@ -87,9 +115,24 @@ func TestCreateImage_Async(t *testing.T) {
87115 t .Fatalf ("Build failed: %s" , errMsg )
88116 }
89117
90- time .Sleep (100 * time .Millisecond )
118+ time .Sleep (10 * time .Millisecond )
91119 }
92120
93121 t .Fatal ("Build did not complete within 30 seconds" )
94122}
95123
124+ func getQueuePos (pos * int ) int {
125+ if pos == nil {
126+ return 0
127+ }
128+ return * pos
129+ }
130+
131+ func formatQueuePos (pos * int ) string {
132+ if pos == nil {
133+ return "none"
134+ }
135+ return fmt .Sprintf ("%d" , * pos )
136+ }
137+
138+
0 commit comments