| package coap |
| |
| import ( |
| "net" |
| "testing" |
| ) |
| |
| func startUDPLisenter(t *testing.T) (*net.UDPConn, string) { |
| udpAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0") |
| if err != nil { |
| t.Fatal("Can't resolve UDP addr") |
| } |
| udpListener, err := net.ListenUDP("udp", udpAddr) |
| if err != nil { |
| t.Fatal("Can't listen on UDP") |
| } |
| coapServerAddr := udpListener.LocalAddr().String() |
| return udpListener, coapServerAddr |
| } |
| |
| func dialAndSend(t *testing.T, addr string, req Message) Message { |
| c, err := Dial("udp", addr) |
| if err != nil { |
| t.Fatalf("Error dialing: %v", err) |
| } |
| m, err := c.Send(req) |
| if err != nil { |
| t.Fatalf("Error sending request: %v", err) |
| } |
| return m |
| } |
| |
| func TestServeWithAckResponse(t *testing.T) { |
| req := &DgramMessage{ |
| MessageBase{ |
| typ: Confirmable, |
| code: POST, |
| messageID: 9876, |
| payload: []byte("Content sent by client"), |
| }, |
| } |
| req.SetOption(ContentFormat, TextPlain) |
| req.SetPathString("/req/path") |
| |
| res := &DgramMessage{ |
| MessageBase{ |
| typ: Acknowledgement, |
| code: Content, |
| messageID: req.MessageID(), |
| payload: []byte("Reply from CoAP server"), |
| }, |
| } |
| res.SetOption(ContentFormat, TextPlain) |
| res.SetPath(req.Path()) |
| |
| handler := FuncHandler(func(l *net.UDPConn, a *net.UDPAddr, m Message) Message { |
| assertEqualMessages(t, req, m) |
| return res |
| }) |
| |
| udpListener, coapServerAddr := startUDPLisenter(t) |
| defer udpListener.Close() |
| go Serve(udpListener, handler) |
| |
| m := dialAndSend(t, coapServerAddr, req) |
| if m == nil { |
| t.Fatalf("Didn't receive CoAP response") |
| } |
| assertEqualMessages(t, res, m) |
| } |
| |
| func TestServeWithoutAckResponse(t *testing.T) { |
| req := &DgramMessage{ |
| MessageBase{ |
| typ: NonConfirmable, |
| code: POST, |
| messageID: 54321, |
| payload: []byte("Content sent by client"), |
| }, |
| } |
| req.SetOption(ContentFormat, AppOctets) |
| |
| handler := FuncHandler(func(l *net.UDPConn, a *net.UDPAddr, m Message) Message { |
| assertEqualMessages(t, req, m) |
| return nil |
| }) |
| |
| udpListener, coapServerAddr := startUDPLisenter(t) |
| defer udpListener.Close() |
| go Serve(udpListener, handler) |
| |
| m := dialAndSend(t, coapServerAddr, req) |
| if m != nil { |
| t.Fatalf("Received response packet, but expected none") |
| } |
| } |