Skip to content

Commit 30a0cf2

Browse files
committed
refactoring code for testing
1 parent 55a1259 commit 30a0cf2

File tree

2 files changed

+47
-97
lines changed

2 files changed

+47
-97
lines changed

pkg/board/board.go

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -369,13 +369,6 @@ func EnableNetworkMode(ctx context.Context, conn remote.RemoteConn) error {
369369
}
370370

371371
func setSerialNumber(ctx context.Context, conn remote.RemoteConn, serialNumber, filePath string) error {
372-
serialCheckRegex := regexp.MustCompile(`<\s*txt-record\s*>\s*serial_number=\S+\s*<\s*/txt-record\s*>`)
373-
serviceEndTag := regexp.MustCompile(`</service>`)
374-
newSerialTemplate := `<txt-record>serial_number=%s</txt-record>
375-
`
376-
if serialNumber == "" {
377-
return errors.New("missing or empty serial number")
378-
}
379372
data, err := os.ReadFile(filePath)
380373
if err != nil {
381374
if os.IsNotExist(err) {
@@ -384,39 +377,58 @@ func setSerialNumber(ctx context.Context, conn remote.RemoteConn, serialNumber,
384377
}
385378
return err
386379
}
387-
if serialCheckRegex.Match(data) {
380+
newData, err := setSerialNumberContent(data, serialNumber)
381+
if err != nil {
382+
return err
383+
}
384+
if newData == nil {
388385
return nil
389386
}
387+
tmpPath := "/tmp/avahi_arduino_conf.service"
388+
if err := conn.WriteFile(bytes.NewReader(newData), tmpPath); err != nil {
389+
return fmt.Errorf("failed to write temporary file on remote: %w", err)
390+
}
391+
if out, err := conn.GetCmd("sudo", "mv", tmpPath, filePath).Output(ctx); err != nil {
392+
return fmt.Errorf("failed to move file into place with sudo mv: %w: %s", err, string(out))
393+
}
394+
if out, err := conn.GetCmd("sudo", "chmod", "0644", filePath).Output(ctx); err != nil {
395+
slog.Warn("failed to set permissions on remote service file", "file", filePath, "error", err, "output", string(out))
396+
}
397+
return nil
398+
}
399+
400+
func setSerialNumberContent(data []byte, serialNumber string) (newData []byte, err error) {
401+
serialCheckRegex := regexp.MustCompile(`<\s*txt-record\s*>\s*serial_number=\S+\s*<\s*/txt-record\s*>`)
402+
serviceEndTag := regexp.MustCompile(`</service>`)
403+
newSerialTemplate := `<txt-record>serial_number=%s</txt-record>
404+
`
405+
if serialNumber == "" {
406+
return nil, errors.New("missing or empty serial number")
407+
}
408+
409+
if serialCheckRegex.Match(data) {
410+
return nil, nil
411+
}
412+
390413
loc := serviceEndTag.FindIndex(data)
391414
if loc == nil {
392-
return errors.New(" </service> tag not found in the service file")
415+
return nil, errors.New(" </service> tag not found in the service file")
393416
}
394417

395418
var buf bytes.Buffer
396419
_, err = buf.Write(data[:loc[0]])
397420
if err != nil {
398-
return err
421+
return nil, err
399422
}
400423
_, err = buf.WriteString(fmt.Sprintf(newSerialTemplate, serialNumber))
401424
if err != nil {
402-
return err
425+
return nil, err
403426
}
404427
_, err = buf.Write(data[loc[0]:])
405428
if err != nil {
406-
return err
429+
return nil, err
407430
}
408-
409-
tmpPath := "/tmp/avahi_arduino_conf.service"
410-
if err := conn.WriteFile(bytes.NewReader(buf.Bytes()), tmpPath); err != nil {
411-
return fmt.Errorf("failed to write temporary file on remote: %w", err)
412-
}
413-
if out, err := conn.GetCmd("sudo", "mv", tmpPath, filePath).Output(ctx); err != nil {
414-
return fmt.Errorf("failed to move file into place with sudo mv: %w: %s", err, string(out))
415-
}
416-
if out, err := conn.GetCmd("sudo", "chmod", "0644", filePath).Output(ctx); err != nil {
417-
slog.Warn("failed to set permissions on remote service file", "file", filePath, "error", err, "output", string(out))
418-
}
419-
return nil
431+
return buf.Bytes(), nil
420432
}
421433

422434
func NetworkModeStatus(ctx context.Context, conn remote.RemoteConn) (bool, error) {

pkg/board/board_test.go

Lines changed: 11 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ func TestEnsurePlatformInstalled(t *testing.T) {
3333
}
3434

3535
func TestSetSerialNumber(t *testing.T) {
36-
3736
testCases := []struct {
3837
name string
3938
initialContent string
@@ -58,14 +57,6 @@ func TestSetSerialNumber(t *testing.T) {
5857
<type>_arduino._tcp</type>
5958
<port>80</port>
6059
<txt-record>board=unoq</txt-record>
61-
<txt-record>vid=0x2341</txt-record>
62-
<txt-record>pid=0x0078</txt-record>
63-
<txt-record>vid.0=0x2341</txt-record>
64-
<txt-record>pid.0=0x0078</txt-record>
65-
<txt-record>distro_version=0.1</txt-record>
66-
<txt-record>ssh_upload=no</txt-record>
67-
<txt-record>tcp_check=no</txt-record>
68-
<txt-record>auth_upload=yes</txt-record>
6960
</service>
7061
</service-group>
7162
`,
@@ -79,14 +70,6 @@ func TestSetSerialNumber(t *testing.T) {
7970
<type>_arduino._tcp</type>
8071
<port>80</port>
8172
<txt-record>board=unoq</txt-record>
82-
<txt-record>vid=0x2341</txt-record>
83-
<txt-record>pid=0x0078</txt-record>
84-
<txt-record>vid.0=0x2341</txt-record>
85-
<txt-record>pid.0=0x0078</txt-record>
86-
<txt-record>distro_version=0.1</txt-record>
87-
<txt-record>ssh_upload=no</txt-record>
88-
<txt-record>tcp_check=no</txt-record>
89-
<txt-record>auth_upload=yes</txt-record>
9073
<txt-record>serial_number=123456789</txt-record>
9174
</service>
9275
</service-group>
@@ -95,60 +78,30 @@ func TestSetSerialNumber(t *testing.T) {
9578
{
9679
name: "serial number not provided",
9780
initialContent: `<?xml version="1.0" standalone='no'?>
98-
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
9981
<service-group>
100-
<name replace-wildcards="yes">%h</name>
10182
<service>
102-
<type>_arduino._tcp</type>
103-
<port>80</port>
10483
<txt-record>board=unoq</txt-record>
10584
</service>
10685
</service-group>
10786
`,
10887
serialNumber: "",
10988
expectedErr: true,
110-
expectedContent: ``,
89+
expectedContent: "",
11190
},
11291
{
11392
name: "serial number already present",
11493
initialContent: `<?xml version="1.0" standalone='no'?>
115-
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
11694
<service-group>
117-
<name replace-wildcards="yes">%h</name>
11895
<service>
119-
<type>_arduino._tcp</type>
120-
<port>80</port>
121-
<txt-record>board=unoq</txt-record>
122-
<txt-record>vid=0x2341</txt-record>
123-
<txt-record>pid=0x0078</txt-record>
124-
<txt-record>vid.0=0x2341</txt-record>
125-
<txt-record>pid.0=0x0078</txt-record>
126-
<txt-record>distro_version=0.1</txt-record>
127-
<txt-record>ssh_upload=no</txt-record>
128-
<txt-record>tcp_check=no</txt-record>
129-
<txt-record>auth_upload=yes</txt-record>
13096
<txt-record>serial_number=123456789</txt-record>
13197
</service>
13298
</service-group>
13399
`,
134100
serialNumber: "111111111",
135101
expectedErr: false,
136102
expectedContent: `<?xml version="1.0" standalone='no'?>
137-
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
138103
<service-group>
139-
<name replace-wildcards="yes">%h</name>
140104
<service>
141-
<type>_arduino._tcp</type>
142-
<port>80</port>
143-
<txt-record>board=unoq</txt-record>
144-
<txt-record>vid=0x2341</txt-record>
145-
<txt-record>pid=0x0078</txt-record>
146-
<txt-record>vid.0=0x2341</txt-record>
147-
<txt-record>pid.0=0x0078</txt-record>
148-
<txt-record>distro_version=0.1</txt-record>
149-
<txt-record>ssh_upload=no</txt-record>
150-
<txt-record>tcp_check=no</txt-record>
151-
<txt-record>auth_upload=yes</txt-record>
152105
<txt-record>serial_number=123456789</txt-record>
153106
</service>
154107
</service-group>
@@ -157,12 +110,8 @@ func TestSetSerialNumber(t *testing.T) {
157110
{
158111
name: "missing service tag",
159112
initialContent: `<?xml version="1.0" standalone='no'?>
160-
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
161113
<service-group>
162-
<name replace-wildcards="yes">%h</name>
163-
<service>
164-
<type>_arduino._tcp</type>
165-
<port>80</port>
114+
</service-group>
166115
`,
167116
serialNumber: "111111111",
168117
expectedErr: true,
@@ -172,33 +121,22 @@ func TestSetSerialNumber(t *testing.T) {
172121

173122
for _, tc := range testCases {
174123
t.Run(tc.name, func(t *testing.T) {
175-
tmpFile, err := os.CreateTemp("", "arduino.service.*.xml")
176-
require.NoError(t, err)
177-
filePath := tmpFile.Name()
178-
defer os.Remove(filePath)
179-
180-
if tc.initialContent != "" {
181-
_, err = tmpFile.WriteString(tc.initialContent)
182-
require.NoError(t, err)
183-
}
184-
tmpFile.Close()
185-
186-
if tc.initialContent == "" {
187-
err = os.Remove(filePath)
188-
require.NoError(t, err)
189-
err = setSerialNumber(tc.serialNumber, filePath)
190-
require.NoError(t, err)
124+
if tc.name == "Non-existing file" {
125+
t.Skip("Skipping test case handled by setSerialNumber (os.IsNotExist)")
191126
return
192127
}
128+
updatedContent, err := setSerialNumberContent([]byte(tc.initialContent), tc.serialNumber)
193129

194-
err = setSerialNumber(tc.serialNumber, filePath)
195130
if tc.expectedErr {
196131
require.Error(t, err)
197132
} else {
198133
require.NoError(t, err)
199-
updatedContent, err := os.ReadFile(filePath)
200-
require.NoError(t, err)
201-
require.Equal(t, tc.expectedContent, string(updatedContent))
134+
135+
if tc.name == "serial number already present" {
136+
require.Nil(t, updatedContent, "Content should be nil when serial is already present")
137+
} else {
138+
require.Equal(t, tc.expectedContent, string(updatedContent))
139+
}
202140
}
203141
})
204142
}

0 commit comments

Comments
 (0)