diff options
Diffstat (limited to 'nvdmirror/sync_test.go')
-rw-r--r-- | nvdmirror/sync_test.go | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/nvdmirror/sync_test.go b/nvdmirror/sync_test.go new file mode 100644 index 0000000..fb9b56b --- /dev/null +++ b/nvdmirror/sync_test.go @@ -0,0 +1,149 @@ +package nvdmirror + +import ( + "fmt" + "os" + "net/http" + "path/filepath" + "testing" +) + +// get test config +func getTestConfig(port int) SyncConfig { + // build url + url := fmt.Sprintf("http://localhost:%d", port) + + return SyncConfig { + Cve11BaseUrl: url, + CpeMatch10BaseUrl: url, + Cpe23DictUrl: fmt.Sprintf("%s/official-cpe-dictionary_v2.3.xml.gz", url), + } +} + +// serve on given port +func serve(port int, ch chan bool) { + s := http.Server { + Addr: fmt.Sprintf(":%d", port), + Handler: http.FileServer(http.Dir("testdata/files")), + } + + go (func() { + // block on channel + _ = <-ch + + // shut down server + s.Close() + })() + + // start server + s.ListenAndServe() +} + +// close server immediately +func stopServer(ch chan bool) { + ch <- false +} + +func TestSync(t *testing.T) { + // + port := 8888 + ch := make(chan bool) + defer stopServer(ch) + + // spin up local server + go serve(port, ch) + + // create temp dir + dir, err := os.MkdirTemp("", "") + if err != nil { + t.Error(err) + return + } + defer os.RemoveAll(dir) + // dir = "testdata/out" + + // create cache + cache, err := NewJsonCache(filepath.Join(dir, "cache.json.gz")) + if err != nil { + t.Error(err) + return + } + defer cache.Close() + + // custom sync config + config := getTestConfig(port) + + // sync data + t.Run("initial", func(t *testing.T) { + Sync(config, &cache, dir) + }) + + // sync data again (to test caching) + t.Run("caching", func(t *testing.T) { + Sync(config, &cache, dir) + }) + + // sync w/ missing dir + t.Run("missingDir", func(t *testing.T) { + missingDir := filepath.Join(dir, "does/not/exist") + Sync(config, &cache, missingDir) + }) + + // sync w/ bad cache + t.Run("failSetCache", func(t *testing.T) { + var cache FailSetCache + Sync(config, &cache, dir) + }) + + t.Run("customUserAgent", func(t *testing.T) { + // custom sync config + config := getTestConfig(port) + config.UserAgent = "custom-user-agent/0.0.0" + + Sync(config, &cache, dir) + }) + + t.Run("clientFail", func(t *testing.T) { + // custom sync config + config := getTestConfig(port) + config.Cve11BaseUrl = "http://localhost:0" + + Sync(config, &cache, dir) + }) +} + +func TestBadUrls(t *testing.T) { + // create temp dir + dir, err := os.MkdirTemp("", "") + if err != nil { + t.Error(err) + return + } + defer os.RemoveAll(dir) + + // create cache + cache, err := NewJsonCache(filepath.Join(dir, "cache.json.gz")) + if err != nil { + t.Error(err) + return + } + defer cache.Close() + + // invalid base URLs + failTests := []string { + "httsldkfjasldkfjadp:// \\ localhost:0", + } + + for _, test := range(failTests) { + t.Run(test, func(t *testing.T) { + // custom sync config + config := getTestConfig(0) + config.Cve11BaseUrl = test + + // sync data; note: even with an invalid base URL we still expect + // this call to succeed; it's just that all of the URLs will be + // nonsensical + Sync(config, &cache, dir) + }) + } +} |