gitlab.com/jfprevost/gitlab-runner-notlscheck@v11.11.4+incompatible/commands/helpers/cache_archiver_test.go (about) 1 package helpers 2 3 import ( 4 "bytes" 5 "net/http" 6 "net/http/httptest" 7 "os" 8 "testing" 9 "time" 10 11 "github.com/sirupsen/logrus" 12 "github.com/stretchr/testify/assert" 13 14 "gitlab.com/gitlab-org/gitlab-runner/helpers" 15 ) 16 17 const cacheArchiverArchive = "archive.zip" 18 const cacheArchiverTestArchivedFile = "archive_file" 19 20 func TestCacheArchiverIsUpToDate(t *testing.T) { 21 writeTestFile(t, cacheArchiverTestArchivedFile) 22 defer os.Remove(cacheArchiverTestArchivedFile) 23 24 defer os.Remove(cacheArchiverArchive) 25 cmd := CacheArchiverCommand{ 26 File: cacheArchiverArchive, 27 fileArchiver: fileArchiver{ 28 Paths: []string{ 29 cacheArchiverTestArchivedFile, 30 }, 31 }, 32 } 33 cmd.Execute(nil) 34 fi, _ := os.Stat(cacheArchiverArchive) 35 cmd.Execute(nil) 36 fi2, _ := os.Stat(cacheArchiverArchive) 37 assert.Equal(t, fi.ModTime(), fi2.ModTime(), "archive is up to date") 38 39 // We need to wait one second, since the FS doesn't save milliseconds 40 time.Sleep(time.Second) 41 42 os.Chtimes(cacheArchiverTestArchivedFile, time.Now(), time.Now()) 43 cmd.Execute(nil) 44 fi3, _ := os.Stat(cacheArchiverArchive) 45 assert.NotEqual(t, fi.ModTime(), fi3.ModTime(), "archive should get updated") 46 } 47 48 func TestCacheArchiverForIfNoFileDefined(t *testing.T) { 49 removeHook := helpers.MakeFatalToPanic() 50 defer removeHook() 51 cmd := CacheArchiverCommand{} 52 assert.Panics(t, func() { 53 cmd.Execute(nil) 54 }) 55 } 56 57 func testCacheUploadHandler(w http.ResponseWriter, r *http.Request) { 58 if r.Method != "PUT" { 59 http.Error(w, "405 Method not allowed", http.StatusMethodNotAllowed) 60 return 61 } 62 if r.URL.Path != "/cache.zip" { 63 if r.URL.Path == "/timeout" { 64 time.Sleep(50 * time.Millisecond) 65 } 66 http.NotFound(w, r) 67 return 68 } 69 } 70 71 func TestCacheArchiverRemoteServerNotFound(t *testing.T) { 72 ts := httptest.NewServer(http.HandlerFunc(testCacheUploadHandler)) 73 defer ts.Close() 74 75 removeHook := helpers.MakeFatalToPanic() 76 defer removeHook() 77 os.Remove(cacheExtractorArchive) 78 cmd := CacheArchiverCommand{ 79 File: cacheExtractorArchive, 80 URL: ts.URL + "/invalid-file.zip", 81 Timeout: 0, 82 } 83 assert.Panics(t, func() { 84 cmd.Execute(nil) 85 }) 86 } 87 88 func TestCacheArchiverRemoteServer(t *testing.T) { 89 ts := httptest.NewServer(http.HandlerFunc(testCacheUploadHandler)) 90 defer ts.Close() 91 92 removeHook := helpers.MakeFatalToPanic() 93 defer removeHook() 94 os.Remove(cacheExtractorArchive) 95 cmd := CacheArchiverCommand{ 96 File: cacheExtractorArchive, 97 URL: ts.URL + "/cache.zip", 98 Timeout: 0, 99 } 100 assert.NotPanics(t, func() { 101 cmd.Execute(nil) 102 }) 103 } 104 105 func TestCacheArchiverRemoteServerTimedOut(t *testing.T) { 106 ts := httptest.NewServer(http.HandlerFunc(testCacheUploadHandler)) 107 defer ts.Close() 108 109 output := logrus.StandardLogger().Out 110 var buf bytes.Buffer 111 logrus.SetOutput(&buf) 112 defer logrus.SetOutput(output) 113 removeHook := helpers.MakeFatalToPanic() 114 defer removeHook() 115 116 os.Remove(cacheExtractorArchive) 117 cmd := CacheArchiverCommand{ 118 File: cacheExtractorArchive, 119 URL: ts.URL + "/timeout", 120 } 121 cmd.getClient().Timeout = 1 * time.Millisecond 122 123 assert.Panics(t, func() { 124 cmd.Execute(nil) 125 }) 126 assert.Contains(t, buf.String(), "net/http: request canceled (Client.Timeout") 127 } 128 129 func TestCacheArchiverRemoteServerFailOnInvalidServer(t *testing.T) { 130 removeHook := helpers.MakeFatalToPanic() 131 defer removeHook() 132 os.Remove(cacheExtractorArchive) 133 cmd := CacheArchiverCommand{ 134 File: cacheExtractorArchive, 135 URL: "http://localhost:65333/cache.zip", 136 Timeout: 0, 137 } 138 assert.Panics(t, func() { 139 cmd.Execute(nil) 140 }) 141 142 _, err := os.Stat(cacheExtractorTestArchivedFile) 143 assert.Error(t, err) 144 }