diff --git a/pkg/engine/dispatcher/dispatcher_test.go b/pkg/engine/dispatcher/dispatcher_test.go index d9e4e3ab..d0341169 100644 --- a/pkg/engine/dispatcher/dispatcher_test.go +++ b/pkg/engine/dispatcher/dispatcher_test.go @@ -143,106 +143,105 @@ func TestDispatcher(t *testing.T) { cancel() } -// Disabled due to weird packet mangles on CI -//func TestDispatcher_Rekey(t *testing.T) { -// log2.SetLogLevel(log2.Debug) -// var e error -// var l1, l2 *transport.Listener -// _ = l2 -// var k1, k2 *crypto.Keys -// ctx, cancel := context.WithCancel(context.Background()) -// _ = cancel -// if k1, k2, e = crypto.Generate2Keys(); fails(e) { -// t.FailNow() -// } -// dataPath, err := os.MkdirTemp(os.TempDir(), "badger") -// if err != nil { -// t.FailNow() -// } -// l1, e = transport.NewListener("", transport.LocalhostZeroIPv4TCP, -// dataPath, k1, ctx, transport.DefaultMTU) -// if fails(e) { -// t.FailNow() -// } -// dataPath, err = os.MkdirTemp(os.TempDir(), "badger") -// if err != nil { -// t.FailNow() -// } -// l2, e = transport.NewListener(transport.GetHostAddress(l1.Host), -// transport.LocalhostZeroIPv4TCP, dataPath, k2, ctx, transport.DefaultMTU) -// if fails(e) { -// t.FailNow() -// } -// var msg1, msg2 []byte -// _ = msg2 -// msg1, _, e = tests.GenMessage(4096, "REQUEST") -// msg2, _, e = tests.GenMessage(1024, "RESPONSE") -// _, _ = msg1, msg2 -// hn1 := transport.GetHostAddress(l2.Host) -// // hn2 := transport.GetHostAddress(l1.Host) -// var ks *crypto.KeySet -// _, ks, e = crypto.NewSigner() -// d1 := NewDispatcher(l1.Dial(hn1), ctx, ks) -// d2 := NewDispatcher(<-l2.Accept(), ctx, ks) -// _, _ = d1, d2 -// var msgp1, msgp2 slice.Bytes -// id1, id2 := nonce.NewID(), nonce.NewID() -// on1 := onions.Skins{}. -// Response(id1, msg1, 0). -// Assemble() -// on2 := onions.Skins{}. -// Response(id2, msg2, 0). -// Assemble() -// s1 := onions.Encode(on1) -// s2 := onions.Encode(on2) -// x1 := s1.GetAll() -// x2 := s2.GetAll() -// xx1 := &Onion{x1} -// xx2 := &Onion{x2} -// sp1 := splice.New(xx1.Len()) -// sp2 := splice.New(xx2.Len()) -// if e = xx1.Encode(sp1); fails(e) { -// t.FailNow() -// } -// if e = xx2.Encode(sp2); fails(e) { -// t.FailNow() -// } -// countTo, succ := 1000, 0 -// go func() { -// for { -// select { -// case <-ctx.Done(): -// return -// case b := <-d1.Duplex.Receive(): -// bb, xb2 := b.ToBytes(), x2.ToBytes() -// if string(bb) != string(xb2) { -// t.Error("did not receive expected message") -// return -// } else { -// succ++ -// continue -// } -// case b := <-d2.Duplex.Receive(): -// bb, xb1 := b.ToBytes(), x1.ToBytes() -// if string(bb) != string(xb1) { -// t.Error("did not receive expected message") -// return -// } else { -// succ++ -// continue -// } -// } -// } -// }() -// msgp1 = sp1.GetAll() -// msgp2 = sp2.GetAll() -// for i := 0; i < countTo; i++ { -// d1.SendToConn(msgp1) -// d2.SendToConn(msgp2) -// } -// time.Sleep(time.Second*5) -// cancel() -// if succ != countTo*3 { -// t.Fatal("did not receive all messages correctly", succ, countTo*3) -// } -//} +func TestDispatcher_Rekey(t *testing.T) { + log2.SetLogLevel(log2.Debug) + var e error + var l1, l2 *transport.Listener + _ = l2 + var k1, k2 *crypto.Keys + ctx, cancel := context.WithCancel(context.Background()) + _ = cancel + if k1, k2, e = crypto.Generate2Keys(); fails(e) { + t.FailNow() + } + dataPath, err := os.MkdirTemp(os.TempDir(), "badger") + if err != nil { + t.FailNow() + } + l1, e = transport.NewListener("", transport.LocalhostZeroIPv4TCP, + dataPath, k1, ctx, transport.DefaultMTU) + if fails(e) { + t.FailNow() + } + dataPath, err = os.MkdirTemp(os.TempDir(), "badger") + if err != nil { + t.FailNow() + } + l2, e = transport.NewListener(transport.GetHostAddress(l1.Host), + transport.LocalhostZeroIPv4TCP, dataPath, k2, ctx, transport.DefaultMTU) + if fails(e) { + t.FailNow() + } + var msg1, msg2 []byte + _ = msg2 + msg1, _, e = tests.GenMessage(4096, "REQUEST") + msg2, _, e = tests.GenMessage(1024, "RESPONSE") + _, _ = msg1, msg2 + hn1 := transport.GetHostAddress(l2.Host) + // hn2 := transport.GetHostAddress(l1.Host) + var ks *crypto.KeySet + _, ks, e = crypto.NewSigner() + d1 := NewDispatcher(l1.Dial(hn1), ctx, ks) + d2 := NewDispatcher(<-l2.Accept(), ctx, ks) + _, _ = d1, d2 + var msgp1, msgp2 slice.Bytes + id1, id2 := nonce.NewID(), nonce.NewID() + on1 := onions.Skins{}. + Response(id1, msg1, 0). + Assemble() + on2 := onions.Skins{}. + Response(id2, msg2, 0). + Assemble() + s1 := onions.Encode(on1) + s2 := onions.Encode(on2) + x1 := s1.GetAll() + x2 := s2.GetAll() + xx1 := &Onion{x1} + xx2 := &Onion{x2} + sp1 := splice.New(xx1.Len()) + sp2 := splice.New(xx2.Len()) + if e = xx1.Encode(sp1); fails(e) { + t.FailNow() + } + if e = xx2.Encode(sp2); fails(e) { + t.FailNow() + } + countTo, succ := 1000, 0 + go func() { + for { + select { + case <-ctx.Done(): + return + case b := <-d1.Duplex.Receive(): + bb, xb2 := b.ToBytes(), x2.ToBytes() + if string(bb) != string(xb2) { + t.Error("did not receive expected message") + return + } else { + succ++ + continue + } + case b := <-d2.Duplex.Receive(): + bb, xb1 := b.ToBytes(), x1.ToBytes() + if string(bb) != string(xb1) { + t.Error("did not receive expected message") + return + } else { + succ++ + continue + } + } + } + }() + msgp1 = sp1.GetAll() + msgp2 = sp2.GetAll() + for i := 0; i < countTo; i++ { + d1.SendToConn(msgp1) + d2.SendToConn(msgp2) + } + time.Sleep(time.Second) + cancel() + if succ != countTo*3 { + t.Fatal("did not receive all messages correctly", succ, countTo*3) + } +}