97 lines
2.4 KiB
Go
97 lines
2.4 KiB
Go
package tests
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.openprivacy.ca/openprivacy/bine/tor"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
var torEnabled bool
|
|
var torExePath string
|
|
var torVerbose bool
|
|
var torIncludeNetworkTests bool
|
|
var globalEnabledNetworkContext *TestContext
|
|
|
|
func TestMain(m *testing.M) {
|
|
flag.BoolVar(&torEnabled, "tor", false, "Whether any of the integration tests are enabled")
|
|
flag.StringVar(&torExePath, "tor.path", "tor", "The Tor exe path")
|
|
flag.BoolVar(&torVerbose, "tor.verbose", false, "Show verbose test info")
|
|
flag.BoolVar(&torIncludeNetworkTests, "tor.network", false, "Include network tests")
|
|
flag.Parse()
|
|
exitCode := m.Run()
|
|
if globalEnabledNetworkContext != nil {
|
|
globalEnabledNetworkContext.CloseTorOnClose = true
|
|
globalEnabledNetworkContext.Close()
|
|
}
|
|
os.Exit(exitCode)
|
|
}
|
|
|
|
func GlobalEnabledNetworkContext(t *testing.T) *TestContext {
|
|
if !torEnabled || !torIncludeNetworkTests {
|
|
t.Skip("Only runs if -tor and -tor.network are set")
|
|
}
|
|
if globalEnabledNetworkContext == nil {
|
|
ctx := NewTestContext(t, nil)
|
|
ctx.CloseTorOnClose = false
|
|
// 45 second wait for enable network
|
|
enableCtx, enableCancel := context.WithTimeout(ctx, 45*time.Second)
|
|
defer enableCancel()
|
|
ctx.Require.NoError(ctx.EnableNetwork(enableCtx, true))
|
|
globalEnabledNetworkContext = ctx
|
|
} else {
|
|
globalEnabledNetworkContext.T = t
|
|
globalEnabledNetworkContext.Require = require.New(t)
|
|
}
|
|
return globalEnabledNetworkContext
|
|
}
|
|
|
|
type TestContext struct {
|
|
context.Context
|
|
*testing.T
|
|
*tor.Tor
|
|
Require *require.Assertions
|
|
CloseTorOnClose bool
|
|
}
|
|
|
|
func NewTestContext(t *testing.T, conf *tor.StartConf) *TestContext {
|
|
if !torEnabled {
|
|
t.Skip("Only runs if -tor is set")
|
|
}
|
|
// Build start conf
|
|
if conf == nil {
|
|
conf = &tor.StartConf{}
|
|
}
|
|
conf.ExePath = torExePath
|
|
if torVerbose {
|
|
conf.DebugWriter = os.Stdout
|
|
conf.NoHush = true
|
|
} else {
|
|
conf.ExtraArgs = append(conf.ExtraArgs, "--quiet")
|
|
}
|
|
ret := &TestContext{Context: context.Background(), T: t, Require: require.New(t), CloseTorOnClose: true}
|
|
// Start tor
|
|
var err error
|
|
if ret.Tor, err = tor.Start(ret.Context, conf); err != nil {
|
|
defer ret.Close()
|
|
t.Fatal(err)
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func (t *TestContext) Close() {
|
|
if t.CloseTorOnClose {
|
|
if err := t.Tor.Close(); err != nil {
|
|
if t.Failed() {
|
|
t.Logf("Failure on close: %v", err)
|
|
} else {
|
|
t.Errorf("Failure on close: %v", err)
|
|
}
|
|
}
|
|
}
|
|
}
|