1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
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)
})
}
}
|