fix dns race condition
continuous-integration/drone/pr Build is passing
Details
continuous-integration/drone/pr Build is passing
Details
This commit is contained in:
parent
ce393a5ac1
commit
385d4a84eb
|
@ -12,7 +12,7 @@ steps:
|
||||||
|
|
||||||
trigger:
|
trigger:
|
||||||
event:
|
event:
|
||||||
- push
|
- pull_request
|
||||||
|
|
||||||
---
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
|
@ -20,6 +20,11 @@ type: docker
|
||||||
name: deploy
|
name: deploy
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- name: run tests
|
||||||
|
image: golang
|
||||||
|
commands:
|
||||||
|
- go build
|
||||||
|
- go test -p 1 -v ./...
|
||||||
- name: docker
|
- name: docker
|
||||||
image: plugins/docker
|
image: plugins/docker
|
||||||
settings:
|
settings:
|
||||||
|
|
|
@ -21,10 +21,10 @@ func destroy(conn *sql.DB, path string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func randomPort() int {
|
func randomPort() int {
|
||||||
return rand.Intn(3000) + 10000
|
return rand.Intn(3000) + 1024
|
||||||
}
|
}
|
||||||
|
|
||||||
func setup() (*sql.DB, *dns.Server, int, *string, func()) {
|
func setup() (*sql.DB, *dns.Server, *string, *sync.Mutex, func()) {
|
||||||
randomDb := utils.RandomId()
|
randomDb := utils.RandomId()
|
||||||
dnsPort := randomPort()
|
dnsPort := randomPort()
|
||||||
|
|
||||||
|
@ -35,32 +35,35 @@ func setup() (*sql.DB, *dns.Server, int, *string, func()) {
|
||||||
}
|
}
|
||||||
database.FindOrSaveUser(testDb, testUser)
|
database.FindOrSaveUser(testDb, testUser)
|
||||||
|
|
||||||
|
waitLock := &sync.Mutex{}
|
||||||
server := hcdns.MakeServer(&args.Arguments{
|
server := hcdns.MakeServer(&args.Arguments{
|
||||||
DnsPort: dnsPort,
|
DnsPort: dnsPort,
|
||||||
}, testDb)
|
}, testDb)
|
||||||
|
server.NotifyStartedFunc = func() {
|
||||||
|
waitLock.Unlock()
|
||||||
|
}
|
||||||
|
waitLock.Lock()
|
||||||
|
|
||||||
waitGroup := sync.WaitGroup{}
|
|
||||||
waitGroup.Add(1)
|
|
||||||
go func() {
|
go func() {
|
||||||
server.ListenAndServe()
|
server.ListenAndServe()
|
||||||
waitGroup.Done()
|
|
||||||
}()
|
}()
|
||||||
|
waitLock.Lock()
|
||||||
|
|
||||||
address := fmt.Sprintf("127.0.0.1:%d", dnsPort)
|
address := fmt.Sprintf("127.0.0.1:%d", dnsPort)
|
||||||
return testDb, server, dnsPort, &address, func() {
|
return testDb, server, &address, waitLock, func() {
|
||||||
|
server.Shutdown()
|
||||||
|
|
||||||
testDb.Close()
|
testDb.Close()
|
||||||
os.Remove(randomDb)
|
os.Remove(randomDb)
|
||||||
|
|
||||||
server.Shutdown()
|
|
||||||
waitGroup.Wait()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWhenCNAMEIsResolved(t *testing.T) {
|
func TestWhenCNAMEIsResolved(t *testing.T) {
|
||||||
t.Log("TestWhenCNAMEIsResolved")
|
t.Log("TestWhenCNAMEIsResolved")
|
||||||
|
|
||||||
testDb, _, _, addr, cleanup := setup()
|
testDb, _, addr, lock, cleanup := setup()
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
defer lock.Unlock()
|
||||||
|
|
||||||
cname := &database.DNSRecord{
|
cname := &database.DNSRecord{
|
||||||
ID: "1",
|
ID: "1",
|
||||||
|
@ -85,8 +88,8 @@ func TestWhenCNAMEIsResolved(t *testing.T) {
|
||||||
|
|
||||||
qtype := dns.TypeA
|
qtype := dns.TypeA
|
||||||
domain := dns.Fqdn(cname.Name)
|
domain := dns.Fqdn(cname.Name)
|
||||||
client := new(dns.Client)
|
client := &dns.Client{}
|
||||||
message := new(dns.Msg)
|
message := &dns.Msg{}
|
||||||
message.SetQuestion(domain, qtype)
|
message.SetQuestion(domain, qtype)
|
||||||
|
|
||||||
in, _, err := client.Exchange(message, *addr)
|
in, _, err := client.Exchange(message, *addr)
|
||||||
|
@ -135,13 +138,14 @@ func TestWhenCNAMEIsResolved(t *testing.T) {
|
||||||
func TestWhenNoRecordNxDomain(t *testing.T) {
|
func TestWhenNoRecordNxDomain(t *testing.T) {
|
||||||
t.Log("TestWhenNoRecordNxDomain")
|
t.Log("TestWhenNoRecordNxDomain")
|
||||||
|
|
||||||
_, _, _, addr, cleanup := setup()
|
_, _, addr, lock, cleanup := setup()
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
defer lock.Unlock()
|
||||||
|
|
||||||
qtype := dns.TypeA
|
qtype := dns.TypeA
|
||||||
domain := dns.Fqdn("nonexistant.example.com.")
|
domain := dns.Fqdn("nonexistant.example.com.")
|
||||||
client := new(dns.Client)
|
client := &dns.Client{}
|
||||||
message := new(dns.Msg)
|
message := &dns.Msg{}
|
||||||
message.SetQuestion(domain, qtype)
|
message.SetQuestion(domain, qtype)
|
||||||
|
|
||||||
in, _, err := client.Exchange(message, *addr)
|
in, _, err := client.Exchange(message, *addr)
|
||||||
|
@ -162,8 +166,9 @@ func TestWhenNoRecordNxDomain(t *testing.T) {
|
||||||
func TestWhenUnresolvingCNAME(t *testing.T) {
|
func TestWhenUnresolvingCNAME(t *testing.T) {
|
||||||
t.Log("TestWhenUnresolvingCNAME")
|
t.Log("TestWhenUnresolvingCNAME")
|
||||||
|
|
||||||
testDb, _, _, addr, cleanup := setup()
|
testDb, _, addr, lock, cleanup := setup()
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
defer lock.Unlock()
|
||||||
|
|
||||||
cname := &database.DNSRecord{
|
cname := &database.DNSRecord{
|
||||||
ID: "1",
|
ID: "1",
|
||||||
|
@ -178,8 +183,8 @@ func TestWhenUnresolvingCNAME(t *testing.T) {
|
||||||
|
|
||||||
qtype := dns.TypeA
|
qtype := dns.TypeA
|
||||||
domain := dns.Fqdn(cname.Name)
|
domain := dns.Fqdn(cname.Name)
|
||||||
client := new(dns.Client)
|
client := &dns.Client{}
|
||||||
message := new(dns.Msg)
|
message := &dns.Msg{}
|
||||||
message.SetQuestion(domain, qtype)
|
message.SetQuestion(domain, qtype)
|
||||||
|
|
||||||
in, _, err := client.Exchange(message, *addr)
|
in, _, err := client.Exchange(message, *addr)
|
||||||
|
@ -216,8 +221,9 @@ func TestWhenUnresolvingCNAME(t *testing.T) {
|
||||||
func TestWhenUnresolvingCNAMEWithMaxDepth(t *testing.T) {
|
func TestWhenUnresolvingCNAMEWithMaxDepth(t *testing.T) {
|
||||||
t.Log("TestWhenUnresolvingCNAMEWithMaxDepth")
|
t.Log("TestWhenUnresolvingCNAMEWithMaxDepth")
|
||||||
|
|
||||||
testDb, _, _, addr, cleanup := setup()
|
testDb, _, addr, lock, cleanup := setup()
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
defer lock.Unlock()
|
||||||
|
|
||||||
cname := &database.DNSRecord{
|
cname := &database.DNSRecord{
|
||||||
ID: "1",
|
ID: "1",
|
||||||
|
@ -232,8 +238,8 @@ func TestWhenUnresolvingCNAMEWithMaxDepth(t *testing.T) {
|
||||||
|
|
||||||
qtype := dns.TypeA
|
qtype := dns.TypeA
|
||||||
domain := dns.Fqdn(cname.Name)
|
domain := dns.Fqdn(cname.Name)
|
||||||
client := new(dns.Client)
|
client := &dns.Client{}
|
||||||
message := new(dns.Msg)
|
message := &dns.Msg{}
|
||||||
message.SetQuestion(domain, qtype)
|
message.SetQuestion(domain, qtype)
|
||||||
|
|
||||||
in, _, err := client.Exchange(message, *addr)
|
in, _, err := client.Exchange(message, *addr)
|
||||||
|
@ -245,6 +251,7 @@ func TestWhenUnresolvingCNAMEWithMaxDepth(t *testing.T) {
|
||||||
if len(in.Answer) > 0 {
|
if len(in.Answer) > 0 {
|
||||||
t.Fatalf("expected 0 answers, got %d", len(in.Answer))
|
t.Fatalf("expected 0 answers, got %d", len(in.Answer))
|
||||||
}
|
}
|
||||||
|
|
||||||
if in.Rcode != dns.RcodeServerFailure {
|
if in.Rcode != dns.RcodeServerFailure {
|
||||||
t.Fatalf("expected SERVFAIL, got %d", in.Rcode)
|
t.Fatalf("expected SERVFAIL, got %d", in.Rcode)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue