+
+func testMarshalUnmarshalMsg(t *testing.T, m Msg, expected string) {
+ b, err := bencode.Marshal(m)
+ require.NoError(t, err)
+ assert.Equal(t, expected, string(b))
+ var _m Msg
+ err = bencode.Unmarshal([]byte(expected), &_m)
+ assert.NoError(t, err)
+ assert.EqualValues(t, m, _m)
+ assert.EqualValues(t, m.R, _m.R)
+}
+
+func TestMarshalUnmarshalMsg(t *testing.T) {
+ testMarshalUnmarshalMsg(t, Msg{}, "d1:t0:1:y0:e")
+ testMarshalUnmarshalMsg(t, Msg{
+ Y: "q",
+ Q: "ping",
+ T: "hi",
+ }, "d1:q4:ping1:t2:hi1:y1:qe")
+ testMarshalUnmarshalMsg(t, Msg{
+ Y: "e",
+ T: "42",
+ E: &KRPCError{Code: 200, Msg: "fuck"},
+ }, "d1:eli200e4:fucke1:t2:421:y1:ee")
+ testMarshalUnmarshalMsg(t, Msg{
+ Y: "r",
+ T: "\x8c%",
+ R: &Return{},
+ }, "d1:rd2:id0:5:token0:e1:t2:\x8c%1:y1:re")
+ testMarshalUnmarshalMsg(t, Msg{
+ Y: "r",
+ T: "\x8c%",
+ R: &Return{
+ Nodes: CompactIPv4NodeInfo{
+ NodeInfo{
+ Addr: newDHTAddr(&net.UDPAddr{
+ IP: net.IPv4(1, 2, 3, 4),
+ Port: 0x1234,
+ }),
+ },
+ },
+ },
+ }, "d1:rd2:id0:5:nodes26:\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x1245:token0:e1:t2:\x8c%1:y1:re")
+ testMarshalUnmarshalMsg(t, Msg{
+ Y: "r",
+ T: "\x8c%",
+ R: &Return{
+ Values: []util.CompactPeer{
+ util.CompactPeer{
+ IP: net.IPv4(1, 2, 3, 4).To4(),
+ Port: 0x5678,
+ },
+ },
+ },
+ }, "d1:rd2:id0:5:token0:6:valuesl6:\x01\x02\x03\x04\x56\x78ee1:t2:\x8c%1:y1:re")
+}
+
+func TestAnnounceTimeout(t *testing.T) {
+ s, err := NewServer(&ServerConfig{
+ BootstrapNodes: []string{"1.2.3.4:5"},
+ })
+ require.NoError(t, err)
+ a, err := s.Announce("12341234123412341234", 0, true)
+ <-a.Peers
+ a.Close()
+ s.Close()
+}
+
+func TestEqualPointers(t *testing.T) {
+ assert.EqualValues(t, &Msg{R: &Return{}}, &Msg{R: &Return{}})
+}