2021-01-26 17:33:29 +00:00
|
|
|
package nodejs_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"net"
|
|
|
|
"os"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"go.cryptoscope.co/muxrpc/v2"
|
|
|
|
"go.cryptoscope.co/netwrap"
|
|
|
|
"go.cryptoscope.co/secretstream"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestJSClient(t *testing.T) {
|
|
|
|
// defer leakcheck.Check(t)
|
|
|
|
// r := require.New(t)
|
|
|
|
|
2021-01-27 09:27:13 +00:00
|
|
|
ts := newRandomSession(t)
|
|
|
|
// ts := newSession(t, nil)
|
2021-01-26 17:33:29 +00:00
|
|
|
|
2021-01-27 09:27:13 +00:00
|
|
|
srv := ts.startGoServer()
|
2021-01-26 17:33:29 +00:00
|
|
|
|
2021-01-27 09:27:13 +00:00
|
|
|
alice := ts.startJSBot("./testscripts/simple_client.js",
|
|
|
|
srv.Network.GetListenAddr(),
|
|
|
|
srv.Whoami(),
|
|
|
|
)
|
|
|
|
srv.Allow(alice, true)
|
2021-01-26 17:33:29 +00:00
|
|
|
|
2021-01-27 10:05:06 +00:00
|
|
|
time.Sleep(1500 * time.Millisecond)
|
|
|
|
bob := ts.startJSBot("./testscripts/simple_client.js",
|
|
|
|
srv.Network.GetListenAddr(),
|
|
|
|
srv.Whoami(),
|
|
|
|
)
|
|
|
|
|
|
|
|
srv.Allow(bob, true)
|
|
|
|
|
2021-01-27 09:27:13 +00:00
|
|
|
time.Sleep(5 * time.Second)
|
|
|
|
|
|
|
|
ts.wait()
|
2021-01-26 17:33:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestJSServer(t *testing.T) {
|
|
|
|
// defer leakcheck.Check(t)
|
|
|
|
r := require.New(t)
|
|
|
|
a := assert.New(t)
|
|
|
|
|
|
|
|
os.RemoveAll("testrun")
|
|
|
|
|
2021-01-27 09:27:13 +00:00
|
|
|
ts := newRandomSession(t)
|
|
|
|
// ts := newSession(t, nil)
|
2021-01-26 17:33:29 +00:00
|
|
|
|
|
|
|
// alice is the server now
|
|
|
|
alice, port := ts.startJSBotAsServer("alice", "./testscripts/server.js")
|
|
|
|
|
2021-01-27 10:05:06 +00:00
|
|
|
// a 2nd js instance but as a client
|
|
|
|
aliceAddr := &net.TCPAddr{
|
|
|
|
IP: net.ParseIP("127.0.0.1"),
|
|
|
|
Port: port,
|
|
|
|
}
|
|
|
|
|
|
|
|
bob := ts.startJSBot("./testscripts/simple_client.js",
|
|
|
|
aliceAddr,
|
|
|
|
*alice,
|
|
|
|
)
|
|
|
|
t.Log("started bob:", bob.Ref())
|
|
|
|
|
|
|
|
// now connect our go client
|
|
|
|
client := ts.startGoServer()
|
2021-01-26 17:33:29 +00:00
|
|
|
client.Allow(*alice, true)
|
|
|
|
|
2021-01-27 09:27:13 +00:00
|
|
|
// connect to alice
|
2021-01-27 10:05:06 +00:00
|
|
|
aliceShsAddr := netwrap.WrapAddr(aliceAddr, secretstream.Addr{PubKey: alice.ID})
|
2021-01-26 17:33:29 +00:00
|
|
|
|
|
|
|
ctx, connCancel := context.WithCancel(context.TODO())
|
2021-01-27 10:05:06 +00:00
|
|
|
err := client.Network.Connect(ctx, aliceShsAddr)
|
2021-01-26 17:33:29 +00:00
|
|
|
defer connCancel()
|
|
|
|
r.NoError(err, "connect #1 failed")
|
|
|
|
|
|
|
|
// this might fail if the previous node process is still running...
|
|
|
|
// TODO: properly write cleanup
|
|
|
|
|
2021-01-27 10:05:06 +00:00
|
|
|
time.Sleep(2 * time.Second)
|
2021-01-26 17:33:29 +00:00
|
|
|
|
|
|
|
srvEdp, has := client.Network.GetEndpointFor(*alice)
|
|
|
|
r.True(has, "botA has no endpoint for the server")
|
|
|
|
t.Log("connected")
|
|
|
|
|
|
|
|
// let B listen for changes
|
|
|
|
newRoomMember, err := srvEdp.Source(ctx, muxrpc.TypeJSON, muxrpc.Method{"tunnel", "endpoints"})
|
|
|
|
r.NoError(err)
|
|
|
|
|
|
|
|
newMemberChan := make(chan string)
|
|
|
|
|
|
|
|
// read all the messages from endpoints and throw them over the channel
|
|
|
|
go func() {
|
|
|
|
for newRoomMember.Next(ctx) {
|
|
|
|
body, err := newRoomMember.Bytes()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
newMemberChan <- string(body)
|
|
|
|
}
|
|
|
|
close(newMemberChan)
|
|
|
|
}()
|
|
|
|
|
|
|
|
// announce A
|
|
|
|
var ret bool
|
|
|
|
err = srvEdp.Async(ctx, &ret, muxrpc.TypeJSON, muxrpc.Method{"tunnel", "announce"})
|
|
|
|
r.NoError(err)
|
|
|
|
a.False(ret, "would assume these are true but..?")
|
|
|
|
|
|
|
|
select {
|
2021-01-26 18:03:31 +00:00
|
|
|
case <-time.After(3 * time.Second):
|
2021-01-26 17:33:29 +00:00
|
|
|
t.Error("timeout")
|
|
|
|
case got := <-newMemberChan:
|
|
|
|
t.Log("received join?")
|
|
|
|
t.Log(got)
|
|
|
|
}
|
2021-01-27 10:05:06 +00:00
|
|
|
time.Sleep(5 * time.Second)
|
2021-01-26 17:33:29 +00:00
|
|
|
|
|
|
|
err = srvEdp.Async(ctx, &ret, muxrpc.TypeJSON, muxrpc.Method{"tunnel", "leave"})
|
|
|
|
r.NoError(err)
|
|
|
|
a.False(ret, "would assume these are true but..?")
|
|
|
|
|
|
|
|
select {
|
2021-01-26 18:03:31 +00:00
|
|
|
case <-time.After(3 * time.Second):
|
2021-01-26 17:33:29 +00:00
|
|
|
t.Error("timeout")
|
|
|
|
case got := <-newMemberChan:
|
|
|
|
t.Log("received leave?")
|
|
|
|
t.Log(got)
|
|
|
|
}
|
|
|
|
|
2021-01-26 18:03:31 +00:00
|
|
|
srvEdp.Terminate()
|
2021-01-26 17:33:29 +00:00
|
|
|
|
2021-01-26 18:03:31 +00:00
|
|
|
ts.wait()
|
2021-01-26 17:33:29 +00:00
|
|
|
}
|