diff --git a/handlers_test.go b/handlers_test.go index 48518ca..4ebd195 100644 --- a/handlers_test.go +++ b/handlers_test.go @@ -165,8 +165,7 @@ func createOverwriteDeleteSeq(t testing.TB, path string, data string) []TestRequ return req } -// TestResticAppendOnlyHandler runs tests on the restic handler code, especially in append-only mode. -func TestResticAppendOnlyHandler(t *testing.T) { +func createTestHandler(t *testing.T, conf Server) (http.Handler, string, string, string, func()) { buf := make([]byte, 32) _, err := io.ReadFull(rand.Reader, buf) if err != nil { @@ -176,6 +175,38 @@ func TestResticAppendOnlyHandler(t *testing.T) { dataHash := sha256.Sum256([]byte(data)) fileID := hex.EncodeToString(dataHash[:]) + // setup the server with a local backend in a temporary directory + tempdir, err := ioutil.TempDir("", "rest-server-test-") + if err != nil { + t.Fatal(err) + } + + // make sure the tempdir is properly removed + cleanup := func() { + err := os.RemoveAll(tempdir) + if err != nil { + t.Fatal(err) + } + } + + conf.Path = tempdir + mux, err := NewHandler(&conf) + if err != nil { + t.Fatalf("error from NewHandler: %v", err) + } + return mux, data, fileID, tempdir, cleanup +} + +// TestResticAppendOnlyHandler runs tests on the restic handler code, especially in append-only mode. +func TestResticAppendOnlyHandler(t *testing.T) { + mux, data, fileID, _, cleanup := createTestHandler(t, Server{ + AppendOnly: true, + NoAuth: true, + Debug: true, + PanicOnError: true, + }) + defer cleanup() + var tests = []struct { seq []TestRequest }{ @@ -227,32 +258,6 @@ func TestResticAppendOnlyHandler(t *testing.T) { {createOverwriteDeleteSeq(t, "/parent2/data/"+fileID, data)}, } - // setup the server with a local backend in a temporary directory - tempdir, err := ioutil.TempDir("", "rest-server-test-") - if err != nil { - t.Fatal(err) - } - - // make sure the tempdir is properly removed - defer func() { - err := os.RemoveAll(tempdir) - if err != nil { - t.Fatal(err) - } - }() - - // set append-only mode and configure path - mux, err := NewHandler(&Server{ - AppendOnly: true, - Path: tempdir, - NoAuth: true, - Debug: true, - PanicOnError: true, - }) - if err != nil { - t.Fatalf("error from NewHandler: %v", err) - } - // create the repos for _, path := range []string{"/", "/parent1/sub1/", "/parent1/", "/parent2/"} { checkRequest(t, mux.ServeHTTP, @@ -295,14 +300,12 @@ func createIdempotentDeleteSeq(t testing.TB, path string, data string) []TestReq // TestResticHandler runs tests on the restic handler code, especially in append-only mode. func TestResticHandler(t *testing.T) { - buf := make([]byte, 32) - _, err := io.ReadFull(rand.Reader, buf) - if err != nil { - t.Fatal(err) - } - data := "random data file " + hex.EncodeToString(buf) - dataHash := sha256.Sum256([]byte(data)) - fileID := hex.EncodeToString(dataHash[:]) + mux, data, fileID, _, cleanup := createTestHandler(t, Server{ + NoAuth: true, + Debug: true, + PanicOnError: true, + }) + defer cleanup() var tests = []struct { seq []TestRequest @@ -311,31 +314,6 @@ func TestResticHandler(t *testing.T) { {createIdempotentDeleteSeq(t, "/data/"+fileID, data)}, } - // setup the server with a local backend in a temporary directory - tempdir, err := ioutil.TempDir("", "rest-server-test-") - if err != nil { - t.Fatal(err) - } - - // make sure the tempdir is properly removed - defer func() { - err := os.RemoveAll(tempdir) - if err != nil { - t.Fatal(err) - } - }() - - // set append-only mode and configure path - mux, err := NewHandler(&Server{ - Path: tempdir, - NoAuth: true, - Debug: true, - PanicOnError: true, - }) - if err != nil { - t.Fatalf("error from NewHandler: %v", err) - } - // create the repo checkRequest(t, mux.ServeHTTP, newRequest(t, "POST", "/?create=true", nil), @@ -353,6 +331,13 @@ func TestResticHandler(t *testing.T) { // TestResticErrorHandler runs tests on the restic handler error handling. func TestResticErrorHandler(t *testing.T) { + mux, _, _, tempdir, cleanup := createTestHandler(t, Server{ + AppendOnly: true, + NoAuth: true, + Debug: true, + }) + defer cleanup() + var tests = []struct { seq []TestRequest }{ @@ -371,31 +356,6 @@ func TestResticErrorHandler(t *testing.T) { }, } - // setup the server with a local backend in a temporary directory - tempdir, err := ioutil.TempDir("", "rest-server-test-") - if err != nil { - t.Fatal(err) - } - - // make sure the tempdir is properly removed - defer func() { - err := os.RemoveAll(tempdir) - if err != nil { - t.Fatal(err) - } - }() - - // set append-only mode and configure path - mux, err := NewHandler(&Server{ - AppendOnly: true, - Path: tempdir, - NoAuth: true, - Debug: true, - }) - if err != nil { - t.Fatalf("error from NewHandler: %v", err) - } - // create the repo checkRequest(t, mux.ServeHTTP, newRequest(t, "POST", "/?create=true", nil), @@ -404,7 +364,7 @@ func TestResticErrorHandler(t *testing.T) { checkRequest(t, mux.ServeHTTP, newRequest(t, "POST", "/config", strings.NewReader("example")), []wantFunc{wantCode(http.StatusOK)}) - err = os.Chmod(path.Join(tempdir, "config"), 0o000) + err := os.Chmod(path.Join(tempdir, "config"), 0o000) if err != nil { t.Fatal(err) } @@ -509,31 +469,13 @@ func (d *delayErrorReader) Read(p []byte) (int, error) { // TestAbortedRequest runs tests with concurrent upload requests for the same file. func TestAbortedRequest(t *testing.T) { - // setup the server with a local backend in a temporary directory - tempdir, err := ioutil.TempDir("", "rest-server-test-") - if err != nil { - t.Fatal(err) - } - - // make sure the tempdir is properly removed - defer func() { - err := os.RemoveAll(tempdir) - if err != nil { - t.Fatal(err) - } - }() - - // configure path, the race condition doesn't happen for append-only repositories - mux, err := NewHandler(&Server{ - AppendOnly: false, - Path: tempdir, + // the race condition doesn't happen for append-only repositories + mux, _, _, _, cleanup := createTestHandler(t, Server{ NoAuth: true, Debug: true, PanicOnError: true, }) - if err != nil { - t.Fatalf("error from NewHandler: %v", err) - } + defer cleanup() // create the repo checkRequest(t, mux.ServeHTTP,