2021-02-09 11:53:33 +00:00
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
2021-01-26 17:33:29 +00:00
|
|
|
package nodejs_test
|
|
|
|
|
|
|
|
import (
|
2021-01-27 12:44:17 +00:00
|
|
|
"bytes"
|
2021-01-26 17:33:29 +00:00
|
|
|
"context"
|
2021-01-27 14:42:20 +00:00
|
|
|
"encoding/base64"
|
2021-01-27 12:44:17 +00:00
|
|
|
"io/ioutil"
|
2021-01-26 17:33:29 +00:00
|
|
|
"net"
|
|
|
|
"os"
|
2021-01-27 12:44:17 +00:00
|
|
|
"path/filepath"
|
2021-01-26 17:33:29 +00:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2021-03-19 10:51:06 +00:00
|
|
|
"github.com/ssb-ngi-pointer/go-ssb-room/roomdb"
|
2021-03-10 15:44:46 +00:00
|
|
|
"github.com/ssb-ngi-pointer/go-ssb-room/roomdb/mockdb"
|
2021-02-15 11:08:33 +00:00
|
|
|
|
2021-01-26 17:33:29 +00:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"go.cryptoscope.co/muxrpc/v2"
|
|
|
|
"go.cryptoscope.co/netwrap"
|
|
|
|
"go.cryptoscope.co/secretstream"
|
|
|
|
)
|
|
|
|
|
2021-03-16 08:41:15 +00:00
|
|
|
// legacy js end-to-end test as a sanity check
|
|
|
|
// it runs the ssb-room server against two ssb-room clients
|
|
|
|
func TestLegacyJSEndToEnd(t *testing.T) {
|
2021-01-27 14:42:20 +00:00
|
|
|
// defer leakcheck.Check(t)
|
|
|
|
r := require.New(t)
|
|
|
|
|
|
|
|
ts := newRandomSession(t)
|
|
|
|
// ts := newSession(t, nil)
|
|
|
|
|
|
|
|
// alice is the server now
|
2021-03-16 08:41:15 +00:00
|
|
|
alice, port := ts.startJSBotAsServer("alice", "./testscripts/legacy_server.js")
|
2021-01-27 14:42:20 +00:00
|
|
|
|
|
|
|
aliceAddr := &net.TCPAddr{
|
|
|
|
IP: net.ParseIP("127.0.0.1"),
|
|
|
|
Port: port,
|
|
|
|
}
|
|
|
|
|
2021-03-16 08:41:15 +00:00
|
|
|
bob := ts.startJSClient("bob", "./testscripts/legacy_client.js",
|
2021-01-27 14:42:20 +00:00
|
|
|
aliceAddr,
|
|
|
|
*alice,
|
|
|
|
)
|
|
|
|
|
|
|
|
// claire wants to connect to bob through alice
|
|
|
|
|
|
|
|
// nasty multiserver-addr hack
|
|
|
|
var roomHandle bytes.Buffer
|
|
|
|
roomHandle.WriteString("tunnel:")
|
|
|
|
roomHandle.WriteString(alice.Ref())
|
|
|
|
roomHandle.WriteString(":")
|
|
|
|
roomHandle.WriteString(bob.Ref())
|
|
|
|
roomHandle.WriteString("~shs:")
|
|
|
|
roomHandle.WriteString(base64.StdEncoding.EncodeToString(bob.ID))
|
|
|
|
|
|
|
|
// write the handle to the testrun folder of the bot
|
|
|
|
handleFile := filepath.Join("testrun", t.Name(), "claire", "endpoint_through_room.txt")
|
|
|
|
os.MkdirAll(filepath.Dir(handleFile), 0700)
|
|
|
|
err := ioutil.WriteFile(handleFile, roomHandle.Bytes(), 0700)
|
|
|
|
r.NoError(err)
|
|
|
|
|
|
|
|
time.Sleep(1000 * time.Millisecond)
|
|
|
|
|
2021-03-16 08:41:15 +00:00
|
|
|
claire := ts.startJSClient("claire", "./testscripts/legacy_client_opening_tunnel.js",
|
2021-01-27 14:42:20 +00:00
|
|
|
aliceAddr,
|
|
|
|
*alice,
|
|
|
|
)
|
|
|
|
t.Log("this is claire:", claire.Ref())
|
|
|
|
|
|
|
|
time.Sleep(20 * time.Second)
|
|
|
|
|
|
|
|
ts.wait()
|
|
|
|
}
|
|
|
|
|
2021-03-16 08:41:15 +00:00
|
|
|
// Two ssb-room clients against a Go server
|
|
|
|
func TestLegacyJSClient(t *testing.T) {
|
2021-01-26 17:33:29 +00:00
|
|
|
// defer leakcheck.Check(t)
|
2021-01-27 12:44:17 +00:00
|
|
|
r := require.New(t)
|
2021-01-26 17:33:29 +00:00
|
|
|
|
2021-01-27 09:27:13 +00:00
|
|
|
ts := newRandomSession(t)
|
|
|
|
// ts := newSession(t, nil)
|
2021-01-26 17:33:29 +00:00
|
|
|
|
2021-03-19 10:51:06 +00:00
|
|
|
var membersDB = &mockdb.FakeMembersService{}
|
|
|
|
var aliases = &mockdb.FakeAliasesService{}
|
|
|
|
srv := ts.startGoServer(membersDB, aliases)
|
|
|
|
membersDB.GetByFeedReturns(roomdb.Member{Nickname: "free4all"}, nil)
|
2021-01-26 17:33:29 +00:00
|
|
|
|
2021-03-16 08:41:15 +00:00
|
|
|
alice := ts.startJSClient("alice", "./testscripts/legacy_client.js",
|
2021-01-27 09:27:13 +00:00
|
|
|
srv.Network.GetListenAddr(),
|
|
|
|
srv.Whoami(),
|
|
|
|
)
|
2021-01-26 17:33:29 +00:00
|
|
|
|
2021-01-27 12:44:17 +00:00
|
|
|
var roomHandle bytes.Buffer
|
|
|
|
roomHandle.WriteString("tunnel:")
|
|
|
|
roomHandle.WriteString(srv.Whoami().Ref())
|
|
|
|
roomHandle.WriteString(":")
|
|
|
|
roomHandle.WriteString(alice.Ref())
|
2021-01-27 14:42:20 +00:00
|
|
|
roomHandle.WriteString("~shs:")
|
|
|
|
roomHandle.WriteString(base64.StdEncoding.EncodeToString(alice.ID))
|
2021-01-27 12:44:17 +00:00
|
|
|
|
|
|
|
// write the handle to the testrun folder of the bot
|
|
|
|
handleFile := filepath.Join("testrun", t.Name(), "bob", "endpoint_through_room.txt")
|
|
|
|
os.MkdirAll(filepath.Dir(handleFile), 0700)
|
|
|
|
err := ioutil.WriteFile(handleFile, roomHandle.Bytes(), 0700)
|
|
|
|
r.NoError(err)
|
|
|
|
|
2021-01-27 10:05:06 +00:00
|
|
|
time.Sleep(1500 * time.Millisecond)
|
2021-03-16 08:41:15 +00:00
|
|
|
ts.startJSClient("bob", "./testscripts/legacy_client_opening_tunnel.js",
|
2021-01-27 10:05:06 +00:00
|
|
|
srv.Network.GetListenAddr(),
|
|
|
|
srv.Whoami(),
|
|
|
|
)
|
|
|
|
|
2021-01-27 09:27:13 +00:00
|
|
|
time.Sleep(5 * time.Second)
|
|
|
|
|
|
|
|
ts.wait()
|
2021-01-26 17:33:29 +00:00
|
|
|
}
|
|
|
|
|
2021-03-16 08:41:15 +00:00
|
|
|
// A Go "client" with a JS ssb-room server and client
|
|
|
|
func TestLegacyJSServer(t *testing.T) {
|
2021-01-26 17:33:29 +00:00
|
|
|
// 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
|
2021-03-16 08:41:15 +00:00
|
|
|
alice, port := ts.startJSBotAsServer("alice", "./testscripts/legacy_server.js")
|
2021-01-26 17:33:29 +00:00
|
|
|
|
2021-01-27 10:05:06 +00:00
|
|
|
aliceAddr := &net.TCPAddr{
|
|
|
|
IP: net.ParseIP("127.0.0.1"),
|
|
|
|
Port: port,
|
|
|
|
}
|
|
|
|
|
2021-01-27 12:44:17 +00:00
|
|
|
// now connect our go client
|
2021-03-19 10:51:06 +00:00
|
|
|
var membersDB = &mockdb.FakeMembersService{}
|
|
|
|
var aliasesDB = &mockdb.FakeAliasesService{}
|
|
|
|
client := ts.startGoServer(membersDB, aliasesDB)
|
|
|
|
membersDB.GetByFeedReturns(roomdb.Member{Nickname: "free4all"}, nil)
|
2021-01-27 12:44:17 +00:00
|
|
|
|
2021-03-16 08:41:15 +00:00
|
|
|
// create the room handle for the js client
|
2021-01-27 12:44:17 +00:00
|
|
|
var roomHandle bytes.Buffer
|
|
|
|
roomHandle.WriteString("tunnel:")
|
|
|
|
roomHandle.WriteString(alice.Ref())
|
|
|
|
roomHandle.WriteString(":")
|
|
|
|
roomHandle.WriteString(client.Whoami().Ref())
|
2021-01-27 14:42:20 +00:00
|
|
|
roomHandle.WriteString("~shs:")
|
|
|
|
roomHandle.WriteString(base64.StdEncoding.EncodeToString(client.Whoami().ID))
|
2021-01-27 12:44:17 +00:00
|
|
|
|
|
|
|
// write the handle to the testrun folder of the bot
|
|
|
|
handleFile := filepath.Join("testrun", t.Name(), "bob", "endpoint_through_room.txt")
|
|
|
|
os.MkdirAll(filepath.Dir(handleFile), 0700)
|
|
|
|
err := ioutil.WriteFile(handleFile, roomHandle.Bytes(), 0700)
|
|
|
|
r.NoError(err)
|
|
|
|
|
2021-03-16 08:41:15 +00:00
|
|
|
// a 2nd js instance but as a client
|
|
|
|
bob := ts.startJSClient("bob", "./testscripts/legacy_client_opening_tunnel.js",
|
2021-01-27 10:05:06 +00:00
|
|
|
aliceAddr,
|
|
|
|
*alice,
|
|
|
|
)
|
|
|
|
t.Log("started bob:", bob.Ref())
|
|
|
|
|
2021-03-16 08:41:15 +00:00
|
|
|
// connect to the server 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 12:44:17 +00:00
|
|
|
err = client.Network.Connect(ctx, aliceShsAddr)
|
2021-01-26 17:33:29 +00:00
|
|
|
defer connCancel()
|
|
|
|
r.NoError(err, "connect #1 failed")
|
|
|
|
|
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
|
|
|
}
|
2021-03-16 08:54:59 +00:00
|
|
|
|
|
|
|
// the new ssb-room-client module (2x) against a Go room server
|
|
|
|
func TestModernJSClient(t *testing.T) {
|
|
|
|
// defer leakcheck.Check(t)
|
|
|
|
r := require.New(t)
|
|
|
|
|
|
|
|
ts := newRandomSession(t)
|
|
|
|
// ts := newSession(t, nil)
|
|
|
|
|
|
|
|
var allowDB = &mockdb.FakeAllowListService{}
|
|
|
|
var aliasDB = &mockdb.FakeAliasService{}
|
|
|
|
srv := ts.startGoServer(allowDB, aliasDB)
|
|
|
|
|
|
|
|
alice := ts.startJSClient("alice", "./testscripts/modern_client.js",
|
|
|
|
srv.Network.GetListenAddr(),
|
|
|
|
srv.Whoami(),
|
|
|
|
)
|
|
|
|
srv.Allow(alice, true)
|
|
|
|
|
|
|
|
var roomHandle bytes.Buffer
|
|
|
|
roomHandle.WriteString("tunnel:")
|
|
|
|
roomHandle.WriteString(srv.Whoami().Ref())
|
|
|
|
roomHandle.WriteString(":")
|
|
|
|
roomHandle.WriteString(alice.Ref())
|
|
|
|
roomHandle.WriteString("~shs:")
|
|
|
|
roomHandle.WriteString(base64.StdEncoding.EncodeToString(alice.ID))
|
|
|
|
|
|
|
|
// write the handle to the testrun folder of the bot
|
|
|
|
handleFile := filepath.Join("testrun", t.Name(), "bob", "endpoint_through_room.txt")
|
|
|
|
os.MkdirAll(filepath.Dir(handleFile), 0700)
|
|
|
|
err := ioutil.WriteFile(handleFile, roomHandle.Bytes(), 0700)
|
|
|
|
r.NoError(err)
|
|
|
|
|
|
|
|
time.Sleep(1500 * time.Millisecond)
|
|
|
|
bob := ts.startJSClient("bob", "./testscripts/modern_client_opening_tunnel.js",
|
|
|
|
srv.Network.GetListenAddr(),
|
|
|
|
srv.Whoami(),
|
|
|
|
)
|
|
|
|
|
|
|
|
srv.Allow(bob, true)
|
|
|
|
allowDB.HasFeedReturns(true)
|
|
|
|
|
|
|
|
time.Sleep(5 * time.Second)
|
|
|
|
|
|
|
|
ts.wait()
|
|
|
|
}
|