Skip to content

Commit b886469

Browse files
committed
Made stdio test more reliable by running fake discovery through TCP
1 parent 31ce0cf commit b886469

File tree

4 files changed

+41
-17
lines changed

4 files changed

+41
-17
lines changed

client_test.go

+16-10
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
package discovery
1919

2020
import (
21-
"io"
21+
"net"
2222
"testing"
2323
"time"
2424

@@ -27,25 +27,31 @@ import (
2727
)
2828

2929
func TestDiscoveryStdioHandling(t *testing.T) {
30-
// Build `cat` helper inside testdata/cat
30+
// Build `netcat` helper inside testdata/cat
3131
builder, err := paths.NewProcess(nil, "go", "build")
3232
require.NoError(t, err)
33-
builder.SetDir("testdata/cat")
33+
builder.SetDir("testdata/netcat")
3434
require.NoError(t, builder.Run())
3535

36-
// Run cat and test if streaming json works as expected
37-
disc := NewClient("test", "testdata/cat/cat") // copy stdin to stdout
36+
// Run netcat and test if streaming json works as expected
37+
listener, err := net.ListenTCP("tcp", nil)
38+
require.NoError(t, err)
3839

40+
disc := NewClient("test", "testdata/netcat/netcat", listener.Addr().String())
3941
err = disc.runProcess()
4042
require.NoError(t, err)
4143

42-
_, err = disc.outgoingCommandsPipe.Write([]byte(`{ "eventType":`)) // send partial JSON
44+
listener.SetDeadline(time.Now().Add(time.Second))
45+
conn, err := listener.Accept()
46+
require.NoError(t, err)
47+
48+
_, err = conn.Write([]byte(`{ "eventType":`)) // send partial JSON
4349
require.NoError(t, err)
4450
msg, err := disc.waitMessage(time.Millisecond * 100)
4551
require.Error(t, err)
4652
require.Nil(t, msg)
4753

48-
_, err = disc.outgoingCommandsPipe.Write([]byte(`"ev1" }{ `)) // complete previous json and start another one
54+
_, err = conn.Write([]byte(`"ev1" }{ `)) // complete previous json and start another one
4955
require.NoError(t, err)
5056

5157
msg, err = disc.waitMessage(time.Millisecond * 100)
@@ -57,7 +63,7 @@ func TestDiscoveryStdioHandling(t *testing.T) {
5763
require.Error(t, err)
5864
require.Nil(t, msg)
5965

60-
_, err = disc.outgoingCommandsPipe.Write([]byte(`"eventType":"ev2" }`)) // complete previous json
66+
_, err = conn.Write([]byte(`"eventType":"ev2" }`)) // complete previous json
6167
require.NoError(t, err)
6268

6369
msg, err = disc.waitMessage(time.Millisecond * 100)
@@ -67,9 +73,9 @@ func TestDiscoveryStdioHandling(t *testing.T) {
6773

6874
require.True(t, disc.Alive())
6975

70-
err = disc.outgoingCommandsPipe.(io.ReadCloser).Close()
76+
err = conn.Close()
7177
require.NoError(t, err)
72-
time.Sleep(time.Millisecond * 100)
78+
time.Sleep(time.Millisecond * 500)
7379

7480
require.False(t, disc.Alive())
7581
}

testdata/cat/.gitignore

-2
This file was deleted.

testdata/netcat/.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
netcat
2+
netcat.exe
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// This file is part of arduino-cli.
1+
// This file is part of pluggable-discovery-protocol-handler.
22
//
3-
// Copyright 2023 ARDUINO SA (http://www.arduino.cc/)
3+
// Copyright 2024 ARDUINO SA (http://www.arduino.cc/)
44
//
55
// This software is released under the GNU General Public License version 3,
66
// which covers the main part of arduino-cli.
@@ -13,16 +13,34 @@
1313
// Arduino software without disclosing the source code of your own applications.
1414
// To purchase a commercial license, send an email to [email protected].
1515

16-
// Echo stdin to stdout.
16+
// Proxy stdin/stdout through a TCP socket.
1717
// This program is used for testing purposes, to make it available on all
18-
// OS a tool equivalent to UNIX "cat".
18+
// OS a tool equivalent to UNIX "nc".
1919
package main
2020

2121
import (
2222
"io"
23+
"net"
2324
"os"
2425
)
2526

2627
func main() {
27-
io.Copy(os.Stdout, os.Stdin)
28+
tcpAddr, err := net.ResolveTCPAddr("tcp", os.Args[1])
29+
if err != nil {
30+
println("ResolveTCPAddr failed:", err.Error())
31+
os.Exit(1)
32+
}
33+
34+
conn, err := net.DialTCP("tcp", nil, tcpAddr)
35+
if err != nil {
36+
println("Dial failed:", err.Error())
37+
os.Exit(1)
38+
}
39+
40+
go func() {
41+
io.Copy(os.Stdout, conn)
42+
os.Exit(0)
43+
}()
44+
io.Copy(conn, os.Stdin)
45+
os.Exit(0)
2846
}

0 commit comments

Comments
 (0)