Skip to content

Commit 457fe5c

Browse files
committed
simplify udp example. update readme.
1 parent 0d30755 commit 457fe5c

File tree

3 files changed

+82
-57
lines changed

3 files changed

+82
-57
lines changed

README.md

+7-7
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ go install github.com/scgolang/osc
1212

1313
## Usage
1414

15-
### Server
15+
See the [ping pong example](https://godoc.org/github.com/scgolang/osc#example-UDPConn--Pingpong).
1616

17-
This is a fully functioning OSC server that uses UDP.
17+
## Contributing
1818

19-
```go
20-
package main
19+
This package aims to be high quality and completely compliant with the [OSC 1.0 Spec](http://opensoundcontrol.org/spec-1_0).
2120

22-
func main() {
23-
}
24-
```
21+
If there is anything missing or this package does not satisfy your use case please open an issue with a detailed description
22+
of what you are doing and we will try to address it as quickly as possible.
23+
24+
If you wish to contribute code, please write tests that cover _all_ your code.

udp_example_test.go

+71-48
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package osc
22

33
import (
4+
"errors"
45
"fmt"
56
"log"
67
"net"
@@ -21,22 +22,7 @@ func ExampleUDPConn_pingpong() {
2122
}
2223

2324
// Run the server in a new goroutine.
24-
go func() {
25-
errChan <- server.Serve(Dispatcher{
26-
"/ping": func(msg Message) error {
27-
fmt.Println("Server received ping.")
28-
return server.SendTo(msg.Sender, Message{Address: "/pong"})
29-
},
30-
"/close": func(msg Message) error {
31-
if err := server.SendTo(msg.Sender, Message{Address: "/close"}); err != nil {
32-
_ = server.Close()
33-
return err
34-
}
35-
fmt.Println("Server closing.")
36-
return server.Close()
37-
},
38-
})
39-
}()
25+
go serverDispatch(server, errChan)
4026

4127
// Setup the client.
4228
raddr, err := net.ResolveUDPAddr("udp", server.LocalAddr().String())
@@ -48,59 +34,96 @@ func ExampleUDPConn_pingpong() {
4834
log.Fatal(err)
4935
}
5036

51-
// Clients are also servers!
5237
var (
5338
pongChan = make(chan struct{})
5439
clientCloseChan = make(chan struct{})
5540
)
56-
57-
go func() {
58-
errChan <- client.Serve(Dispatcher{
59-
"/pong": func(msg Message) error {
60-
fmt.Println("Client received pong.")
61-
close(pongChan)
62-
return nil
63-
},
64-
"/close": func(msg Message) error {
65-
fmt.Println("Client closing.")
66-
close(clientCloseChan)
67-
return client.Close()
68-
},
69-
})
70-
}()
41+
// Clients are also servers!
42+
go clientDispatch(client, errChan, pongChan, clientCloseChan)
7143

7244
// Send the ping message, wait for the pong, then close both connections.
7345
if err := client.Send(Message{Address: "/ping"}); err != nil {
7446
log.Fatal(err)
7547
}
48+
if err := waitPong(pongChan, errChan); err != nil {
49+
log.Fatal(err)
50+
}
51+
52+
if err := client.Send(Message{Address: "/close"}); err != nil {
53+
log.Fatal(err)
54+
}
55+
if err := waitErr(errChan); err != nil {
56+
log.Fatal(err)
57+
}
58+
if err := waitClose(clientCloseChan, errChan); err != nil {
59+
log.Fatal(err)
60+
}
61+
// Output:
62+
// Server received ping.
63+
// Client received pong.
64+
// Server closing.
65+
// Client closing.
66+
}
67+
68+
func serverDispatch(server *UDPConn, errChan chan error) {
69+
errChan <- server.Serve(Dispatcher{
70+
"/ping": func(msg Message) error {
71+
fmt.Println("Server received ping.")
72+
return server.SendTo(msg.Sender, Message{Address: "/pong"})
73+
},
74+
"/close": func(msg Message) error {
75+
if err := server.SendTo(msg.Sender, Message{Address: "/close"}); err != nil {
76+
_ = server.Close()
77+
return err
78+
}
79+
fmt.Println("Server closing.")
80+
return server.Close()
81+
},
82+
})
83+
}
84+
85+
func clientDispatch(client *UDPConn, errChan chan error, pongChan chan struct{}, closeChan chan struct{}) {
86+
errChan <- client.Serve(Dispatcher{
87+
"/pong": func(msg Message) error {
88+
fmt.Println("Client received pong.")
89+
close(pongChan)
90+
return nil
91+
},
92+
"/close": func(msg Message) error {
93+
fmt.Println("Client closing.")
94+
close(closeChan)
95+
return client.Close()
96+
},
97+
})
98+
}
99+
100+
func waitPong(pongChan chan struct{}, errChan chan error) error {
76101
select {
77102
case <-time.After(2 * time.Second):
78-
log.Fatal("timeout")
103+
return errors.New("timeout")
79104
case err := <-errChan:
80105
if err != nil {
81-
log.Fatal(err)
106+
return err
82107
}
83108
case <-pongChan:
84109
}
85-
if err := client.Send(Message{Address: "/close"}); err != nil {
86-
log.Fatal(err)
87-
}
110+
return nil
111+
}
112+
113+
func waitErr(errChan chan error) error {
88114
select {
89115
case <-time.After(2 * time.Second):
90-
log.Fatal("timeout")
116+
return errors.New("timeout")
91117
case err := <-errChan:
92-
if err != nil {
93-
log.Fatal(err)
94-
}
118+
return err
95119
}
120+
}
121+
122+
func waitClose(closeChan chan struct{}, errChan chan error) error {
96123
select {
97124
case <-time.After(2 * time.Second):
98-
log.Fatal("timeout")
99-
case <-clientCloseChan:
125+
return errors.New("timeout")
126+
case <-closeChan:
100127
}
101-
// Output:
102-
// Server received ping.
103-
// Client received pong.
104-
// Server closing.
105-
// Client closing.
128+
return nil
106129
}

udp_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ func TestDialUDPContext(t *testing.T) {
5555
if err != nil {
5656
t.Fatal(err)
5757
}
58-
ctxTimeout, _ := context.WithTimeout(c.Context(), 20*time.Millisecond)
58+
ctxTimeout, cancel := context.WithTimeout(c.Context(), 20*time.Millisecond)
59+
defer cancel()
5960
c.SetContext(ctxTimeout)
6061
if c.Context() != ctxTimeout {
6162
t.Fatalf("expected %+v to be %+v", ctxTimeout, c.Context())
@@ -126,7 +127,8 @@ func TestUDPConnServe_ContextTimeout(t *testing.T) {
126127
if err != nil {
127128
t.Fatal(err)
128129
}
129-
timeoutCtx, _ := context.WithTimeout(context.Background(), 20*time.Millisecond)
130+
timeoutCtx, cancel := context.WithTimeout(context.Background(), 20*time.Millisecond)
131+
defer cancel()
130132
server, err := ListenUDPContext(timeoutCtx, "udp", laddr)
131133
if err != nil {
132134
t.Fatal(err)

0 commit comments

Comments
 (0)