| // Copyright 2014 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package icmp_test |
| |
| import ( |
| "net" |
| "reflect" |
| "testing" |
| |
| "golang.org/x/net/icmp" |
| "golang.org/x/net/internal/iana" |
| "golang.org/x/net/ipv4" |
| "golang.org/x/net/ipv6" |
| ) |
| |
| var marshalAndParseMessageForIPv4Tests = []icmp.Message{ |
| { |
| Type: ipv4.ICMPTypeDestinationUnreachable, Code: 15, |
| Body: &icmp.DstUnreach{ |
| Data: []byte("ERROR-INVOKING-PACKET"), |
| }, |
| }, |
| { |
| Type: ipv4.ICMPTypeTimeExceeded, Code: 1, |
| Body: &icmp.TimeExceeded{ |
| Data: []byte("ERROR-INVOKING-PACKET"), |
| }, |
| }, |
| { |
| Type: ipv4.ICMPTypeParameterProblem, Code: 2, |
| Body: &icmp.ParamProb{ |
| Pointer: 8, |
| Data: []byte("ERROR-INVOKING-PACKET"), |
| }, |
| }, |
| { |
| Type: ipv4.ICMPTypeEcho, Code: 0, |
| Body: &icmp.Echo{ |
| ID: 1, Seq: 2, |
| Data: []byte("HELLO-R-U-THERE"), |
| }, |
| }, |
| { |
| Type: ipv4.ICMPTypePhoturis, |
| Body: &icmp.DefaultMessageBody{ |
| Data: []byte{0x80, 0x40, 0x20, 0x10}, |
| }, |
| }, |
| } |
| |
| func TestMarshalAndParseMessageForIPv4(t *testing.T) { |
| for i, tt := range marshalAndParseMessageForIPv4Tests { |
| b, err := tt.Marshal(nil) |
| if err != nil { |
| t.Fatal(err) |
| } |
| m, err := icmp.ParseMessage(iana.ProtocolICMP, b) |
| if err != nil { |
| t.Fatal(err) |
| } |
| if m.Type != tt.Type || m.Code != tt.Code { |
| t.Errorf("#%v: got %v; want %v", i, m, &tt) |
| } |
| if !reflect.DeepEqual(m.Body, tt.Body) { |
| t.Errorf("#%v: got %v; want %v", i, m.Body, tt.Body) |
| } |
| } |
| } |
| |
| var marshalAndParseMessageForIPv6Tests = []icmp.Message{ |
| { |
| Type: ipv6.ICMPTypeDestinationUnreachable, Code: 6, |
| Body: &icmp.DstUnreach{ |
| Data: []byte("ERROR-INVOKING-PACKET"), |
| }, |
| }, |
| { |
| Type: ipv6.ICMPTypePacketTooBig, Code: 0, |
| Body: &icmp.PacketTooBig{ |
| MTU: 1<<16 - 1, |
| Data: []byte("ERROR-INVOKING-PACKET"), |
| }, |
| }, |
| { |
| Type: ipv6.ICMPTypeTimeExceeded, Code: 1, |
| Body: &icmp.TimeExceeded{ |
| Data: []byte("ERROR-INVOKING-PACKET"), |
| }, |
| }, |
| { |
| Type: ipv6.ICMPTypeParameterProblem, Code: 2, |
| Body: &icmp.ParamProb{ |
| Pointer: 8, |
| Data: []byte("ERROR-INVOKING-PACKET"), |
| }, |
| }, |
| { |
| Type: ipv6.ICMPTypeEchoRequest, Code: 0, |
| Body: &icmp.Echo{ |
| ID: 1, Seq: 2, |
| Data: []byte("HELLO-R-U-THERE"), |
| }, |
| }, |
| { |
| Type: ipv6.ICMPTypeDuplicateAddressConfirmation, |
| Body: &icmp.DefaultMessageBody{ |
| Data: []byte{0x80, 0x40, 0x20, 0x10}, |
| }, |
| }, |
| } |
| |
| func TestMarshalAndParseMessageForIPv6(t *testing.T) { |
| pshicmp := icmp.IPv6PseudoHeader(net.ParseIP("fe80::1"), net.ParseIP("ff02::1")) |
| for i, tt := range marshalAndParseMessageForIPv6Tests { |
| for _, psh := range [][]byte{pshicmp, nil} { |
| b, err := tt.Marshal(psh) |
| if err != nil { |
| t.Fatal(err) |
| } |
| m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, b) |
| if err != nil { |
| t.Fatal(err) |
| } |
| if m.Type != tt.Type || m.Code != tt.Code { |
| t.Errorf("#%v: got %v; want %v", i, m, &tt) |
| } |
| if !reflect.DeepEqual(m.Body, tt.Body) { |
| t.Errorf("#%v: got %v; want %v", i, m.Body, tt.Body) |
| } |
| } |
| } |
| } |