router7/internal/oui/oui_test.go
2019-01-06 18:07:59 +01:00

143 lines
4.0 KiB
Go

package oui
import (
"io"
"io/ioutil"
"net/http"
"net/http/httptest"
"os"
"testing"
)
func TestDB(t *testing.T) {
t.Parallel()
const (
ubiquitiBlock = "f0:9f:c2"
salcompBlock = "44:09:b8"
)
tmpdir, err := ioutil.TempDir("", "oui")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tmpdir)
t.Run("FromScratch", func(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Last-Modified", "Sun, 06 Jan 2019 15:03:46 GMT")
io.WriteString(w, `Registry,Assignment,Organization Name,Organization Address
MA-L,F09FC2,Ubiquiti Networks Inc.,2580 Orchard Parkway San Jose CA US 95131
MA-L,4409B8,"Salcomp (Shenzhen) CO., LTD.","Salcomp Road, Furong Industrial Area, Xinqiao, Shajing, Baoan District Shenzhen Guangdong CN 518125 "
`)
}))
defer srv.Close()
db := NewDB(tmpdir, ouiURL(srv.URL))
if err := db.WaitUntilLoaded(); err != nil {
t.Fatal(err)
}
if got, want := db.Lookup(ubiquitiBlock), "Ubiquiti Networks Inc."; got != want {
t.Errorf("db.Lookup(%q) = %v, want %v", ubiquitiBlock, got, want)
}
if got, want := db.Lookup(salcompBlock), "Salcomp (Shenzhen) CO., LTD."; got != want {
t.Errorf("db.Lookup(%q) = %v, want %v", salcompBlock, got, want)
}
})
t.Run("BrokenUpstream", func(t *testing.T) {
unblock := make(chan struct{})
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
<-unblock
http.Error(w, "yuck!", http.StatusInternalServerError)
}))
defer srv.Close()
db := NewDB(tmpdir, ouiURL(srv.URL))
if err := db.WaitUntilLoaded(); err != nil {
t.Fatal(err)
}
if got, want := db.Lookup(ubiquitiBlock), "Ubiquiti Networks Inc."; got != want {
t.Errorf("db.Lookup(%q) = %v, want %v", ubiquitiBlock, got, want)
}
db.Lock()
db.loaded = false // reset so that we can wait again
db.Unlock()
unblock <- struct{}{}
if err := db.WaitUntilLoaded(); err == nil {
t.Fatal("db.WaitUntilLoaded returned no error despite HTTP 500")
}
if got, want := db.Lookup(ubiquitiBlock), "Ubiquiti Networks Inc."; got != want {
t.Errorf("db.Lookup(%q) = %v, want %v", ubiquitiBlock, got, want)
}
})
t.Run("NoUpdates", func(t *testing.T) {
unblock := make(chan struct{})
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
<-unblock
w.WriteHeader(http.StatusNotModified)
}))
defer srv.Close()
db := NewDB(tmpdir, ouiURL(srv.URL))
if err := db.WaitUntilLoaded(); err != nil {
t.Fatal(err)
}
if got, want := db.Lookup(ubiquitiBlock), "Ubiquiti Networks Inc."; got != want {
t.Errorf("db.Lookup(%q) = %v, want %v", ubiquitiBlock, got, want)
}
db.Lock()
db.loaded = false // reset so that we can wait again
db.Unlock()
unblock <- struct{}{}
if err := db.WaitUntilLoaded(); err != nil {
t.Fatal(err)
}
if got, want := db.Lookup(ubiquitiBlock), "Ubiquiti Networks Inc."; got != want {
t.Errorf("db.Lookup(%q) = %v, want %v", ubiquitiBlock, got, want)
}
})
t.Run("Update", func(t *testing.T) {
unblock := make(chan struct{})
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
<-unblock
w.Header().Set("Last-Modified", "Sun, 06 Jan 2019 15:03:49 GMT")
io.WriteString(w, `Registry,Assignment,Organization Name,Organization Address
MA-L,F09FC2,Obiquiti Networks Inc.,2580 Orchard Parkway San Jose CA US 95131
`)
}))
defer srv.Close()
db := NewDB(tmpdir, ouiURL(srv.URL))
if err := db.WaitUntilLoaded(); err != nil {
t.Fatal(err)
}
if got, want := db.Lookup(ubiquitiBlock), "Ubiquiti Networks Inc."; got != want {
t.Errorf("db.Lookup(%q) = %v, want %v", ubiquitiBlock, got, want)
}
db.Lock()
db.loaded = false // reset so that we can wait again
db.Unlock()
unblock <- struct{}{}
if err := db.WaitUntilLoaded(); err != nil {
t.Fatal(err)
}
if got, want := db.Lookup(ubiquitiBlock), "Obiquiti Networks Inc."; got != want {
t.Errorf("db.Lookup(%q) = %v, want %v", ubiquitiBlock, got, want)
}
})
}