github.com/ssube/gitlab-ci-multi-runner@v1.2.1-0.20160607142738-b8d1285632e6/commands/helpers/cache_archiver_test.go (about)

     1  package helpers
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  	"gitlab.com/gitlab-org/gitlab-ci-multi-runner/helpers"
     8  	"io/ioutil"
     9  	"net/http"
    10  	"net/http/httptest"
    11  	"os"
    12  	"time"
    13  )
    14  
    15  const cacheArchiverArchive = "archive.zip"
    16  const cacheArchiverTestArchivedFile = "archive_file"
    17  
    18  func TestCacheArchiverIsUpToDate(t *testing.T) {
    19  	ioutil.WriteFile(cacheArchiverTestArchivedFile, nil, 0600)
    20  	defer os.Remove(cacheArchiverTestArchivedFile)
    21  
    22  	defer os.Remove(cacheArchiverArchive)
    23  	cmd := CacheArchiverCommand{
    24  		File: cacheArchiverArchive,
    25  		fileArchiver: fileArchiver{
    26  			Paths: []string{
    27  				cacheArchiverTestArchivedFile,
    28  			},
    29  		},
    30  	}
    31  	cmd.Execute(nil)
    32  	fi, _ := os.Stat(cacheArchiverArchive)
    33  	cmd.Execute(nil)
    34  	fi2, _ := os.Stat(cacheArchiverArchive)
    35  	assert.Equal(t, fi.ModTime(), fi2.ModTime(), "archive is up to date")
    36  
    37  	// We need to wait one second, since the FS doesn't save milliseconds
    38  	time.Sleep(time.Second)
    39  
    40  	os.Chtimes(cacheArchiverTestArchivedFile, time.Now(), time.Now())
    41  	cmd.Execute(nil)
    42  	fi3, _ := os.Stat(cacheArchiverArchive)
    43  	assert.NotEqual(t, fi.ModTime(), fi3.ModTime(), "archive should get updated")
    44  }
    45  
    46  func TestCacheArchiverForIfNoFileDefined(t *testing.T) {
    47  	helpers.MakeFatalToPanic()
    48  	cmd := CacheArchiverCommand{}
    49  	assert.Panics(t, func() {
    50  		cmd.Execute(nil)
    51  	})
    52  }
    53  
    54  func testCacheUploadHandler(w http.ResponseWriter, r *http.Request) {
    55  	if r.Method != "PUT" {
    56  		http.Error(w, "408 Method not allowed", 408)
    57  		return
    58  	}
    59  	if r.URL.Path != "/cache.zip" {
    60  		http.NotFound(w, r)
    61  		return
    62  	}
    63  }
    64  
    65  func TestCacheArchiverRemoteServerNotFound(t *testing.T) {
    66  	ts := httptest.NewServer(http.HandlerFunc(testCacheUploadHandler))
    67  	defer ts.Close()
    68  
    69  	helpers.MakeFatalToPanic()
    70  	os.Remove(cacheExtractorArchive)
    71  	cmd := CacheArchiverCommand{
    72  		File: cacheExtractorArchive,
    73  		URL:  ts.URL + "/invalid-file.zip",
    74  	}
    75  	assert.NotPanics(t, func() {
    76  		cmd.Execute(nil)
    77  	})
    78  }
    79  
    80  func TestCacheArchiverRemoteServe(t *testing.T) {
    81  	ts := httptest.NewServer(http.HandlerFunc(testCacheUploadHandler))
    82  	defer ts.Close()
    83  
    84  	helpers.MakeFatalToPanic()
    85  	os.Remove(cacheExtractorArchive)
    86  	cmd := CacheArchiverCommand{
    87  		File: cacheExtractorArchive,
    88  		URL:  ts.URL + "/cache.zip",
    89  	}
    90  	assert.NotPanics(t, func() {
    91  		cmd.Execute(nil)
    92  	})
    93  }
    94  
    95  func TestCacheArchiverRemoteServerDoesntFailOnInvalidServer(t *testing.T) {
    96  	helpers.MakeFatalToPanic()
    97  	os.Remove(cacheExtractorArchive)
    98  	cmd := CacheArchiverCommand{
    99  		File: cacheExtractorArchive,
   100  		URL:  "http://localhost:65333/cache.zip",
   101  	}
   102  	assert.NotPanics(t, func() {
   103  		cmd.Execute(nil)
   104  	})
   105  
   106  	_, err := os.Stat(cacheExtractorTestArchivedFile)
   107  	assert.Error(t, err)
   108  }