|
|
|
@ -68,43 +68,45 @@ func TestIPN(t *testing.T) {
|
|
|
|
|
defer n2.Backend.Shutdown()
|
|
|
|
|
n2.Backend.StartLoginInteractive()
|
|
|
|
|
|
|
|
|
|
var s1, s2 State
|
|
|
|
|
for {
|
|
|
|
|
t.Logf("\n\nn1.state=%v n2.state=%v\n\n", s1, s2)
|
|
|
|
|
|
|
|
|
|
// TODO(crawshaw): switch from || to &&. To do this we need to
|
|
|
|
|
// transmit some data so that the handshake completes on both
|
|
|
|
|
// sides. (Because handshakes are 1RTT, it is the data
|
|
|
|
|
// transmission that completes the handshake.)
|
|
|
|
|
if s1 == Running || s2 == Running {
|
|
|
|
|
// TODO(apenwarr): ensure state sequence.
|
|
|
|
|
// Right now we'll just exit as soon as
|
|
|
|
|
// state==Running, even if the backend is lying or
|
|
|
|
|
// something. Not a great test.
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
t.Run("login", func(t *testing.T) {
|
|
|
|
|
var s1, s2 State
|
|
|
|
|
for {
|
|
|
|
|
t.Logf("\n\nn1.state=%v n2.state=%v\n\n", s1, s2)
|
|
|
|
|
|
|
|
|
|
// TODO(crawshaw): switch from || to &&. To do this we need to
|
|
|
|
|
// transmit some data so that the handshake completes on both
|
|
|
|
|
// sides. (Because handshakes are 1RTT, it is the data
|
|
|
|
|
// transmission that completes the handshake.)
|
|
|
|
|
if s1 == Running || s2 == Running {
|
|
|
|
|
// TODO(apenwarr): ensure state sequence.
|
|
|
|
|
// Right now we'll just exit as soon as
|
|
|
|
|
// state==Running, even if the backend is lying or
|
|
|
|
|
// something. Not a great test.
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
select {
|
|
|
|
|
case n := <-n1.NotifyCh:
|
|
|
|
|
t.Logf("n1n: %v\n", n)
|
|
|
|
|
if n.State != nil {
|
|
|
|
|
s1 = *n.State
|
|
|
|
|
if s1 == NeedsMachineAuth {
|
|
|
|
|
authNode(t, ctl, n1.Backend)
|
|
|
|
|
select {
|
|
|
|
|
case n := <-n1.NotifyCh:
|
|
|
|
|
t.Logf("n1n: %v\n", n)
|
|
|
|
|
if n.State != nil {
|
|
|
|
|
s1 = *n.State
|
|
|
|
|
if s1 == NeedsMachineAuth {
|
|
|
|
|
authNode(t, ctl, n1.Backend)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
case n := <-n2.NotifyCh:
|
|
|
|
|
t.Logf("n2n: %v\n", n)
|
|
|
|
|
if n.State != nil {
|
|
|
|
|
s2 = *n.State
|
|
|
|
|
if s2 == NeedsMachineAuth {
|
|
|
|
|
authNode(t, ctl, n2.Backend)
|
|
|
|
|
case n := <-n2.NotifyCh:
|
|
|
|
|
t.Logf("n2n: %v\n", n)
|
|
|
|
|
if n.State != nil {
|
|
|
|
|
s2 = *n.State
|
|
|
|
|
if s2 == NeedsMachineAuth {
|
|
|
|
|
authNode(t, ctl, n2.Backend)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
case <-time.After(3 * time.Second):
|
|
|
|
|
t.Fatalf("\n\n\nFATAL: timed out waiting for notifications.\n\n\n")
|
|
|
|
|
}
|
|
|
|
|
case <-time.After(3 * time.Second):
|
|
|
|
|
t.Fatalf("\n\n\nFATAL: timed out waiting for notifications.\n\n\n")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
n1addr := n1.Backend.NetMap().Addresses[0].IP
|
|
|
|
|
n2addr := n2.Backend.NetMap().Addresses[0].IP
|
|
|
|
|