From f102941b627d17d6ab414f00c85ef8a6f7c74412 Mon Sep 17 00:00:00 2001 From: Adam Babik Date: Tue, 30 Jul 2019 20:36:42 +0200 Subject: [PATCH] Unify logging in tests (#38) --- adapters.go | 1 - encryption/encryption_multi_device_test.go | 8 +-- encryption/protocol_test.go | 10 +-- encryption/publisher/publisher_test.go | 9 ++- encryption/sharedsecret/service_test.go | 8 +-- log_encoder_test.go | 23 ------ messenger_test.go | 8 +-- transport/whisper/filter/chats_test.go | 8 +-- transport/whisper/whisper_service_test.go | 7 +- tt/logger.go | 28 ++++++++ log_encoder.go => zaputil/encoder.go | 33 ++++++++- zaputil/encoder_test.go | 81 ++++++++++++++++++++++ 12 files changed, 170 insertions(+), 54 deletions(-) delete mode 100644 log_encoder_test.go create mode 100644 tt/logger.go rename log_encoder.go => zaputil/encoder.go (55%) create mode 100644 zaputil/encoder_test.go diff --git a/adapters.go b/adapters.go index bcea9f9..d2c9d0e 100644 --- a/adapters.go +++ b/adapters.go @@ -235,7 +235,6 @@ func (a *whisperAdapter) handleMessages(shhMessage *whisper.Message, application statusMessages, err := statusMessage.HandleDatasync(a.datasync) if err != nil { hlogger.Debug("failed to handle datasync message", zap.Error(err)) - } for _, statusMessage := range statusMessages { diff --git a/encryption/encryption_multi_device_test.go b/encryption/encryption_multi_device_test.go index d3b0152..435f403 100644 --- a/encryption/encryption_multi_device_test.go +++ b/encryption/encryption_multi_device_test.go @@ -6,6 +6,8 @@ import ( "io/ioutil" "testing" + "github.com/status-im/status-protocol-go/tt" + "github.com/status-im/status-protocol-go/encryption/migrations" "github.com/status-im/status-protocol-go/sqlite" @@ -78,12 +80,10 @@ func setupUser(user string, s *EncryptionServiceMultiDeviceSuite, n int) error { } func (s *EncryptionServiceMultiDeviceSuite) SetupTest() { - logger, err := zap.NewDevelopment() - s.Require().NoError(err) - s.logger = logger + s.logger = tt.MustCreateTestLogger() s.services = make(map[string]*serviceAndKey) - err = setupUser(aliceUser, s, 4) + err := setupUser(aliceUser, s, 4) s.Require().NoError(err) err = setupUser(bobUser, s, 4) diff --git a/encryption/protocol_test.go b/encryption/protocol_test.go index 82705ce..e5f52c0 100644 --- a/encryption/protocol_test.go +++ b/encryption/protocol_test.go @@ -5,6 +5,8 @@ import ( "os" "testing" + "github.com/status-im/status-protocol-go/tt" + migrations "github.com/status-im/status-protocol-go/encryption/migrations" "github.com/status-im/status-protocol-go/sqlite" @@ -32,9 +34,7 @@ type ProtocolServiceTestSuite struct { func (s *ProtocolServiceTestSuite) SetupTest() { var err error - logger, err := zap.NewDevelopment() - s.Require().NoError(err) - s.logger = logger + s.logger = tt.MustCreateTestLogger() s.aliceDBPath, err = ioutil.TempFile("", "alice.db.sql") s.Require().NoError(err) @@ -58,7 +58,7 @@ func (s *ProtocolServiceTestSuite) SetupTest() { addedBundlesHandler, onNewSharedSecretHandler, func(*ProtocolMessageSpec) {}, - logger.With(zap.String("user", "alice")), + s.logger.With(zap.String("user", "alice")), ) db, err = sqlite.Open(s.bobDBPath.Name(), bobDBKey, sqlite.MigrationConfig{ @@ -72,7 +72,7 @@ func (s *ProtocolServiceTestSuite) SetupTest() { addedBundlesHandler, onNewSharedSecretHandler, func(*ProtocolMessageSpec) {}, - logger.With(zap.String("user", "bob")), + s.logger.With(zap.String("user", "bob")), ) } diff --git a/encryption/publisher/publisher_test.go b/encryption/publisher/publisher_test.go index d0ade81..de073c9 100644 --- a/encryption/publisher/publisher_test.go +++ b/encryption/publisher/publisher_test.go @@ -7,6 +7,8 @@ import ( "github.com/stretchr/testify/suite" "go.uber.org/zap" + + "github.com/status-im/status-protocol-go/tt" ) func TestServiceTestSuite(t *testing.T) { @@ -26,11 +28,8 @@ func (p *PublisherTestSuite) SetupTest(installationID string) { db, err := sql.Open("sqlite3", dir) p.Require().NoError(err) - logger, err := zap.NewDevelopment() - p.Require().NoError(err) - p.logger = logger - - p.publisher = New(db, logger) + p.logger = tt.MustCreateTestLogger() + p.publisher = New(db, p.logger) } func (p *PublisherTestSuite) TearDownTest() { diff --git a/encryption/sharedsecret/service_test.go b/encryption/sharedsecret/service_test.go index b5bfe31..cf5d716 100644 --- a/encryption/sharedsecret/service_test.go +++ b/encryption/sharedsecret/service_test.go @@ -5,6 +5,8 @@ import ( "os" "testing" + "github.com/status-im/status-protocol-go/tt" + "github.com/ethereum/go-ethereum/crypto" migrations "github.com/status-im/status-protocol-go/encryption/migrations" "github.com/status-im/status-protocol-go/sqlite" @@ -24,9 +26,7 @@ type SharedSecretTestSuite struct { } func (s *SharedSecretTestSuite) SetupTest() { - logger, err := zap.NewDevelopment() - s.Require().NoError(err) - s.logger = logger + s.logger = tt.MustCreateTestLogger() dbFile, err := ioutil.TempFile(os.TempDir(), "sharedsecret") s.Require().NoError(err) @@ -40,7 +40,7 @@ func (s *SharedSecretTestSuite) SetupTest() { }) s.Require().NoError(err) - s.service = New(db, logger) + s.service = New(db, s.logger) } func (s *SharedSecretTestSuite) TearDownTest() { diff --git a/log_encoder_test.go b/log_encoder_test.go deleted file mode 100644 index 140bfc3..0000000 --- a/log_encoder_test.go +++ /dev/null @@ -1,23 +0,0 @@ -package statusproto - -import ( - "testing" - "time" - - "github.com/stretchr/testify/require" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" -) - -func TestJSONHexEncoder(t *testing.T) { - encoder := NewJSONHexEncoder(zap.NewDevelopmentEncoderConfig()) - encoder.AddBinary("test-key", []byte{0x01, 0x02, 0x03}) - buf, err := encoder.EncodeEntry(zapcore.Entry{ - LoggerName: "", - Time: time.Now(), - Level: zapcore.DebugLevel, - Message: "", - }, nil) - require.NoError(t, err) - require.Contains(t, buf.String(), `"test-key":"0x010203"`) -} diff --git a/messenger_test.go b/messenger_test.go index 5281c4c..0a30ad2 100644 --- a/messenger_test.go +++ b/messenger_test.go @@ -9,6 +9,8 @@ import ( "testing" "time" + "github.com/status-im/status-protocol-go/tt" + "github.com/stretchr/testify/suite" "go.uber.org/zap" @@ -53,9 +55,7 @@ type MessengerSuite struct { func (s *MessengerSuite) SetupTest() { var err error - logger, err := zap.NewDevelopment() - s.Require().NoError(err) - s.logger = logger + s.logger = tt.MustCreateTestLogger() s.tmpFile, err = ioutil.TempFile("", "messenger-test.sql") s.Require().NoError(err) @@ -73,7 +73,7 @@ func (s *MessengerSuite) SetupTest() { nil, shh, "installation-1", - WithCustomLogger(logger), + WithCustomLogger(s.logger), WithMessagesPersistenceEnabled(), WithDatabaseConfig(s.tmpFile.Name(), "some-key"), ) diff --git a/transport/whisper/filter/chats_test.go b/transport/whisper/filter/chats_test.go index b1b4a93..44fcd3a 100644 --- a/transport/whisper/filter/chats_test.go +++ b/transport/whisper/filter/chats_test.go @@ -8,6 +8,8 @@ import ( "os" "testing" + "github.com/status-im/status-protocol-go/tt" + "github.com/ethereum/go-ethereum/crypto" _ "github.com/mutecomm/go-sqlcipher" whisper "github.com/status-im/whisper/whisperv6" @@ -52,9 +54,7 @@ func newTestKey(privateKey string, partitionedTopic int) (*testKey, error) { } func (s *ChatsTestSuite) SetupTest() { - logger, err := zap.NewDevelopment() - s.Require().NoError(err) - s.logger = logger + s.logger = tt.MustCreateTestLogger() keyStrs := []string{ "c6cbd7d76bc5baca530c875663711b947efa6a86a900a9e8645ce32e5821484e", @@ -82,7 +82,7 @@ func (s *ChatsTestSuite) SetupTest() { whisper := whisper.New(nil) - s.chats, err = New(db, whisper, s.keys[0].privateKey, logger) + s.chats, err = New(db, whisper, s.keys[0].privateKey, s.logger) s.Require().NoError(err) } diff --git a/transport/whisper/whisper_service_test.go b/transport/whisper/whisper_service_test.go index 04c4e6f..ea30fab 100644 --- a/transport/whisper/whisper_service_test.go +++ b/transport/whisper/whisper_service_test.go @@ -9,11 +9,12 @@ import ( migrations "github.com/status-im/status-protocol-go/transport/whisper/migrations" "github.com/stretchr/testify/require" - "go.uber.org/zap" + + "github.com/status-im/status-protocol-go/tt" ) func TestSelectAndAddNoMailservers(t *testing.T) { - logger := zap.NewNop() + logger := tt.MustCreateTestLogger() svc := &WhisperServiceTransport{ logger: logger, } @@ -34,7 +35,7 @@ func TestNewWhisperServiceTransport(t *testing.T) { }) require.NoError(t, err) - logger, err := zap.NewDevelopment() + logger := tt.MustCreateTestLogger() require.NoError(t, err) defer func() { _ = logger.Sync() }() diff --git a/tt/logger.go b/tt/logger.go new file mode 100644 index 0000000..4633b5c --- /dev/null +++ b/tt/logger.go @@ -0,0 +1,28 @@ +package tt + +import ( + "sync" + + "github.com/status-im/status-protocol-go/zaputil" + + "go.uber.org/zap" +) + +var registerOnce sync.Once + +// MustCreateTestLogger returns a logger based on the passed flags. +func MustCreateTestLogger() *zap.Logger { + registerOnce.Do(func() { + if err := zaputil.RegisterConsoleHexEncoder(); err != nil { + panic(err) + } + }) + + cfg := zap.NewDevelopmentConfig() + cfg.Encoding = "console-hex" + l, err := cfg.Build() + if err != nil { + panic(err) + } + return l +} diff --git a/log_encoder.go b/zaputil/encoder.go similarity index 55% rename from log_encoder.go rename to zaputil/encoder.go index fce9b4d..f5cb446 100644 --- a/log_encoder.go +++ b/zaputil/encoder.go @@ -1,4 +1,4 @@ -package statusproto +package zaputil import ( "encoding/hex" @@ -26,6 +26,11 @@ func (enc *jsonHexEncoder) AddBinary(key string, val []byte) { enc.AddString(key, "0x"+hex.EncodeToString(val)) } +func (enc *jsonHexEncoder) Clone() zapcore.Encoder { + encoderClone := enc.Encoder.Clone() + return &jsonHexEncoder{Encoder: encoderClone} +} + // RegisterJSONHexEncoder registers a jsonHexEncoder under "json-hex" name. // Later, this name can be used as a value for zap.Config.Encoding to enable // jsonHexEncoder. @@ -34,3 +39,29 @@ func RegisterJSONHexEncoder() error { return NewJSONHexEncoder(cfg), nil }) } + +type consoleHexEncoder struct { + zapcore.Encoder +} + +func NewConsoleHexEncoder(cfg zapcore.EncoderConfig) zapcore.Encoder { + consoleEncoder := zapcore.NewConsoleEncoder(cfg) + return &consoleHexEncoder{ + Encoder: consoleEncoder, + } +} + +func (enc *consoleHexEncoder) AddBinary(key string, val []byte) { + enc.AddString(key, "0x"+hex.EncodeToString(val)) +} + +func (enc *consoleHexEncoder) Clone() zapcore.Encoder { + encoderClone := enc.Encoder.Clone() + return &consoleHexEncoder{Encoder: encoderClone} +} + +func RegisterConsoleHexEncoder() error { + return zap.RegisterEncoder("console-hex", func(cfg zapcore.EncoderConfig) (zapcore.Encoder, error) { + return NewConsoleHexEncoder(cfg), nil + }) +} diff --git a/zaputil/encoder_test.go b/zaputil/encoder_test.go new file mode 100644 index 0000000..7bb4b9c --- /dev/null +++ b/zaputil/encoder_test.go @@ -0,0 +1,81 @@ +package zaputil + +import ( + "io/ioutil" + "testing" + "time" + + "github.com/stretchr/testify/require" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +func TestJSONHexEncoder(t *testing.T) { + encoder := NewJSONHexEncoder(zap.NewDevelopmentEncoderConfig()) + encoder.AddBinary("test-key", []byte{0x01, 0x02, 0x03}) + buf, err := encoder.EncodeEntry(zapcore.Entry{ + LoggerName: "", + Time: time.Now(), + Level: zapcore.DebugLevel, + Message: "", + }, nil) + require.NoError(t, err) + require.Contains(t, buf.String(), `"test-key":"0x010203"`) +} + +func TestLoggerWithJSONHexEncoder(t *testing.T) { + err := RegisterJSONHexEncoder() + require.NoError(t, err) + + tmpFile, err := ioutil.TempFile("", "") + require.NoError(t, err) + + cfg := zap.NewDevelopmentConfig() + cfg.OutputPaths = []string{tmpFile.Name()} + cfg.Encoding = "json-hex" + l, err := cfg.Build() + require.NoError(t, err) + + l.With(zap.Binary("some-field", []byte{0x01, 0x02, 0x03})).Debug("test message") + err = l.Sync() + require.NoError(t, err) + + data, err := ioutil.ReadFile(tmpFile.Name()) + require.NoError(t, err) + require.Contains(t, string(data), "0x010203") +} + +func TestConsoleHexEncoder(t *testing.T) { + encoder := NewConsoleHexEncoder(zap.NewDevelopmentEncoderConfig()) + encoder.AddBinary("test-key", []byte{0x01, 0x02, 0x03}) + buf, err := encoder.EncodeEntry(zapcore.Entry{ + LoggerName: "", + Time: time.Now(), + Level: zapcore.DebugLevel, + Message: "", + }, nil) + require.NoError(t, err) + require.Contains(t, buf.String(), `{"test-key": "0x010203"}`) +} + +func TestLoggerWithConsoleHexEncoder(t *testing.T) { + err := RegisterConsoleHexEncoder() + require.NoError(t, err) + + tmpFile, err := ioutil.TempFile("", "") + require.NoError(t, err) + + cfg := zap.NewDevelopmentConfig() + cfg.OutputPaths = []string{tmpFile.Name()} + cfg.Encoding = "console-hex" + l, err := cfg.Build() + require.NoError(t, err) + + l.With(zap.Binary("some-field", []byte{0x01, 0x02, 0x03})).Debug("test message") + err = l.Sync() + require.NoError(t, err) + + data, err := ioutil.ReadFile(tmpFile.Name()) + require.NoError(t, err) + require.Contains(t, string(data), "0x010203") +}