Remove monkey dependency

This commit is contained in:
Jannis Mattheis 2018-11-06 20:58:35 +01:00
parent 0f9d3bde81
commit 80eec6ae3a
9 changed files with 51 additions and 54 deletions

8
Gopkg.lock generated
View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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")

View File

@ -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
}
}

View File

@ -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

View File

@ -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)

View File

@ -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)
}
}

View File

@ -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)
})
}