forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
1package models
2
3import (
4 "bufio"
5 "encoding/json"
6 "errors"
7 "os"
8 "path/filepath"
9 "testing"
10
11 "github.com/stretchr/testify/assert"
12 "github.com/stretchr/testify/require"
13)
14
15func TestParseSetupError(t *testing.T) {
16 tests := []struct {
17 name string
18 err error
19 expected string
20 }{
21 {
22 name: "valid nixery error",
23 err: errors.New(`Error response from daemon: unknown: {"errors":[{"code":"MANIFEST_UNKNOWN","message":"Could not find Nix packages: [gopher123]"}]}`),
24 expected: "Could not find Nix packages: [gopher123]",
25 },
26 {
27 name: "multiple errors returns first",
28 err: errors.New(`Error response from daemon: unknown: {"errors":[{"code":"A","message":"first error"},{"code":"B","message":"second error"}]}`),
29 expected: "first error",
30 },
31 {
32 name: "no unknown marker fallback",
33 err: errors.New("some other docker error"),
34 expected: "some other docker error",
35 },
36 {
37 name: "malformed JSON fallback",
38 err: errors.New(`Error response from daemon: unknown: {invalid json}`),
39 expected: `Error response from daemon: unknown: {invalid json}`,
40 },
41 {
42 name: "empty errors array fallback",
43 err: errors.New(`Error response from daemon: unknown: {"errors":[]}`),
44 expected: `Error response from daemon: unknown: {"errors":[]}`,
45 },
46 {
47 name: "empty message field fallback",
48 err: errors.New(`Error response from daemon: unknown: {"errors":[{"code":"X","message":""}]}`),
49 expected: `Error response from daemon: unknown: {"errors":[{"code":"X","message":""}]}`,
50 },
51 {
52 name: "nil error",
53 err: nil,
54 expected: "",
55 },
56 {
57 name: "real world nixery error",
58 err: errors.New(`Error response from daemon: unknown: {"errors":[{"code":"MANIFEST_UNKNOWN","message":"Could not find Nix packages: [nonexistent-package-xyz]"}]}`),
59 expected: "Could not find Nix packages: [nonexistent-package-xyz]",
60 },
61 }
62
63 for _, tt := range tests {
64 t.Run(tt.name, func(t *testing.T) {
65 result := ParseSetupError(tt.err)
66 assert.Equal(t, tt.expected, result)
67 })
68 }
69}
70
71func TestWriteSetupError(t *testing.T) {
72 // Create temp directory
73 tempDir := t.TempDir()
74
75 wid := WorkflowId{
76 PipelineId: PipelineId{
77 Knot: "test.example.com",
78 Rkey: "abc123",
79 },
80 Name: "test-workflow",
81 }
82
83 // Create logger
84 logger, err := NewWorkflowLogger(tempDir, wid)
85 require.NoError(t, err)
86 defer logger.Close()
87
88 // Write setup error
89 testMessage := "Could not find Nix packages: [gopher123]"
90 err = logger.WriteSetupError(testMessage)
91 require.NoError(t, err)
92
93 // Close logger to flush
94 err = logger.Close()
95 require.NoError(t, err)
96
97 // Read the log file
98 logPath := filepath.Join(tempDir, wid.String()+".log")
99 file, err := os.Open(logPath)
100 require.NoError(t, err)
101 defer file.Close()
102
103 scanner := bufio.NewScanner(file)
104
105 // Line 1: Control message (step start)
106 require.True(t, scanner.Scan(), "expected control start line")
107 var controlStart LogLine
108 require.NoError(t, json.Unmarshal(scanner.Bytes(), &controlStart))
109 assert.Equal(t, LogKindControl, controlStart.Kind)
110 assert.Equal(t, "Setup", controlStart.Content)
111 assert.Equal(t, 0, controlStart.StepId)
112 assert.Equal(t, StepKindSystem, controlStart.StepKind)
113 assert.Equal(t, StepStatusStart, controlStart.StepStatus)
114
115 // Line 2: Data message (error content)
116 require.True(t, scanner.Scan(), "expected data line")
117 var dataLine LogLine
118 require.NoError(t, json.Unmarshal(scanner.Bytes(), &dataLine))
119 assert.Equal(t, LogKindData, dataLine.Kind)
120 assert.Equal(t, testMessage, dataLine.Content)
121 assert.Equal(t, 0, dataLine.StepId)
122 assert.Equal(t, "stderr", dataLine.Stream)
123
124 // Line 3: Control message (step end)
125 require.True(t, scanner.Scan(), "expected control end line")
126 var controlEnd LogLine
127 require.NoError(t, json.Unmarshal(scanner.Bytes(), &controlEnd))
128 assert.Equal(t, LogKindControl, controlEnd.Kind)
129 assert.Equal(t, StepStatusEnd, controlEnd.StepStatus)
130}