tests refactoring

This commit is contained in:
Dimitri Herzog 2020-01-14 22:27:25 +01:00
parent 3ab5d13e63
commit 3cbc4e0719
4 changed files with 193 additions and 156 deletions

34
helpertest/helper.go Normal file
View File

@ -0,0 +1,34 @@
package helpertest
import (
"io/ioutil"
"log"
"net/http"
"net/http/httptest"
"os"
)
// creates temp file with passed data
func TempFile(data string) *os.File {
f, err := ioutil.TempFile("", "prefix")
if err != nil {
log.Fatal(err)
}
_, err = f.WriteString(data)
if err != nil {
log.Fatal(err)
}
return f
}
// creates temp http server with passed data
func TestServer(data string) *httptest.Server {
return httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
_, err := rw.Write([]byte(data))
if err != nil {
log.Fatal("can't write to buffer:", err)
}
}))
}

View File

@ -1,18 +1,15 @@
package lists
import (
"io/ioutil"
"net/http"
"net/http/httptest"
"blocky/helpertest"
"os"
"testing"
log "github.com/sirupsen/logrus"
"github.com/stretchr/testify/assert"
)
func Test_NoMatch_With_Empty_List(t *testing.T) {
file1 := tempFile("#empty file")
file1 := helpertest.TempFile("#empty file")
defer os.Remove(file1.Name())
lists := map[string][]string{
@ -27,13 +24,13 @@ func Test_NoMatch_With_Empty_List(t *testing.T) {
}
func Test_Match_Download_Multiple_Groups(t *testing.T) {
server1 := testServer("blocked1.com\nblocked1a.com")
server1 := helpertest.TestServer("blocked1.com\nblocked1a.com")
defer server1.Close()
server2 := testServer("blocked2.com")
server2 := helpertest.TestServer("blocked2.com")
defer server2.Close()
server3 := testServer("blocked3.com\nblocked1a.com")
server3 := helpertest.TestServer("blocked3.com\nblocked1a.com")
defer server3.Close()
lists := map[string][]string{
@ -57,13 +54,13 @@ func Test_Match_Download_Multiple_Groups(t *testing.T) {
}
func Test_Match_Download_No_Group(t *testing.T) {
server1 := testServer("blocked1.com\nblocked1a.com")
server1 := helpertest.TestServer("blocked1.com\nblocked1a.com")
defer server1.Close()
server2 := testServer("blocked2.com")
server2 := helpertest.TestServer("blocked2.com")
defer server2.Close()
server3 := testServer("blocked3.com\nblocked1a.com")
server3 := helpertest.TestServer("blocked3.com\nblocked1a.com")
defer server3.Close()
lists := map[string][]string{
@ -79,13 +76,13 @@ func Test_Match_Download_No_Group(t *testing.T) {
}
func Test_Match_Files_Multiple_Groups(t *testing.T) {
file1 := tempFile("blocked1.com\nblocked1a.com")
file1 := helpertest.TempFile("blocked1.com\nblocked1a.com")
defer os.Remove(file1.Name())
file2 := tempFile("blocked2.com")
file2 := helpertest.TempFile("blocked2.com")
defer os.Remove(file2.Name())
file3 := tempFile("blocked3.com\nblocked1a.com")
file3 := helpertest.TempFile("blocked3.com\nblocked1a.com")
defer os.Remove(file3.Name())
lists := map[string][]string{
@ -107,26 +104,3 @@ func Test_Match_Files_Multiple_Groups(t *testing.T) {
assert.Equal(t, true, found)
assert.Equal(t, "gr2", group)
}
func tempFile(data string) *os.File {
f, err := ioutil.TempFile("", "prefix")
if err != nil {
log.Fatal(err)
}
_, err = f.WriteString(data)
if err != nil {
log.Fatal(err)
}
return f
}
func testServer(data string) *httptest.Server {
return httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
_, err := rw.Write([]byte(data))
if err != nil {
log.Fatal("can't write to buffer:", err)
}
}))
}

View File

@ -2,6 +2,7 @@ package resolver
import (
"blocky/config"
"blocky/helpertest"
"blocky/util"
"net"
"testing"
@ -12,39 +13,16 @@ import (
"github.com/stretchr/testify/mock"
)
var clientBlock = map[string][]string{
"default": {"gr0"},
"client1": {"gr1", "gr2"},
"altName": {"gr4"},
"192.168.178.55": {"gr3"},
}
type MatcherMock struct {
mock.Mock
}
func (b *MatcherMock) Configuration() (result []string) {
return
}
func (b *MatcherMock) Match(domain string, groupsToCheck []string) (found bool, group string) {
args := b.Called(domain, groupsToCheck)
return args.Bool(0), args.String(1)
}
func Test_Resolve_ClientName_IpZero(t *testing.T) {
b := &MatcherMock{}
b.On("Match", "blocked1.com", []string{"gr1", "gr2", "gr3"}).Return(true, "gr1")
w := &MatcherMock{}
w.On("Match", mock.Anything, mock.Anything).Return(false, "gr1")
sut := BlockingResolver{
clientGroupsBlock: clientBlock,
blacklistMatcher: b,
whitelistMatcher: w,
}
file := helpertest.TempFile("blocked1.com")
defer file.Close()
sut := NewBlockingResolver(config.BlockingConfig{
BlackLists: map[string][]string{"gr1": {file.Name()}},
ClientGroupsBlock: map[string][]string{
"client1": {"gr1"},
},
})
req := util.NewMsgWithQuestion("blocked1.com.", dns.TypeA)
// A
@ -54,10 +32,10 @@ func Test_Resolve_ClientName_IpZero(t *testing.T) {
ClientIP: net.ParseIP("192.168.178.55"),
Log: logrus.NewEntry(logrus.New()),
})
assert.NoError(t, err)
assert.Equal(t, dns.RcodeSuccess, resp.Res.Rcode)
assert.Equal(t, "blocked1.com. 21600 IN A 0.0.0.0", resp.Res.Answer[0].String())
b.AssertExpectations(t)
// AAAA
req = util.NewMsgWithQuestion("blocked1.com.", dns.TypeAAAA)
@ -70,21 +48,18 @@ func Test_Resolve_ClientName_IpZero(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, dns.RcodeSuccess, resp.Res.Rcode)
assert.Equal(t, "blocked1.com. 21600 IN AAAA ::", resp.Res.Answer[0].String())
b.AssertExpectations(t)
}
func Test_Resolve_ClientIp_A_IpZero(t *testing.T) {
b := &MatcherMock{}
b.On("Match", "blocked1.com", []string{"gr3"}).Return(true, "gr1")
file := helpertest.TempFile("blocked1.com")
defer file.Close()
w := &MatcherMock{}
w.On("Match", mock.Anything, mock.Anything).Return(false, "gr1")
sut := BlockingResolver{
clientGroupsBlock: clientBlock,
blacklistMatcher: b,
whitelistMatcher: w,
}
sut := NewBlockingResolver(config.BlockingConfig{
BlackLists: map[string][]string{"gr1": {file.Name()}},
ClientGroupsBlock: map[string][]string{
"192.168.178.55": {"gr1"},
},
})
req := util.NewMsgWithQuestion("blocked1.com.", dns.TypeA)
@ -97,22 +72,27 @@ func Test_Resolve_ClientIp_A_IpZero(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, dns.RcodeSuccess, resp.Res.Rcode)
assert.Equal(t, "blocked1.com. 21600 IN A 0.0.0.0", resp.Res.Answer[0].String())
b.AssertExpectations(t)
}
func Test_Resolve_ClientWith2Names_A_IpZero(t *testing.T) {
b := &MatcherMock{}
b.On("Match", "blocked1.com", []string{"gr1", "gr2", "gr3", "gr4"}).Return(true, "gr1")
file1 := helpertest.TempFile("blocked1.com")
defer file1.Close()
w := &MatcherMock{}
w.On("Match", mock.Anything, mock.Anything).Return(false, "gr1")
file2 := helpertest.TempFile("blocked2.com")
defer file2.Close()
sut := BlockingResolver{
clientGroupsBlock: clientBlock,
blacklistMatcher: b,
whitelistMatcher: w,
}
sut := NewBlockingResolver(config.BlockingConfig{
BlackLists: map[string][]string{
"gr1": {file1.Name()},
"gr2": {file2.Name()},
},
ClientGroupsBlock: map[string][]string{
"client1": {"gr1"},
"altName": {"gr2"},
},
})
// request in gr1
req := util.NewMsgWithQuestion("blocked1.com.", dns.TypeA)
resp, err := sut.Resolve(&Request{
Req: req,
@ -124,21 +104,29 @@ func Test_Resolve_ClientWith2Names_A_IpZero(t *testing.T) {
assert.Equal(t, dns.RcodeSuccess, resp.Res.Rcode)
assert.Equal(t, "blocked1.com. 21600 IN A 0.0.0.0", resp.Res.Answer[0].String())
b.AssertExpectations(t)
// request in gr2
req = util.NewMsgWithQuestion("blocked2.com.", dns.TypeA)
resp, err = sut.Resolve(&Request{
Req: req,
ClientNames: []string{"client1", "altName"},
ClientIP: net.ParseIP("192.168.178.55"),
Log: logrus.NewEntry(logrus.New()),
})
assert.NoError(t, err)
assert.Equal(t, dns.RcodeSuccess, resp.Res.Rcode)
assert.Equal(t, "blocked2.com. 21600 IN A 0.0.0.0", resp.Res.Answer[0].String())
}
func Test_Resolve_Default_A_IpZero(t *testing.T) {
b := &MatcherMock{}
b.On("Match", "blocked1.com", []string{"gr0"}).Return(true, "gr1")
file := helpertest.TempFile("blocked1.com")
defer file.Close()
w := &MatcherMock{}
w.On("Match", mock.Anything, mock.Anything).Return(false, "gr1")
sut := BlockingResolver{
clientGroupsBlock: clientBlock,
blacklistMatcher: b,
whitelistMatcher: w,
}
sut := NewBlockingResolver(config.BlockingConfig{
BlackLists: map[string][]string{"gr1": {file.Name()}},
ClientGroupsBlock: map[string][]string{
"default": {"gr1"},
},
})
req := util.NewMsgWithQuestion("blocked1.com.", dns.TypeA)
resp, err := sut.Resolve(&Request{
@ -150,21 +138,19 @@ func Test_Resolve_Default_A_IpZero(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, dns.RcodeSuccess, resp.Res.Rcode)
assert.Equal(t, "blocked1.com. 21600 IN A 0.0.0.0", resp.Res.Answer[0].String())
b.AssertExpectations(t)
}
func Test_Resolve_Default_Block_With_Whitelist(t *testing.T) {
b := &MatcherMock{}
b.On("Match", "blocked1.com", []string{"gr0"}).Return(true, "gr")
file := helpertest.TempFile("blocked1.com")
defer file.Close()
w := &MatcherMock{}
w.On("Match", "blocked1.com", []string{"gr0"}).Return(true, "gr1")
sut := BlockingResolver{
clientGroupsBlock: clientBlock,
blacklistMatcher: b,
whitelistMatcher: w,
}
sut := NewBlockingResolver(config.BlockingConfig{
BlackLists: map[string][]string{"gr1": {file.Name()}},
WhiteLists: map[string][]string{"gr1": {file.Name()}},
ClientGroupsBlock: map[string][]string{
"default": {"gr1"},
},
})
m := &resolverMock{}
m.On("Resolve", mock.Anything).Return(new(Response), nil)
@ -178,23 +164,19 @@ func Test_Resolve_Default_Block_With_Whitelist(t *testing.T) {
Log: logrus.NewEntry(logrus.New()),
})
assert.NoError(t, err)
w.AssertExpectations(t)
assert.Equal(t, 0, len(b.Calls))
m.AssertExpectations(t)
}
func Test_Resolve_Whitelist_Only(t *testing.T) {
b := &MatcherMock{}
file := helpertest.TempFile("whitelisted.com")
defer file.Close()
w := &MatcherMock{}
w.On("Match", "whitelisted.com", []string{"gr0"}).Return(true, "gr0")
w.On("Match", mock.Anything, []string{"gr0"}).Return(false, "gr0")
sut := BlockingResolver{
clientGroupsBlock: clientBlock,
blacklistMatcher: b,
whitelistMatcher: w,
whitelistOnlyGroups: []string{"gr0"},
}
sut := NewBlockingResolver(config.BlockingConfig{
WhiteLists: map[string][]string{"gr1": {file.Name()}},
ClientGroupsBlock: map[string][]string{
"default": {"gr1"},
},
})
m := &resolverMock{}
m.On("Resolve", mock.Anything).Return(new(Response), nil)
@ -208,8 +190,7 @@ func Test_Resolve_Whitelist_Only(t *testing.T) {
Log: logrus.NewEntry(logrus.New()),
})
assert.NoError(t, err)
w.AssertExpectations(t)
assert.Equal(t, 0, len(b.Calls))
m.AssertExpectations(t)
req = new(dns.Msg)
req.SetQuestion("google.com.", dns.TypeA)
@ -224,8 +205,7 @@ func Test_Resolve_Whitelist_Only(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, dns.RcodeSuccess, resp.Res.Rcode)
assert.Equal(t, "google.com. 21600 IN A 0.0.0.0", resp.Res.Answer[0].String())
w.AssertExpectations(t)
b.AssertExpectations(t)
assert.Equal(t, 1, len(m.Calls))
}
func Test_determineWhitelistOnlyGroups(t *testing.T) {
@ -246,18 +226,16 @@ func Test_determineWhitelistOnlyGroups(t *testing.T) {
}
func Test_Resolve_Default_A_NxRecord(t *testing.T) {
b := &MatcherMock{}
b.On("Match", "blocked1.com", []string{"gr0"}).Return(true, "gr1")
file := helpertest.TempFile("blocked1.com")
defer file.Close()
w := &MatcherMock{}
w.On("Match", mock.Anything, mock.Anything).Return(false, "gr1")
sut := BlockingResolver{
clientGroupsBlock: clientBlock,
blacklistMatcher: b,
blockType: NxDomain,
whitelistMatcher: w,
}
sut := NewBlockingResolver(config.BlockingConfig{
BlackLists: map[string][]string{"gr1": {file.Name()}},
ClientGroupsBlock: map[string][]string{
"default": {"gr1"},
},
BlockType: "NxDomain",
})
req := util.NewMsgWithQuestion("blocked1.com.", dns.TypeA)
resp, err := sut.Resolve(&Request{
@ -268,22 +246,19 @@ func Test_Resolve_Default_A_NxRecord(t *testing.T) {
})
assert.NoError(t, err)
assert.Equal(t, dns.RcodeNameError, resp.Res.Rcode)
b.AssertExpectations(t)
}
func Test_Resolve_NoBlock(t *testing.T) {
b := &MatcherMock{}
b.On("Match", "example.com", []string{"gr0"}).Return(false, "")
file := helpertest.TempFile("blocked1.com")
defer file.Close()
w := &MatcherMock{}
w.On("Match", mock.Anything, mock.Anything).Return(false, "gr1")
sut := NewBlockingResolver(config.BlockingConfig{
BlackLists: map[string][]string{"gr1": {file.Name()}},
ClientGroupsBlock: map[string][]string{
"client1": {"gr1"},
},
})
sut := BlockingResolver{
clientGroupsBlock: clientBlock,
blacklistMatcher: b,
blockType: NxDomain,
whitelistMatcher: w,
}
m := &resolverMock{}
m.On("Resolve", mock.Anything).Return(new(Response), nil)
sut.Next(m)
@ -296,5 +271,57 @@ func Test_Resolve_NoBlock(t *testing.T) {
Log: logrus.NewEntry(logrus.New()),
})
assert.NoError(t, err)
b.AssertExpectations(t)
m.AssertExpectations(t)
}
func Test_Configuration(t *testing.T) {
file := helpertest.TempFile("blocked1.com")
defer file.Close()
sut := NewBlockingResolver(config.BlockingConfig{
BlackLists: map[string][]string{"gr1": {file.Name()}},
WhiteLists: map[string][]string{"gr1": {file.Name()}},
ClientGroupsBlock: map[string][]string{
"default": {"gr1"},
},
})
c := sut.Configuration()
assert.Len(t, c, 17)
}
func Test_Resolve_WrongBlockType(t *testing.T) {
defer func() { logrus.StandardLogger().ExitFunc = nil }()
var fatal bool
logrus.StandardLogger().ExitFunc = func(int) { fatal = true }
_ = NewBlockingResolver(config.BlockingConfig{
BlockType: "wrong",
})
assert.True(t, fatal)
}
func Test_Resolve_NoLists(t *testing.T) {
sut := NewBlockingResolver(config.BlockingConfig{})
m := &resolverMock{}
m.On("Resolve", mock.Anything).Return(new(Response), nil)
sut.Next(m)
req := util.NewMsgWithQuestion("example.com.", dns.TypeA)
_, err := sut.Resolve(&Request{
Req: req,
ClientNames: []string{"unknown"},
ClientIP: net.ParseIP("192.168.178.1"),
Log: logrus.NewEntry(logrus.New()),
})
assert.NoError(t, err)
m.AssertExpectations(t)
c := sut.Configuration()
assert.Equal(t, []string{"deactivated"}, c)
}

View File

@ -5,6 +5,7 @@ import (
"blocky/util"
"fmt"
"net"
"sync/atomic"
"testing"
"github.com/miekg/dns"
@ -58,9 +59,10 @@ func TestClientNamesFromUpstream(t *testing.T) {
}
func TestClientInfoFromUpstreamSingleNameWithOrder(t *testing.T) {
callCount := 0
var callCount int32
upstream := TestUDPUpstream(func(request *dns.Msg) *dns.Msg {
callCount++
atomic.AddInt32(&callCount, 1)
r, err := dns.ReverseAddr("192.168.178.25")
assert.NoError(t, err)
@ -83,7 +85,7 @@ func TestClientInfoFromUpstreamSingleNameWithOrder(t *testing.T) {
Log: logrus.NewEntry(logrus.New())}
_, err := sut.Resolve(request)
assert.Equal(t, 1, callCount)
assert.Equal(t, int32(1), callCount)
m.AssertExpectations(t)
assert.NoError(t, err)
@ -95,7 +97,7 @@ func TestClientInfoFromUpstreamSingleNameWithOrder(t *testing.T) {
_, err = sut.Resolve(request)
// use cache -> call count 1
assert.Equal(t, 1, callCount)
assert.Equal(t, int32(1), callCount)
m.AssertExpectations(t)
assert.NoError(t, err)