aboutsummaryrefslogtreecommitdiff
path: root/nvdmirror/sync_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'nvdmirror/sync_test.go')
-rw-r--r--nvdmirror/sync_test.go149
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)
+ })
+ }
+}