From 80eec6ae3ab686287b0afecbb3aadf84badf85ed Mon Sep 17 00:00:00 2001 From: Jannis Mattheis Date: Tue, 6 Nov 2018 20:58:35 +0100 Subject: [PATCH] Remove monkey dependency --- Gopkg.lock | 8 +------- Makefile | 2 +- api/message.go | 4 +++- api/message_test.go | 18 +++++++++--------- api/stream/client.go | 12 ++++++++++-- api/stream/stream_test.go | 31 ++++++++++++++++--------------- api/token_test.go | 13 +++---------- database/database.go | 4 +++- database/database_test.go | 13 +++++-------- 9 files changed, 51 insertions(+), 54 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index a2e7114..03dabeb 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -7,12 +7,6 @@ revision = "b26d9c308763d68093482582cea63d69be07a0f0" version = "v0.3.0" -[[projects]] - branch = "master" - name = "github.com/bouk/monkey" - packages = ["."] - revision = "b96e337f6e5b36906584cd0cf9803bbab09284f7" - [[projects]] name = "github.com/davecgh/go-spew" packages = ["spew"] @@ -203,6 +197,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "272b085d12075d5deae7a7eac7472448f76f798644d80b17a4c6a4d5c7a8cfe9" + inputs-digest = "dd487dcd1de5f16454e33fbf7d886d98272b1b9d78052a17ad785efba4f9c17b" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Makefile b/Makefile index 4dad9d0..dc9ed95 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,7 @@ check-swagger: update-swagger extract-licenses: mkdir ${LICENSE_DIR} || true - for LICENSE in $(shell find vendor/* -name LICENSE | grep -v monkey); do \ + for LICENSE in $(shell find vendor/* -name LICENSE); do \ DIR=`echo $$LICENSE | tr "/" _ | sed -e 's/vendor_//; s/_LICENSE//'` ; \ cp $$LICENSE ${LICENSE_DIR}$$DIR ; \ done diff --git a/api/message.go b/api/message.go index a1085eb..7429496 100644 --- a/api/message.go +++ b/api/message.go @@ -26,6 +26,8 @@ type MessageDatabase interface { GetApplicationByToken(token string) *model.Application } +var timeNow = time.Now + // Notifier notifies when a new message was created. type Notifier interface { Notify(userID uint, message *model.Message) @@ -128,7 +130,7 @@ func (a *MessageAPI) CreateMessage(ctx *gin.Context) { message := model.Message{} if err := ctx.Bind(&message); err == nil { message.ApplicationID = a.DB.GetApplicationByToken(auth.GetTokenID(ctx)).ID - message.Date = time.Now() + message.Date = timeNow() a.DB.CreateMessage(&message) a.Notifier.Notify(auth.GetUserID(ctx), &message) ctx.JSON(200, message) diff --git a/api/message_test.go b/api/message_test.go index 1a9bff4..8ba49ca 100644 --- a/api/message_test.go +++ b/api/message_test.go @@ -16,7 +16,6 @@ import ( "net/url" - "github.com/bouk/monkey" "github.com/gotify/server/auth" ) @@ -314,8 +313,9 @@ func (s *MessageSuite) Test_DeleteMessages() { func (s *MessageSuite) Test_CreateMessage_onJson_allParams() { t, _ := time.Parse("2006/01/02", "2017/01/02") - patch := monkey.Patch(time.Now, func() time.Time { return t }) - defer patch.Unpatch() + + timeNow = func() time.Time { return t } + defer func() { timeNow = time.Now }() auth.RegisterAuthentication(s.ctx, nil, 4, "app-token") s.db.User(4).AppWithToken(7, "app-token") @@ -334,8 +334,8 @@ func (s *MessageSuite) Test_CreateMessage_onJson_allParams() { func (s *MessageSuite) Test_CreateMessage_onlyRequired() { t, _ := time.Parse("2006/01/02", "2017/01/02") - patch := monkey.Patch(time.Now, func() time.Time { return t }) - defer patch.Unpatch() + timeNow = func() time.Time { return t } + defer func() { timeNow = time.Now }() auth.RegisterAuthentication(s.ctx, nil, 4, "app-token") s.db.User(4).AppWithToken(5, "app-token") @@ -399,8 +399,8 @@ func (s *MessageSuite) Test_CreateMessage_onQueryData() { s.db.User(4).AppWithToken(2, "app-token") t, _ := time.Parse("2006/01/02", "2017/01/02") - patch := monkey.Patch(time.Now, func() time.Time { return t }) - defer patch.Unpatch() + timeNow = func() time.Time { return t } + defer func() { timeNow = time.Now }() s.ctx.Request = httptest.NewRequest("POST", "/token?title=mytitle&message=mymessage&priority=1", nil) s.ctx.Request.Header.Set("Content-Type", "application/x-www-form-urlencoded") @@ -421,8 +421,8 @@ func (s *MessageSuite) Test_CreateMessage_onFormData() { s.db.User(4).AppWithToken(99, "app-token") t, _ := time.Parse("2006/01/02", "2017/01/02") - patch := monkey.Patch(time.Now, func() time.Time { return t }) - defer patch.Unpatch() + timeNow = func() time.Time { return t } + defer func() { timeNow = time.Now }() s.ctx.Request = httptest.NewRequest("POST", "/token", strings.NewReader("title=mytitle&message=mymessage&priority=1")) s.ctx.Request.Header.Set("Content-Type", "application/x-www-form-urlencoded") diff --git a/api/stream/client.go b/api/stream/client.go index d123483..f2ff896 100644 --- a/api/stream/client.go +++ b/api/stream/client.go @@ -12,6 +12,14 @@ const ( writeWait = 2 * time.Second ) +var ping = func(conn *websocket.Conn) error { + return conn.WriteMessage(websocket.PingMessage, nil) +} + +var writeJSON = func(conn *websocket.Conn, v interface{}) error { + return conn.WriteJSON(v) +} + type client struct { conn *websocket.Conn onClose func(*client) @@ -84,12 +92,12 @@ func (c *client) startWriteHandler(pingPeriod time.Duration) { } c.conn.SetWriteDeadline(time.Now().Add(writeWait)) - if err := c.conn.WriteJSON(message); err != nil { + if err := writeJSON(c.conn, message); err != nil { return } case <-pingTicker.C: c.conn.SetWriteDeadline(time.Now().Add(writeWait)) - if err := c.conn.WriteMessage(websocket.PingMessage, nil); err != nil { + if err := ping(c.conn); err != nil { return } } diff --git a/api/stream/stream_test.go b/api/stream/stream_test.go index 601484f..fd680f5 100644 --- a/api/stream/stream_test.go +++ b/api/stream/stream_test.go @@ -10,11 +10,8 @@ import ( "testing" "time" - "reflect" - "errors" - "github.com/bouk/monkey" "github.com/fortytw2/leaktest" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" @@ -41,7 +38,14 @@ func TestFailureOnNormalHttpRequest(t *testing.T) { func TestWriteMessageFails(t *testing.T) { mode.Set(mode.TestDev) - + oldWrite := writeJSON + // try emulate an write error, mostly this should kill the ReadMessage goroutine first but you'll never know. + writeJSON = func(conn *websocket.Conn, v interface{}) error { + return errors.New("asd") + } + defer func() { + writeJSON = oldWrite + }() defer leaktest.Check(t)() server, api := bootTestServer(func(context *gin.Context) { @@ -58,18 +62,20 @@ func TestWriteMessageFails(t *testing.T) { clients := clients(api, 1) assert.NotEmpty(t, clients) - // try emulate an write error, mostly this should kill the ReadMessage goroutine first but you'll never know. - patch := monkey.PatchInstanceMethod(reflect.TypeOf(clients[0].conn), "WriteJSON", func(*websocket.Conn, interface{}) error { - return errors.New("could not do something") - }) - defer patch.Unpatch() - api.Notify(1, &model.Message{Message: "HI"}) user.expectNoMessage() } func TestWritePingFails(t *testing.T) { mode.Set(mode.TestDev) + oldPing := ping + // try emulate an write error, mostly this should kill the ReadMessage gorouting first but you'll never know. + ping = func(conn *websocket.Conn) error { + return errors.New("asd") + } + defer func() { + ping = oldPing + }() defer leaktest.CheckTimeout(t, 10*time.Second)() @@ -86,11 +92,6 @@ func TestWritePingFails(t *testing.T) { clients := clients(api, 1) assert.NotEmpty(t, clients) - // try emulate an write error, mostly this should kill the ReadMessage gorouting first but you'll never know. - patch := monkey.PatchInstanceMethod(reflect.TypeOf(clients[0].conn), "WriteMessage", func(*websocket.Conn, int, []byte) error { - return errors.New("could not do something") - }) - defer patch.Unpatch() time.Sleep(5 * time.Second) // waiting for ping diff --git a/api/token_test.go b/api/token_test.go index ecf01a4..60d2b59 100644 --- a/api/token_test.go +++ b/api/token_test.go @@ -10,14 +10,11 @@ import ( "bytes" "errors" "io" + "io/ioutil" "mime/multipart" "net/url" "os" - "reflect" - "io/ioutil" - - "github.com/bouk/monkey" "github.com/gin-gonic/gin" "github.com/gotify/server/mode" "github.com/gotify/server/model" @@ -455,15 +452,11 @@ func (s *TokenSuite) Test_UploadAppImage_WithSaveError_expectServerError() { cType, buffer, err := upload(map[string]*os.File{"file": mustOpen("../test/assets/image.png")}) assert.Nil(s.T(), err) - s.ctx.Request = httptest.NewRequest("POST", "/irrelevant", &buffer) + s.ctx.Request = httptest.NewRequest("POST", "/irrelevant/", &buffer) + s.a.ImageDir = "asdasd/asdasda/asdasd" s.ctx.Request.Header.Set("Content-Type", cType) test.WithUser(s.ctx, 5) s.ctx.Params = gin.Params{{Key: "id", Value: "1"}} - // try emulate a save error. - patch := monkey.PatchInstanceMethod(reflect.TypeOf(s.ctx), "SaveUploadedFile", func(ctx *gin.Context, file *multipart.FileHeader, dst string) error { - return errors.New("could not do something") - }) - defer patch.Unpatch() s.a.UploadApplicationImage(s.ctx) diff --git a/database/database.go b/database/database.go index 7bae41d..d3d3c68 100644 --- a/database/database.go +++ b/database/database.go @@ -12,6 +12,8 @@ import ( _ "github.com/jinzhu/gorm/dialects/sqlite" // enable the sqlite3 dialect ) +var mkdirAll = os.MkdirAll + // New creates a new wrapper for the gorm database framework. func New(dialect, connection, defaultUser, defaultPass string, strength int, createDefaultUser bool) (*GormDatabase, error) { createDirectoryIfSqlite(dialect, connection) @@ -47,7 +49,7 @@ func New(dialect, connection, defaultUser, defaultPass string, strength int, cre func createDirectoryIfSqlite(dialect string, connection string) { if dialect == "sqlite3" { if _, err := os.Stat(filepath.Dir(connection)); os.IsNotExist(err) { - if err := os.MkdirAll(filepath.Dir(connection), 0777); err != nil { + if err := mkdirAll(filepath.Dir(connection), 0777); err != nil { panic(err) } } diff --git a/database/database_test.go b/database/database_test.go index 4b37491..9cb8529 100644 --- a/database/database_test.go +++ b/database/database_test.go @@ -1,12 +1,10 @@ package database import ( + "errors" "os" "testing" - "errors" - - "github.com/bouk/monkey" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" ) @@ -62,12 +60,11 @@ func TestWithAlreadyExistingSqliteFolder(t *testing.T) { } func TestPanicsOnMkdirError(t *testing.T) { - patch := monkey.Patch(os.MkdirAll, func(string, os.FileMode) error { return errors.New("whoops") }) - defer patch.Unpatch() - // ensure path not exists os.RemoveAll("somepath") - + mkdirAll = func(path string, perm os.FileMode) error { + return errors.New("ERROR") + } assert.Panics(t, func() { - New("sqlite3", "somepath/testdb.db", "defaultUser", "defaultPass", 5, true) + New("sqlite3", "somepath/test.db", "defaultUser", "defaultPass", 5, true) }) }