Config tests

This commit is contained in:
Chad Retz 2018-05-11 12:34:33 -05:00
parent da1464009f
commit cd13abdf50
8 changed files with 113 additions and 8 deletions

View File

@ -15,11 +15,11 @@ func NewConfEntry(key string, value *string) *ConfEntry {
return &ConfEntry{Key: key, Value: value}
}
func (c *Conn) SetConf(entries []*ConfEntry) error {
func (c *Conn) SetConf(entries ...*ConfEntry) error {
return c.sendSetConf("SETCONF", entries)
}
func (c *Conn) ResetConf(entries []*ConfEntry) error {
func (c *Conn) ResetConf(entries ...*ConfEntry) error {
return c.sendSetConf("RESETCONF", entries)
}

View File

@ -48,7 +48,7 @@ type InfoValue struct {
}
func (c *Conn) GetInfo(keys ...string) ([]*InfoValue, error) {
resp, err := c.SendRequest("GETCONF %v", strings.Join(keys, " "))
resp, err := c.SendRequest("GETINFO %v", strings.Join(keys, " "))
if err != nil {
return nil, err
}

View File

@ -5,12 +5,20 @@ import "testing"
func TestAuthenticateNull(t *testing.T) {
ctx, conn := NewTestContextConnected(t)
defer ctx.CloseConnected(conn)
// Verify auth methods before auth
info, err := conn.ProtocolInfo()
ctx.Require.NoError(err)
ctx.Require.ElementsMatch([]string{"NULL"}, info.AuthMethods)
ctx.Require.NoError(conn.Authenticate(""))
}
func TestAuthenticateSafeCookie(t *testing.T) {
ctx, conn := NewTestContextConnected(t, "--CookieAuthentication", "1")
defer ctx.CloseConnected(conn)
// Verify auth methods before auth
info, err := conn.ProtocolInfo()
ctx.Require.NoError(err)
ctx.Require.ElementsMatch([]string{"COOKIE", "SAFECOOKIE"}, info.AuthMethods)
ctx.Require.NoError(conn.Authenticate(""))
}
@ -19,5 +27,9 @@ func TestAuthenticateHashedPassword(t *testing.T) {
ctx, conn := NewTestContextConnected(t, "--HashedControlPassword",
"16:5417AE717521511A609921392778FFA8518EC089BF2162A199241AEB4A")
defer ctx.CloseConnected(conn)
// Verify auth methods before auth
info, err := conn.ProtocolInfo()
ctx.Require.NoError(err)
ctx.Require.ElementsMatch([]string{"HASHESPASSWORD"}, info.AuthMethods)
ctx.Require.NoError(conn.Authenticate("testpass"))
}

View File

@ -0,0 +1,72 @@
package controltest
import (
"io/ioutil"
"testing"
"github.com/cretz/bine/control"
)
func TestGetSetAndResetConf(t *testing.T) {
ctx, conn := NewTestContextAuthenticated(t)
defer ctx.CloseConnected(conn)
// Simple get conf
assertConfVals := func(val string) {
entries, err := conn.GetConf("LogMessageDomains", "ProtocolWarnings")
ctx.Require.NoError(err)
ctx.Require.Len(entries, 2)
ctx.Require.Contains(entries, &control.ConfEntry{Key: "LogMessageDomains", Value: &val})
ctx.Require.Contains(entries, &control.ConfEntry{Key: "ProtocolWarnings", Value: &val})
}
assertConfVals("0")
// Change em both to 1
one := "1"
err := conn.SetConf(&control.ConfEntry{Key: "LogMessageDomains", Value: &one},
&control.ConfEntry{Key: "ProtocolWarnings", Value: &one})
ctx.Require.NoError(err)
// Check again
assertConfVals(one)
// Reset em both
err = conn.ResetConf(&control.ConfEntry{Key: "LogMessageDomains"}, &control.ConfEntry{Key: "ProtocolWarnings"})
ctx.Require.NoError(err)
// Make sure both back to zero
assertConfVals("0")
}
func TestLoadConf(t *testing.T) {
ctx, conn := NewTestContextAuthenticated(t)
defer ctx.CloseConnected(conn)
// Get entire conf text
vals, err := conn.GetInfo("config-text")
ctx.Require.NoError(err)
ctx.Require.Len(vals, 1)
ctx.Require.Equal("config-text", vals[0].Key)
confText := vals[0].Value
// Append new conf val and load
ctx.Require.NotContains(confText, "LogMessageDomains")
confText += "\r\nLogMessageDomains 1"
ctx.Require.NoError(conn.LoadConf(confText))
// Check the new val
vals, err = conn.GetInfo("config-text")
ctx.Require.NoError(err)
ctx.Require.Len(vals, 1)
ctx.Require.Equal("config-text", vals[0].Key)
ctx.Require.Contains(vals[0].Value, "LogMessageDomains 1")
}
func TestSaveConf(t *testing.T) {
ctx, conn := NewTestContextAuthenticated(t)
defer ctx.CloseConnected(conn)
// Get conf filename
vals, err := conn.GetInfo("config-file")
ctx.Require.NoError(err)
ctx.Require.Len(vals, 1)
ctx.Require.Equal("config-file", vals[0].Key)
confFile := vals[0].Value
// Save it
ctx.Require.NoError(conn.SaveConf(false))
// Read and make sure, say, the DataDirectory is accurate
confText, err := ioutil.ReadFile(confFile)
ctx.Require.NoError(err)
ctx.Require.Contains(string(confText), "DataDirectory "+ctx.TestTor.DataDir)
}

View File

@ -35,6 +35,16 @@ func NewTestContextConnected(t *testing.T, extraTorArgs ...string) (*TestContext
return ctx, conn
}
func NewTestContextAuthenticated(t *testing.T, extraTorArgs ...string) (*TestContext, *control.Conn) {
ctx, conn := NewTestContextConnected(t, extraTorArgs...)
if err := conn.Authenticate(""); err != nil {
conn.Close()
ctx.Close()
ctx.Fatal(err)
}
return ctx, conn
}
func (t *TestContext) EnsureTestTorStarted() {
if t.TestTor == nil {
var err error

View File

@ -15,7 +15,7 @@ import (
var torExePath string
func init() {
flag.StringVar(&torExePath, "tor", "tor", "The TOR exe path")
flag.StringVar(&torExePath, "tor.path", "tor", "The TOR exe path")
flag.Parse()
}
@ -33,9 +33,15 @@ func StartTestTor(ctx context.Context, extraArgs ...string) (*TestTor, error) {
return nil, err
}
controlPortFile := filepath.Join(dataDir, "control-port")
// We have to touch the torrc
torrcFile := filepath.Join(dataDir, "test-torrc")
if err = ioutil.WriteFile(torrcFile, nil, os.FileMode(0600)); err != nil {
return nil, err
}
ret := &TestTor{
DataDir: dataDir,
OrigArgs: append([]string{
"-f", torrcFile,
// "--quiet",
"--DisableNetwork", "1",
"--ControlPort", "auto",

View File

@ -82,13 +82,14 @@ func (c *Conn) ReadResponse() (*Response, error) {
resp.Data = append(resp.Data, line[4:])
case '+':
// A "dot-encoded" payload follows.
resp.Data = append(resp.Data, line[4:])
dotBody, err := c.conn.ReadDotBytes()
if err != nil {
return nil, err
}
resp.Data = append(resp.Data, strings.TrimRight(string(dotBody), "\n\r"))
dotLines := strings.Split(string(dotBody), "\n")
dotBodyStr := strings.TrimRight(string(dotBody), "\n\r")
c.debugf("Read dot body:\n---\n%v\n---", dotBodyStr)
resp.Data = append(resp.Data, line[4:]+dotBodyStr)
dotLines := strings.Split(dotBodyStr, "\n")
for _, dotLine := range dotLines[:len(dotLines)-1] {
resp.RawLines = append(resp.RawLines, dotLine)
}

View File

@ -2,6 +2,7 @@ package process
import (
"context"
"os"
"os/exec"
)
@ -17,5 +18,8 @@ func NewProcessCreator(exePath string) ProcessCreator {
return &exeProcessCreator{exePath}
}
func (e *exeProcessCreator) New(ctx context.Context, args ...string) (Process, error) {
return &exeProcess{Cmd: exec.CommandContext(ctx, e.exePath, args...)}, nil
proc := &exeProcess{Cmd: exec.CommandContext(ctx, e.exePath, args...)}
proc.Stdout = os.Stdout
proc.Stderr = os.Stderr
return proc, nil
}