diff --git a/proxy_test.go b/proxy_test.go index 5187121..dfd696c 100644 --- a/proxy_test.go +++ b/proxy_test.go @@ -12,8 +12,42 @@ import ( "github.com/golang-jwt/jwt/v4" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" ) +type ProxyTests struct { + suite.Suite + S3conf S3Config + fakeServer *FakeServer + messenger *MockMessenger +} + +func TestProxyTestSuite(t *testing.T) { + suite.Run(t, new(ProxyTests)) +} + +func (suite *ProxyTests) SetupTest() { + + // Create fake server + suite.fakeServer = startFakeServer("9024") + + // Create an s3config for the fake server + suite.S3conf = S3Config{ + url: "http://localhost:9024", + accessKey: "someAccess", + secretKey: "someSecret", + bucket: "buckbuck", + region: "us-east-1", + } + + // Create a mock messenger + suite.messenger = NewMockMessenger() +} + +func (suite *ProxyTests) TearDownTest() { + suite.fakeServer.Close() +} + type FakeServer struct { ts *httptest.Server resp string @@ -84,20 +118,10 @@ func (u *AlwaysDeny) Authenticate(r *http.Request) (jwt.MapClaims, error) { } // nolint:bodyclose -func TestServeHTTP_disallowed(t *testing.T) { - // Start fake server - f := startFakeServer("9023") - defer f.Close() +func (suite *ProxyTests) TestServeHTTP_disallowed() { - s3conf := S3Config{ - url: "http://localhost:9023", - accessKey: "someAccess", - secretKey: "someSecret", - bucket: "buckbuck", - region: "us-east-1", - } - messenger := NewMockMessenger() - proxy := NewProxy(s3conf, &AlwaysDeny{}, messenger, new(tls.Config)) + // Start mock messenger that denies everything + proxy := NewProxy(suite.S3conf, &AlwaysDeny{}, suite.messenger, new(tls.Config)) r, _ := http.NewRequest("", "", nil) w := httptest.NewRecorder() @@ -106,65 +130,65 @@ func TestServeHTTP_disallowed(t *testing.T) { r.Method = "DELETE" r.URL, _ = url.Parse("/asdf/") proxy.ServeHTTP(w, r) - assert.Equal(t, 403, w.Result().StatusCode) - assert.Equal(t, false, f.PingedAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 403, w.Result().StatusCode) + assert.Equal(suite.T(), false, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) // Deletion of files are disallowed r.Method = "DELETE" r.URL, _ = url.Parse("/asdf/asdf") proxy.ServeHTTP(w, r) - assert.Equal(t, 403, w.Result().StatusCode) - assert.Equal(t, false, f.PingedAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 403, w.Result().StatusCode) + assert.Equal(suite.T(), false, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) // Policy methods are not allowed w = httptest.NewRecorder() r.Method = "GET" r.URL, _ = url.Parse("/asdf?acl=rw") proxy.ServeHTTP(w, r) - assert.Equal(t, 403, w.Result().StatusCode) - assert.Equal(t, false, f.PingedAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 403, w.Result().StatusCode) + assert.Equal(suite.T(), false, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) // Normal get is dissallowed w = httptest.NewRecorder() r.Method = "GET" r.URL, _ = url.Parse("/asdf/") proxy.ServeHTTP(w, r) - assert.Equal(t, 403, w.Result().StatusCode) - assert.Equal(t, false, f.PingedAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 403, w.Result().StatusCode) + assert.Equal(suite.T(), false, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) // Put policy is disallowed w = httptest.NewRecorder() r.Method = "PUT" r.URL, _ = url.Parse("/asdf?policy=rw") proxy.ServeHTTP(w, r) - assert.Equal(t, 403, w.Result().StatusCode) - assert.Equal(t, false, f.PingedAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 403, w.Result().StatusCode) + assert.Equal(suite.T(), false, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) // Create bucket disallowed w = httptest.NewRecorder() r.Method = "PUT" r.URL, _ = url.Parse("/asdf/") proxy.ServeHTTP(w, r) - assert.Equal(t, 403, w.Result().StatusCode) - assert.Equal(t, false, f.PingedAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 403, w.Result().StatusCode) + assert.Equal(suite.T(), false, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) // Not authorized user get 401 response w = httptest.NewRecorder() r.Method = "GET" r.URL, _ = url.Parse("/username/file") proxy.ServeHTTP(w, r) - assert.Equal(t, 401, w.Result().StatusCode) - assert.Equal(t, false, f.PingedAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 401, w.Result().StatusCode) + assert.Equal(suite.T(), false, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) } -func TestServeHTTP_S3Unresponsive(t *testing.T) { +func (suite *ProxyTests) TestServeHTTPS3Unresponsive() { s3conf := S3Config{ url: "http://localhost:40211", accessKey: "someAccess", @@ -172,8 +196,7 @@ func TestServeHTTP_S3Unresponsive(t *testing.T) { bucket: "buckbuck", region: "us-east-1", } - messenger := NewMockMessenger() - proxy := NewProxy(s3conf, &AlwaysAllow{}, messenger, new(tls.Config)) + proxy := NewProxy(s3conf, &AlwaysAllow{}, suite.messenger, new(tls.Config)) r, _ := http.NewRequest("", "", nil) w := httptest.NewRecorder() @@ -182,81 +205,70 @@ func TestServeHTTP_S3Unresponsive(t *testing.T) { r.Method = "GET" r.URL, _ = url.Parse("/asdf/asdf") proxy.ServeHTTP(w, r) - assert.Equal(t, 500, w.Result().StatusCode) // nolint:bodyclose - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 500, w.Result().StatusCode) // nolint:bodyclose + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) } // nolint:bodyclose -func TestServeHTTP_allowed(t *testing.T) { - // Start fake server - f := startFakeServer("9024") - defer f.Close() +func (suite *ProxyTests) TestServeHTTP_allowed() { - // Start proxy - s3conf := S3Config{ - url: "http://localhost:9024", - accessKey: "someAccess", - secretKey: "someSecret", - bucket: "buckbuck", - region: "us-east-1", - } - messenger := NewMockMessenger() - proxy := NewProxy(s3conf, NewAlwaysAllow(), messenger, new(tls.Config)) + // Start proxy that allows everything + proxy := NewProxy(suite.S3conf, NewAlwaysAllow(), suite.messenger, new(tls.Config)) // List files works r, _ := http.NewRequest("GET", "/username/file", nil) w := httptest.NewRecorder() proxy.ServeHTTP(w, r) - assert.Equal(t, 200, w.Result().StatusCode) - assert.Equal(t, true, f.PingedAndRestore()) - assert.Equal(t, false, f.PingedAndRestore()) // Testing the pinged interface - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 200, w.Result().StatusCode) + assert.Equal(suite.T(), true, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.fakeServer.PingedAndRestore()) // Testing the pinged interface + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) // Put file works w = httptest.NewRecorder() r.Method = "PUT" - f.resp = "test/elixirid/file.txt12false/elixirid/file.txt2020-03-10T13:20:15.000Z"0a44282bd39178db9680f24813c41aec-1"5STANDARD" + suite.fakeServer.resp = "test/elixirid/file.txt12false/elixirid/file.txt2020-03-10T13:20:15.000Z"0a44282bd39178db9680f24813c41aec-1"5STANDARD" proxy.ServeHTTP(w, r) - assert.Equal(t, 200, w.Result().StatusCode) - assert.Equal(t, true, f.PingedAndRestore()) - assert.Equal(t, true, messenger.CheckAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 200, w.Result().StatusCode) + assert.Equal(suite.T(), true, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), true, suite.messenger.CheckAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) // Put with partnumber sends no message w = httptest.NewRecorder() r.Method = "PUT" r.URL, _ = url.Parse("/username/file?partNumber=5") proxy.ServeHTTP(w, r) - assert.Equal(t, 200, w.Result().StatusCode) - assert.Equal(t, true, f.PingedAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 200, w.Result().StatusCode) + assert.Equal(suite.T(), true, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) // Post with uploadId sends message r.Method = "POST" r.URL, _ = url.Parse("/username/file?uploadId=5") w = httptest.NewRecorder() proxy.ServeHTTP(w, r) - assert.Equal(t, 200, w.Result().StatusCode) - assert.Equal(t, true, f.PingedAndRestore()) - assert.Equal(t, true, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 200, w.Result().StatusCode) + assert.Equal(suite.T(), true, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), true, suite.messenger.CheckAndRestore()) // Post without uploadId sends no message r.Method = "POST" r.URL, _ = url.Parse("/username/file") w = httptest.NewRecorder() proxy.ServeHTTP(w, r) - assert.Equal(t, 200, w.Result().StatusCode) - assert.Equal(t, true, f.PingedAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 200, w.Result().StatusCode) + assert.Equal(suite.T(), true, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) // Abort multipart works r.Method = "DELETE" r.URL, _ = url.Parse("/asdf/asdf?uploadId=123") w = httptest.NewRecorder() proxy.ServeHTTP(w, r) - assert.Equal(t, 200, w.Result().StatusCode) - assert.Equal(t, true, f.PingedAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 200, w.Result().StatusCode) + assert.Equal(suite.T(), true, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) // Going through the different extra stuff that can be in the get request // that trigger different code paths in the code. @@ -265,31 +277,30 @@ func TestServeHTTP_allowed(t *testing.T) { r.URL, _ = url.Parse("/username/file?delimiter=puppe") w = httptest.NewRecorder() proxy.ServeHTTP(w, r) - assert.Equal(t, 200, w.Result().StatusCode) - assert.Equal(t, true, f.PingedAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 200, w.Result().StatusCode) + assert.Equal(suite.T(), true, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) // Delimiter alone together with prefix r.Method = "GET" r.URL, _ = url.Parse("/username/file?delimiter=puppe&prefix=asdf") w = httptest.NewRecorder() proxy.ServeHTTP(w, r) - assert.Equal(t, 200, w.Result().StatusCode) - assert.Equal(t, true, f.PingedAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 200, w.Result().StatusCode) + assert.Equal(suite.T(), true, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) // Location parameter r.Method = "GET" r.URL, _ = url.Parse("/username/file?location=fnuffe") w = httptest.NewRecorder() proxy.ServeHTTP(w, r) - assert.Equal(t, 200, w.Result().StatusCode) - assert.Equal(t, true, f.PingedAndRestore()) - assert.Equal(t, false, messenger.CheckAndRestore()) + assert.Equal(suite.T(), 200, w.Result().StatusCode) + assert.Equal(suite.T(), true, suite.fakeServer.PingedAndRestore()) + assert.Equal(suite.T(), false, suite.messenger.CheckAndRestore()) } -func TestMessageFormatting(t *testing.T) { - f := startFakeServer("9023") +func (suite *ProxyTests) TestMessageFormatting() { // Set up basic request for multipart upload r, _ := http.NewRequest("POST", "/buckbuck/user/new_file.txt", nil) r.Host = "localhost" @@ -299,34 +310,27 @@ func TestMessageFormatting(t *testing.T) { claims := jwt.MapClaims{} claims["sub"] = "user@host.domain" - s3conf := S3Config{ - url: "http://localhost:9023", - accessKey: "someAccess", - secretKey: "someSecret", - bucket: "buckbuck", - region: "us-east-1", - } - messenger := NewMockMessenger() - proxy := NewProxy(s3conf, &AlwaysDeny{}, messenger, new(tls.Config)) - f.resp = "test/user/new_file.txt12false/user/new_file.txt2020-03-10T13:20:15.000Z"0a44282bd39178db9680f24813c41aec-1"1234STANDARD" + // start proxy that denies everything + proxy := NewProxy(suite.S3conf, &AlwaysDeny{}, suite.messenger, new(tls.Config)) + suite.fakeServer.resp = "test/user/new_file.txt12false/user/new_file.txt2020-03-10T13:20:15.000Z"0a44282bd39178db9680f24813c41aec-1"1234STANDARD" msg, err := proxy.CreateMessageFromRequest(r, claims) - assert.Nil(t, err) - assert.IsType(t, Event{}, msg) + assert.Nil(suite.T(), err) + assert.IsType(suite.T(), Event{}, msg) - assert.Equal(t, int64(1234), msg.Filesize) - assert.Equal(t, "user/new_file.txt", msg.Filepath) - assert.Equal(t, "user@host.domain", msg.Username) + assert.Equal(suite.T(), int64(1234), msg.Filesize) + assert.Equal(suite.T(), "user/new_file.txt", msg.Filepath) + assert.Equal(suite.T(), "user@host.domain", msg.Username) c, _ := json.Marshal(msg.Checksum[0]) checksum := Checksum{} _ = json.Unmarshal(c, &checksum) - assert.Equal(t, "sha256", checksum.Type) - assert.Equal(t, "5b233b981dc12e7ccf4c242b99c042b7842b73b956ad662e4fe0f8354151538b", checksum.Value) + assert.Equal(suite.T(), "sha256", checksum.Type) + assert.Equal(suite.T(), "5b233b981dc12e7ccf4c242b99c042b7842b73b956ad662e4fe0f8354151538b", checksum.Value) // Test single shot upload r.Method = "PUT" msg, err = proxy.CreateMessageFromRequest(r, nil) - assert.Nil(t, err) - assert.IsType(t, Event{}, msg) - assert.Equal(t, "upload", msg.Operation) + assert.Nil(suite.T(), err) + assert.IsType(suite.T(), Event{}, msg) + assert.Equal(suite.T(), "upload", msg.Operation) }