// perform a DNS query and assert the reply code, number or answers, etc func assertExchange(t *testing.T, z string, ty uint16, minAnswers int, maxAnswers int, expErr int) *dns.Msg { c := new(dns.Client) c.UDPSize = testUDPBufSize m := new(dns.Msg) m.RecursionDesired = true m.SetQuestion(z, ty) m.SetEdns0(testUDPBufSize, false) // we don't want to play with truncation here... r, _, err := c.Exchange(m, fmt.Sprintf("127.0.0.1:%d", testPort)) t.Logf("Response:\n%+v\n", r) wt.AssertNoErr(t, err) if minAnswers == 0 && maxAnswers == 0 { wt.AssertStatus(t, r.Rcode, expErr, "DNS response code") } else { wt.AssertStatus(t, r.Rcode, dns.RcodeSuccess, "DNS response code") } answers := len(r.Answer) if minAnswers >= 0 && answers < minAnswers { wt.Fatalf(t, "Number of answers >= %d", minAnswers) } if maxAnswers >= 0 && answers > maxAnswers { wt.Fatalf(t, "Number of answers <= %d", maxAnswers) } return r }
func TestHttp(t *testing.T) { var ( containerID = "deadbeef" testDomain = "weave.local." successTestName = "test1." + testDomain testAddr1 = "10.2.2.1/24" dockerIP = "9.8.7.6" ) zone := NewZoneDb(DefaultLocalDomain) port := rand.Intn(10000) + 32768 fmt.Println("Http test on port", port) go ListenHTTP("", nil, testDomain, zone, port) time.Sleep(100 * time.Millisecond) // Allow for http server to get going // Ask the http server to add our test address into the database addrParts := strings.Split(testAddr1, "/") addrURL := fmt.Sprintf("http://localhost:%d/name/%s/%s", port, containerID, addrParts[0]) resp, err := genForm("PUT", addrURL, url.Values{"fqdn": {successTestName}, "local_ip": {dockerIP}, "routing_prefix": {addrParts[1]}}) wt.AssertNoErr(t, err) wt.AssertStatus(t, resp.StatusCode, http.StatusOK, "http response") // Check that the address is now there. ip, _, _ := net.ParseCIDR(testAddr1) foundIP, err := zone.LookupName(successTestName) wt.AssertNoErr(t, err) if !foundIP[0].IP().Equal(ip) { t.Fatalf("Unexpected result for %s: received %s, expected %s", successTestName, foundIP, ip) } // Adding exactly the same address should be OK resp, err = genForm("PUT", addrURL, url.Values{"fqdn": {successTestName}, "local_ip": {dockerIP}, "routing_prefix": {addrParts[1]}}) wt.AssertNoErr(t, err) wt.AssertStatus(t, resp.StatusCode, http.StatusOK, "http success response for duplicate add") // Now try adding the same address again with a different ident -- // again should be fine otherURL := fmt.Sprintf("http://localhost:%d/name/%s/%s", port, "other", addrParts[0]) resp, err = genForm("PUT", otherURL, url.Values{"fqdn": {successTestName}, "local_ip": {dockerIP}, "routing_prefix": {addrParts[1]}}) wt.AssertNoErr(t, err) wt.AssertStatus(t, resp.StatusCode, http.StatusOK, "http response") // Delete the address resp, err = genForm("DELETE", addrURL, nil) wt.AssertNoErr(t, err) wt.AssertStatus(t, resp.StatusCode, http.StatusOK, "http response") // Check that the address is still resolvable. x, err := zone.LookupName(successTestName) t.Logf("Got %s", x) wt.AssertNoErr(t, err) // Delete the address record mentioning the other container resp, err = genForm("DELETE", otherURL, nil) wt.AssertNoErr(t, err) wt.AssertStatus(t, resp.StatusCode, http.StatusOK, "http response") // Check that the address is gone x, err = zone.LookupName(successTestName) t.Logf("Got %s", x) wt.AssertErrorType(t, err, (*LookupError)(nil), "fully-removed address") // Would like to shut down the http server at the end of this test // but it's complicated. // See https://groups.google.com/forum/#!topic/golang-nuts/vLHWa5sHnCE }