From d414ef0d0f42d85b25e67a3f25127ca68eee1b67 Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Sat, 10 Oct 2015 19:53:11 -0600 Subject: [PATCH] browse: Fix tests that fail only in CI environment ... I think. Submitting as PR to double-check. This change changes file mod times on the testdata to ensure they are not all the same so that the sort is predictable! --- middleware/browse/browse_test.go | 51 ++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/middleware/browse/browse_test.go b/middleware/browse/browse_test.go index 1e461bea..44ac4d8a 100644 --- a/middleware/browse/browse_test.go +++ b/middleware/browse/browse_test.go @@ -2,15 +2,17 @@ package browse import ( "encoding/json" - "github.com/mholt/caddy/middleware" "net/http" "net/http/httptest" "net/url" "os" + "path/filepath" "sort" "testing" "text/template" "time" + + "github.com/mholt/caddy/middleware" ) // "sort" package has "IsSorted" function, but no "IsReversed"; @@ -177,13 +179,12 @@ func TestBrowseJson(t *testing.T) { } //Getting the listing from the ./testdata/photos, the listing returned will be used to validate test results - file, err := os.Open(b.Root + "/photos") + testDataPath := b.Root + "/photos/" + file, err := os.Open(testDataPath) if err != nil { if os.IsPermission(err) { t.Fatalf("Os Permission Error") - } - } defer file.Close() @@ -193,9 +194,17 @@ func TestBrowseJson(t *testing.T) { } var fileinfos []FileInfo - for _, f := range files { + for i, f := range files { name := f.Name() + // Tests fail in CI environment because all file mod times are the same for + // some reason, making the sorting unpredictable. To hack around this, + // we ensure here that each file has a different mod time. + chTime := f.ModTime().Add(-(time.Duration(i) * time.Second)) + if err := os.Chtimes(filepath.Join(testDataPath, name), chTime, chTime); err != nil { + t.Fatal(err) + } + if f.IsDir() { name += "/" } @@ -207,14 +216,11 @@ func TestBrowseJson(t *testing.T) { Name: f.Name(), Size: f.Size(), URL: url.String(), - ModTime: f.ModTime(), + ModTime: chTime, Mode: f.Mode(), }) } - listing := Listing{ - Items: fileinfos, - } - //listing obtained above and will be used for validation inside the tests + listing := Listing{Items: fileinfos} // this listing will be used for validation inside the tests tests := []struct { QueryUrl string @@ -231,27 +237,27 @@ func TestBrowseJson(t *testing.T) { {"/?limit=1", "", "", 1, false, listing.Items[:1]}, //test case 3 : if the listing request is bigger than total size of listing then it should return everything {"/?limit=100000000", "", "", 100000000, false, listing.Items}, - //testing for negative limit + //test case 4 : testing for negative limit {"/?limit=-1", "", "", -1, false, listing.Items}, - //testing with limit set to -1 and order set to descending + //test case 5 : testing with limit set to -1 and order set to descending {"/?limit=-1&order=desc", "", "desc", -1, false, listing.Items}, - //testing with limit set to 2 and order set to descending + //test case 6 : testing with limit set to 2 and order set to descending {"/?limit=2&order=desc", "", "desc", 2, false, listing.Items}, - //testing with limit set to 3 and order set to descending + //test case 7 : testing with limit set to 3 and order set to descending {"/?limit=3&order=desc", "", "desc", 3, false, listing.Items}, - //testing with limit set to 3 and order set to ascending + //test case 8 : testing with limit set to 3 and order set to ascending {"/?limit=3&order=asc", "", "asc", 3, false, listing.Items}, - //testing with limit set to 1111111 and order set to ascending + //test case 9 : testing with limit set to 1111111 and order set to ascending {"/?limit=1111111&order=asc", "", "asc", 1111111, false, listing.Items}, - //testing with limit set to default and order set to ascending and sorting by size + //test case 10 : testing with limit set to default and order set to ascending and sorting by size {"/?order=asc&sort=size", "size", "asc", -1, false, listing.Items}, - //testing with limit set to default and order set to ascending and sorting by last modified + //test case 11 : testing with limit set to default and order set to ascending and sorting by last modified {"/?order=asc&sort=time", "time", "asc", -1, false, listing.Items}, - //testing with limit set to 1 and order set to ascending and sorting by last modified + //test case 12 : testing with limit set to 1 and order set to ascending and sorting by last modified {"/?order=asc&sort=time&limit=1", "time", "asc", 1, false, listing.Items}, - //testing with limit set to -100 and order set to ascending and sorting by last modified + //test case 13 : testing with limit set to -100 and order set to ascending and sorting by last modified {"/?order=asc&sort=time&limit=-100", "time", "asc", -100, false, listing.Items}, - //testing with limit set to -100 and order set to ascending and sorting by size + //test case 14 : testing with limit set to -100 and order set to ascending and sorting by size {"/?order=asc&sort=size&limit=-100", "size", "asc", -100, false, listing.Items}, } @@ -305,7 +311,8 @@ func TestBrowseJson(t *testing.T) { expectedJsonString := string(marsh) if actualJsonResponseString != expectedJsonString { - t.Errorf("Json response string doesnt match the expected Json response for test number %d with sort = %s , order = %s,\nExpected response %s\nActual response = %s\n ", i+1, test.SortBy, test.OrderBy, expectedJsonString, actualJsonResponseString) + t.Errorf("JSON response doesn't match the expected for test number %d with sort=%s, order=%s\nExpected response %s\nActual response = %s\n", + i+1, test.SortBy, test.OrderBy, expectedJsonString, actualJsonResponseString) } }