github.com/PDOK/gokoala@v0.50.6/internal/engine/downloader_test.go (about) 1 package engine 2 3 import ( 4 "log" 5 "net" 6 "net/http" 7 "net/http/httptest" 8 "net/url" 9 "os" 10 "path" 11 "runtime" 12 "testing" 13 "time" 14 15 "github.com/stretchr/testify/assert" 16 ) 17 18 func init() { 19 // change working dir to root, to mimic behavior of 'go run' in order to resolve template/config files. 20 _, filename, _, _ := runtime.Caller(0) 21 dir := path.Join(path.Dir(filename), "../../") 22 err := os.Chdir(dir) 23 if err != nil { 24 panic(err) 25 } 26 } 27 28 func TestDownload(t *testing.T) { 29 type args struct { 30 url string 31 parallelism int 32 tlsSkipVerify bool 33 timeout time.Duration 34 retryDelay time.Duration 35 retryMaxDelay time.Duration 36 maxRetries int 37 } 38 tests := []struct { 39 name string 40 args args 41 }{ 42 { 43 name: "Test concurrent download", 44 args: args{ 45 url: "http://localhost:8989/bag.gpkg", 46 parallelism: 2, 47 tlsSkipVerify: false, 48 timeout: 60 * time.Second, 49 retryDelay: 1 * time.Second, 50 retryMaxDelay: 60 * time.Second, 51 maxRetries: 2, 52 }, 53 }, 54 { 55 name: "Test regular download", 56 args: args{ 57 url: "http://localhost:8989/bag.gpkg", 58 parallelism: 1, 59 tlsSkipVerify: false, 60 timeout: 60 * time.Second, 61 retryDelay: 1 * time.Second, 62 retryMaxDelay: 60 * time.Second, 63 maxRetries: 2, 64 }, 65 }, 66 } 67 for _, tt := range tests { 68 t.Run(tt.name, func(t *testing.T) { 69 outputFile, err := os.CreateTemp("", "gpkg") 70 assert.NoError(t, err) 71 defer os.Remove(outputFile.Name()) 72 73 ts := createMockServer() 74 defer ts.Close() 75 76 parsedURL, err := url.Parse(tt.args.url) 77 assert.NoError(t, err) 78 79 downloadTime, err := Download(*parsedURL, outputFile.Name(), tt.args.parallelism, tt.args.tlsSkipVerify, 80 tt.args.timeout, tt.args.retryDelay, tt.args.retryMaxDelay, tt.args.maxRetries) 81 assert.NoError(t, err) 82 assert.Greater(t, *downloadTime, 1*time.Millisecond) 83 assert.FileExists(t, outputFile.Name()) 84 stat, err := outputFile.Stat() 85 assert.NoError(t, err) 86 assert.Greater(t, stat.Size(), int64(1*1024)) 87 }) 88 } 89 } 90 91 func createMockServer() *httptest.Server { 92 l, err := net.Listen("tcp", "localhost:8989") 93 if err != nil { 94 log.Fatal(err) 95 } 96 ts := httptest.NewUnstartedServer(http.FileServer(http.Dir("internal/ogc/features/datasources/geopackage/testdata"))) 97 err = ts.Listener.Close() 98 if err != nil { 99 log.Fatal(err) 100 } 101 ts.Listener = l 102 ts.Start() 103 return ts 104 }