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  }