package codex import ( "encoding/base64" "os" "path/filepath" "testing" ) func TestCanvasArtifactDirectoryIsolation(t *testing.T) { root := t.TempDir() generated := filepath.Join(root, "generated_images") if err := os.Mkdir(generated, 0700); err != nil { t.Fatal(err) } // A minimal PNG header is sufficient for the worker's transport sniff. Core // performs full decode/dimension validation before accepting it as an asset. encoded, _ := base64.StdEncoding.DecodeString("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+j1WQAAAAASUVORK5CYII=") if err := os.WriteFile(filepath.Join(root, "unrelated.png"), encoded, 0600); err != nil { t.Fatal(err) } if _, err := readCanvasGeneratedImage(generated); err == nil { t.Fatal("unrelated image used as generated output") } if err := os.WriteFile(filepath.Join(generated, "result.png"), encoded, 0600); err != nil { t.Fatal(err) } result, err := readCanvasGeneratedImage(generated) if err != nil || result.MIME != "image/png" || len(result.Data) != len(encoded) { t.Fatalf("generated output: %v", err) } if err := os.WriteFile(filepath.Join(generated, "second.png"), encoded, 0600); err != nil { t.Fatal(err) } if _, err := readCanvasGeneratedImage(generated); err == nil { t.Fatal("multiple images silently dropped") } if err := os.Remove(filepath.Join(generated, "second.png")); err != nil { t.Fatal(err) } if err := os.Remove(filepath.Join(generated, "result.png")); err != nil { t.Fatal(err) } if err := os.Symlink(filepath.Join(root, "unrelated.png"), filepath.Join(generated, "escape.png")); err != nil { t.Fatal(err) } if _, err := readCanvasGeneratedImage(generated); err == nil { t.Fatal("symlink escaped job output directory") } } func TestCanvasAgentCompletionRequiresSuccessfulTurn(t *testing.T) { if _, ok := canvasAgentText([]byte("{\"type\":\"item.completed\",\"item\":{\"type\":\"agent_message\",\"text\":\"partial\"}}\n")); ok { t.Fatal("partial generation accepted") } if _, ok := canvasAgentText([]byte("{\"type\":\"turn.completed\"}\n{\"type\":\"error\"}\n")); ok { t.Fatal("failed generation accepted") } text, ok := canvasAgentText([]byte("{\"type\":\"item.completed\",\"item\":{\"type\":\"agent_message\",\"text\":\"done\"}}\n{\"type\":\"turn.completed\"}\n")) if !ok || text != "done" { t.Fatal("successful generation rejected") } }