cwtch/testing/cwtch_peer_server_intergrat...

230 lines
6.2 KiB
Go
Raw Normal View History

2018-03-31 19:33:32 +00:00
package testing
2018-03-30 21:16:51 +00:00
import (
2018-05-28 18:05:06 +00:00
"cwtch.im/cwtch/model"
"cwtch.im/cwtch/peer"
cwtchserver "cwtch.im/cwtch/server"
2018-05-20 19:58:16 +00:00
"fmt"
"github.com/s-rah/go-ricochet"
"github.com/s-rah/go-ricochet/utils"
"io/ioutil"
2018-05-20 19:58:16 +00:00
"log"
"os"
2018-05-20 19:58:16 +00:00
"testing"
"time"
2018-03-30 21:16:51 +00:00
)
const (
keyfile = "./private_key"
)
var (
2018-05-20 19:58:16 +00:00
aliceLines = []string{"Hello", "My name is Alice", "bye"}
bobLines = []string{"Hi", "My name is Bob.", "toodles", "hello?"}
)
2018-05-20 19:58:16 +00:00
func checkAndGenPrivateKey(privateKeyFile string) (generated bool) {
if _, err := os.Stat(privateKeyFile); os.IsNotExist(err) {
fmt.Println("generating new private key...")
2018-05-28 18:05:06 +00:00
pk, err := utils.GeneratePrivateKey()
if err != nil {
log.Fatalf("error generating new private key: %v\n", err)
}
2018-05-28 18:05:06 +00:00
err = ioutil.WriteFile(privateKeyFile, []byte(utils.PrivateKeyToString(pk)), 0400)
if err != nil {
log.Fatalf("error writing new private key to file %s: %v\n", privateKeyFile, err)
}
return true
}
return false
}
2018-05-20 19:58:16 +00:00
func printAndVerifyTimeline(t *testing.T, timeline []model.Message) error {
for _, message := range timeline {
fmt.Printf("%v %v> %s [%t]\n", message.Timestamp, message.PeerID, message.Message, message.Verified)
if !message.Verified {
t.Errorf("Message '%s' from '%s' not verified!", message.Message, message.PeerID)
}
}
return nil
}
func serverCheck(serverAddr string) bool {
rc, err := goricochet.Open(serverAddr)
if err == nil {
rc.Conn.Close()
return true
}
return false
}
2018-03-30 21:16:51 +00:00
func TestCwtchPeerIntegration(t *testing.T) {
// Hide logging "noise"
log.SetOutput(ioutil.Discard)
2018-05-28 18:36:04 +00:00
// Todo: coung goroutines at beginning middle and end after shutdown
2018-05-28 18:36:04 +00:00
// ***** Cwtch Server managment *****
generatedKey := checkAndGenPrivateKey(keyfile)
serverKey, err := utils.LoadPrivateKeyFromFile(keyfile)
if err != nil {
2018-05-20 19:58:16 +00:00
t.Errorf("Could not load server's key from %v", keyfile)
}
serverAddr, _ := utils.GetOnionAddress(serverKey)
serverOnline := false
2018-05-20 19:58:16 +00:00
if !generatedKey {
fmt.Printf("Checking if test server %v is online...\n", serverAddr)
serverOnline = serverCheck(serverAddr)
}
2018-05-20 19:58:16 +00:00
if !serverOnline {
// launch app
server := new(cwtchserver.Server)
fmt.Printf("No server found\nStarting cwtch server...\n")
go server.Run(keyfile)
// let tor get established
fmt.Printf("Establishing Tor hidden service: %v...\n", serverAddr)
} else {
fmt.Printf("Found existing cwtch server %v, using for tests...\n", serverAddr)
}
2018-05-28 18:36:04 +00:00
// ***** Peer setup *****
fmt.Println("Creating Alice...")
2018-03-31 19:33:32 +00:00
alice := peer.NewCwtchPeer("Alice")
2018-05-28 18:36:04 +00:00
go alice.Listen()
fmt.Println("Alice created:", alice.Profile.Onion)
2018-05-28 18:36:04 +00:00
fmt.Println("Creating Bob...")
bob := peer.NewCwtchPeer("Bob")
go bob.Listen()
fmt.Println("Bob created:", bob.Profile.Onion)
fmt.Println("Waiting for alice and bob to connection with onion network...")
time.Sleep(time.Second * 60)
// ***** Peering and group creation / invite *****
fmt.Println("Creating group on ", serverAddr, "...")
groupId, _, err := alice.Profile.StartGroup(serverAddr)
fmt.Printf("Created group: %v!\n", groupId)
if err != nil {
2018-05-20 19:58:16 +00:00
t.Errorf("Failed to start group: %v", err)
return
}
2018-05-28 18:36:04 +00:00
fmt.Println("Peering Alice peering with bob...")
alice.PeerWithOnion(bob.Profile.Onion)
2018-05-28 18:36:04 +00:00
time.Sleep(time.Second * 15)
2018-05-28 18:36:04 +00:00
fmt.Println("Alice inviting Bob to group...")
err = alice.InviteOnionToGroup(bob.Profile.Onion, groupId)
if err != nil {
t.Fatalf("Error for Alice inviting Bob to group: %v", err)
}
time.Sleep(time.Second * 10)
2018-05-28 18:36:04 +00:00
fmt.Println("Bob examining groups and accepting invites...")
for _, group := range bob.Profile.Groups {
fmt.Printf("Bob group: %v (Accepted: %v)\n", group.GroupID, group.Accepted)
if group.Accepted == false {
fmt.Printf("Bob received and accepting group invite: %v\n", group.GroupID)
bob.AcceptInvite(group.GroupID)
}
}
time.Sleep(time.Second * 3)
2018-05-28 18:36:04 +00:00
fmt.Println("Alice joining server...")
alice.JoinServer(serverAddr)
2018-05-28 18:36:04 +00:00
fmt.Println("Bob joining server...")
bob.JoinServer(serverAddr)
2018-05-20 19:58:16 +00:00
// Wait for them to join the server
2018-05-28 18:36:04 +00:00
time.Sleep(time.Second * 30)
// ***** Conversation *****
fmt.Println("Starting conversation in group...")
// Conversation
fmt.Println("Alice> ", aliceLines[0])
2018-05-20 19:58:16 +00:00
err = alice.SendMessageToGroup(groupId, aliceLines[0])
if err != nil {
2018-05-28 18:36:04 +00:00
t.Fatalf("Alice failed to send a message to the group: %v", err)
2018-05-20 19:58:16 +00:00
}
time.Sleep(time.Second * 10)
fmt.Println("Bob> ", bobLines[0])
2018-05-20 19:58:16 +00:00
err = bob.SendMessageToGroup(groupId, bobLines[0])
if err != nil {
2018-05-28 18:36:04 +00:00
t.Fatalf("Bob failed to send a message to the group: %v", err)
2018-05-20 19:58:16 +00:00
}
time.Sleep(time.Second * 10)
// "instant" - could be either order?
fmt.Println("Alice> ", aliceLines[1])
alice.SendMessageToGroup(groupId, aliceLines[1])
fmt.Println("Bob> ", bobLines[1])
bob.SendMessageToGroup(groupId, bobLines[1])
2018-05-20 19:58:16 +00:00
time.Sleep(time.Second * 10)
fmt.Println("Alice> ", aliceLines[2])
alice.SendMessageToGroup(groupId, aliceLines[2])
// Todo: Alice disconnects
2018-05-20 19:58:16 +00:00
time.Sleep(time.Second * 10)
fmt.Println("Bob> ", bobLines[2])
bob.SendMessageToGroup(groupId, bobLines[2])
2018-05-20 19:58:16 +00:00
time.Sleep(time.Second * 10)
// Todo: Alice reconects, gets missed messages (from bob)
2018-05-28 18:36:04 +00:00
// ***** Verify Test *****
// final syncing time...
2018-05-20 19:58:16 +00:00
time.Sleep(time.Second * 10)
alicesGroup := alice.Profile.GetGroupByGroupID(groupId)
fmt.Printf("alice Groups:\n")
for k := range alice.Profile.Groups {
fmt.Println(" " + k)
}
if alicesGroup == nil {
t.Error("aliceGroup == nil")
return
}
fmt.Printf("Alice TimeLine:\n")
printAndVerifyTimeline(t, alicesGroup.GetTimeline())
bobsGroup := bob.Profile.GetGroupByGroupID(groupId)
fmt.Printf("bob Groups:\n")
for k := range bob.Profile.Groups {
fmt.Println(" " + k)
}
if bobsGroup == nil {
t.Error("bobGroup == nil")
return
}
fmt.Printf("Bob TimeLine:\n")
printAndVerifyTimeline(t, bobsGroup.GetTimeline())
if len(alicesGroup.Timeline.Messages) != 6 {
t.Errorf("Alice's timeline does not have all messages")
return
}
// check message 0,1 and 4,5 for content (2,3 could be out of order)
2018-05-20 19:58:16 +00:00
aliceGroupTimeline := alicesGroup.GetTimeline()
if aliceGroupTimeline[0].Message != aliceLines[0] || aliceGroupTimeline[1].Message != bobLines[0] ||
aliceGroupTimeline[4].Message != aliceLines[2] || aliceGroupTimeline[5].Message != bobLines[2] {
t.Errorf("Some of the messages did not have the expected content!")
}
// Todo: shutdown users and server
2018-03-30 21:16:51 +00:00
}