@ -12,6 +12,7 @@ import (
"cwtch.im/cwtch/protocol/connections"
"encoding/base64"
"encoding/json"
"git.openprivacy.ca/cwtch.im/tapir/primitives/privacypass"
"git.openprivacy.ca/openprivacy/connectivity/tor"
"git.openprivacy.ca/openprivacy/log"
_ "github.com/mutecomm/go-sqlcipher/v4"
@ -19,6 +20,7 @@ import (
"os"
"os/user"
"path"
"path/filepath"
"runtime"
"runtime/pprof"
"testing"
@ -51,6 +53,18 @@ func waitForConnection(t *testing.T, peer peer.CwtchPeer, addr string, target co
}
}
func checkAndLoadTokens ( ) [ ] * privacypass . Token {
var tokens [ ] * privacypass . Token
data , err := os . ReadFile ( "../tokens" )
if err == nil {
err := json . Unmarshal ( data , & tokens )
if err != nil {
log . Errorf ( "could not load tokens from file" )
}
}
return tokens
}
func TestCwtchPeerIntegration ( t * testing . T ) {
// Goroutine Monitoring Start..
@ -62,6 +76,13 @@ func TestCwtchPeerIntegration(t *testing.T) {
log . ExcludeFromPattern ( "outbound/3dhauthchannel" )
log . ExcludeFromPattern ( "event/eventmanager" )
log . ExcludeFromPattern ( "tapir" )
// checking if we should use the token cache
cachedTokens := checkAndLoadTokens ( )
if len ( cachedTokens ) > 7 {
log . Infof ( "using cached tokens" )
}
os . Mkdir ( "tordir" , 0700 )
dataDir := path . Join ( "tordir" , "tor" )
os . MkdirAll ( dataDir , 0700 )
@ -78,9 +99,18 @@ func TestCwtchPeerIntegration(t *testing.T) {
panic ( err )
}
useCache := os . Getenv ( "TORCACHE" ) == "true"
torDataDir := ""
if torDataDir , err = os . MkdirTemp ( dataDir , "data-dir-" ) ; err != nil {
t . Fatalf ( "could not create data dir" )
if useCache {
log . Infof ( "using tor cache" )
torDataDir = filepath . Join ( dataDir , "data-dir-torcache" )
os . MkdirAll ( torDataDir , 0700 )
} else {
log . Infof ( "using clean tor data dir" )
if torDataDir , err = os . MkdirTemp ( dataDir , "data-dir-" ) ; err != nil {
t . Fatalf ( "could not create data dir" )
}
}
tor . NewTorrc ( ) . WithSocksPort ( socksPort ) . WithOnionTrafficOnly ( ) . WithHashedPassword ( base64 . StdEncoding . EncodeToString ( key ) ) . WithControlPort ( controlPort ) . Build ( "tordir/tor/torrc" )
@ -225,10 +255,14 @@ func TestCwtchPeerIntegration(t *testing.T) {
log . Infof ( "Alice has carol's name as '%v'\n" , carolName )
// Group Testing
usedTokens := len ( aliceLines )
// Simulate Alice Creating a Group
log . Infoln ( "Alice joining server..." )
if _ , err := alice . AddServer ( string ( serverKeyBundle ) ) ; err != nil {
if serverOnion , err := alice . AddServer ( string ( serverKeyBundle ) ) ; err != nil {
if len ( cachedTokens ) > len ( aliceLines ) {
alice . LoadCachedTokens ( serverOnion , cachedTokens [ 0 : len ( aliceLines ) ] )
}
t . Fatalf ( "Failed to Add Server Bundle %v" , err )
}
@ -260,6 +294,10 @@ func TestCwtchPeerIntegration(t *testing.T) {
log . Infof ( "Parsed Overlay Message: %v" , overlayMessage )
err = bob . ImportBundle ( overlayMessage . Data )
log . Infof ( "Result of Bob Importing the Bundle from Alice: %v" , err )
if len ( cachedTokens ) > ( usedTokens + len ( bobLines ) ) {
bob . LoadCachedTokens ( ServerAddr , cachedTokens [ usedTokens : usedTokens + len ( bobLines ) ] )
usedTokens += len ( bobLines )
}
log . Infof ( "Waiting for Bob to join connect to group server..." )
waitForConnection ( t , bob , ServerAddr , connections . SYNCED )
@ -278,15 +316,17 @@ func TestCwtchPeerIntegration(t *testing.T) {
checkSendMessageToGroup ( t , alice , aliceGroupConversationID , aliceLines [ 1 ] )
checkSendMessageToGroup ( t , bob , bobGroupConversationID , bobLines [ 1 ] )
// Pretend that Carol A quires the Overlay Message through some other means...
// Pretend that Carol A c quires the Overlay Message through some other means...
json . Unmarshal ( [ ] byte ( message ) , & overlayMessage )
log . Infof ( "Parsed Overlay Message: %v" , overlayMessage )
err = carol . ImportBundle ( overlayMessage . Data )
log . Infof ( "Result of Carol Importing the Bundle from Alice: %v" , err )
log . Infof ( "Waiting for Carol to join connect to group server..." )
carolGroupConversationID := 3
if len ( cachedTokens ) > ( usedTokens + len ( carolLines ) ) {
carol . LoadCachedTokens ( ServerAddr , cachedTokens [ usedTokens : usedTokens + len ( carolLines ) ] )
}
waitForConnection ( t , carol , ServerAddr , connections . SYNCED )
numGoRoutinesPostCarolConnect := runtime . NumGoroutine ( )
// Check Alice Timeline