bine/tests/context_test.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)
}
}
}
}