Skip to content

Commit

Permalink
Refactor logger
Browse files Browse the repository at this point in the history
  • Loading branch information
hypnoglow committed Dec 3, 2016
1 parent 1703c44 commit 3e6d8ac
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 74 deletions.
2 changes: 0 additions & 2 deletions configuration.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ type Files struct {

// NewConfiguration returns a new Configuration.
func NewConfiguration(filename string) (conf *Configuration, err error) {
logger.Msg("Parsing config file %s", filename)

switch filepath.Ext(filename) {
case ".toml":
conf, err = fromTOML(filename)
Expand Down
34 changes: 24 additions & 10 deletions linker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,24 @@ import (
"github.com/stretchr/testify/assert"
)

func TestMain(m *testing.M) {
returnCode := m.Run()
os.RemoveAll("/tmp/dotbro") // Cleanup
os.Exit(returnCode)
}

type FakeLogger struct{}
type FakeLogWriterForLinkerOutputer struct{}

func (f *FakeLogger) Msg(format string, v ...interface{}) {
func (f *FakeLogWriterForLinkerOutputer) Write(format string, v ...interface{}) {
return
}

//
// func TestMain(m *testing.M) {
// // returnCode := m.Run()
// os.RemoveAll("/tmp/dotbro") // Cleanup
// // os.Exit(returnCode)
// }

func TestNeedSymlink(t *testing.T) {
// TODO: test fails if outputer is not defined.
logger := &FakeLogger{}
outputer = NewOutputer(OutputerModeQuiet, os.Stdout, logger)
outputer = NewOutputer(OutputerModeQuiet, os.Stdout, &FakeLogWriterForLinkerOutputer{})

os.RemoveAll("/tmp/dotbro") // Cleanup

// Test dest does not exist
src := "/tmp/dotbro/linker/TestNeedSymlink.txt"
Expand Down Expand Up @@ -77,6 +79,9 @@ func TestNeedSymlink(t *testing.T) {
}

func TestNeedBackup(t *testing.T) {

os.RemoveAll("/tmp/dotbro") // Cleanup

// Test dest does not exist
dest := "/tmp/dotbro/linker/TestNeedBackup.txt"

Expand Down Expand Up @@ -112,6 +117,9 @@ func TestNeedBackup(t *testing.T) {
}

func TestBackup(t *testing.T) {

os.RemoveAll("/tmp/dotbro") // Cleanup

dest := "new"
destAbs := "/tmp/dotbro/linker/TestBackup/new"
backupDir := "/tmp/dotbro/linker/TestBackup/backup"
Expand All @@ -128,6 +136,9 @@ func TestBackup(t *testing.T) {
}

func TestBackupCopy(t *testing.T) {

os.RemoveAll("/tmp/dotbro") // Cleanup

filename := "/tmp/dotbro/linker/TestBackupCopy/file"
backupDir := "/tmp/dotbro/linker/TestBackupCopy/backup"
if err := os.MkdirAll(path.Dir(filename), 0755); err != nil {
Expand All @@ -145,6 +156,9 @@ func TestBackupCopy(t *testing.T) {
}

func TestSetSymlink(t *testing.T) {

os.RemoveAll("/tmp/dotbro") // Cleanup

srcAbs := "/tmp/dotbro/linker/TestSetSymlink/file"
destAbs := "/tmp/dotbro/linker/TestSetSymlink/filesymlink"
err := setSymlink(srcAbs, destAbs)
Expand Down
58 changes: 15 additions & 43 deletions logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,30 @@ package main
import (
"fmt"
"log"
"os"
"path/filepath"
"runtime"
"strings"
)

const logFilepath = "${HOME}/.dotbro/dotbro.log"

// ILoger describes debug logger.
// TODO: rename. This is a bad name (because Logger was not available).
type ILogger interface {
Msg(format string, v ...interface{})
// LogWriter describes a writer for the log.
type LogWriter interface {
Write(format string, v ...interface{})
}

// Logger is just an internal logger for debugging purposes.
type Logger struct {
*log.Logger
// DebugLogger is a logger that logs output to a log.Logger for debugging purposes.
type DebugLogger struct {
Log *log.Logger
}

var logger *Logger
// NewDebugLogger creates a new DebugLogger.
func NewDebugLogger(log *log.Logger) DebugLogger {
return DebugLogger{
Log: log,
}
}

// Msg logs message to log file
func (lg *Logger) Msg(format string, v ...interface{}) {
if lg == nil {
func (dl DebugLogger) Write(format string, v ...interface{}) {
if dl.Log == nil {
return
}

Expand All @@ -36,33 +36,5 @@ func (lg *Logger) Msg(format string, v ...interface{}) {
_, filename, line, _ := runtime.Caller(1)
msg = fmt.Sprintf("%s:%d %s", filepath.Base(filename), line, msg)

lg.Println(strings.TrimSpace(msg))
}

func init() {
var filename = os.ExpandEnv(logFilepath)

err := CreatePath(osDirCheckMaker, filename)
if err != nil {
outputer.OutWarn("Cannot use log file %s. Reason: %s", filename, err)
return
}

f, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
outputer.OutWarn("Cannot use log file %s. Reason: %s", filename, err)
return
}

logger = &Logger{
log.New(f, "", log.Ldate|log.Ltime),
}

logger.Msg("Init logger")
}

// exit actually calls os.Exit after logger logs exit message.
func exit(exitCode int) {
logger.Msg("Exit with code %d.", exitCode)
os.Exit(exitCode)
dl.Log.Println(strings.TrimSpace(msg))
}
7 changes: 7 additions & 0 deletions logger_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package main

import "testing"

func TestNewDebugLogger(t *testing.T) {
NewDebugLogger(nil)
}
38 changes: 35 additions & 3 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,15 @@ package main

import (
"fmt"
"log"
"os"
"path"
"path/filepath"
)

const logFilepath = "${HOME}/.dotbro/dotbro.log"

var debugLogger DebugLogger
var outputer Outputer

type OsStater struct{}
Expand All @@ -33,8 +37,11 @@ var (
)

func main() {
outputer = NewOutputer(OutputerModeNormal, os.Stdout, logger)
logger.Msg("Start.")
outputer = NewOutputer(OutputerModeNormal, os.Stdout, debugLogger)
initLogger()
outputer.Logger = debugLogger

debugLogger.Write("Start.")

// Parse arguments

Expand All @@ -44,7 +51,7 @@ func main() {
exit(1)
}

logger.Msg("Arguments passed: %+v", args)
debugLogger.Write("Arguments passed: %+v", args)

switch {
case args["--verbose"].(bool):
Expand All @@ -58,6 +65,7 @@ func main() {
// Process config

configPath := getConfigPath(args["--config"])
debugLogger.Write("Parsing config file %s", configPath)
config, err := NewConfiguration(configPath)
if err != nil {
outputer.OutError("Error reading configuration from file %s: %s", configPath, err)
Expand Down Expand Up @@ -100,6 +108,24 @@ func main() {
}
}

func initLogger() {
var filename = os.ExpandEnv(logFilepath)

err := CreatePath(osDirCheckMaker, filename)
if err != nil {
outputer.OutWarn("Cannot use log file %s. Reason: %s", filename, err)
return
}

f, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
outputer.OutWarn("Cannot use log file %s. Reason: %s", filename, err)
return
}

debugLogger = NewDebugLogger(log.New(f, "", log.Ldate|log.Ltime))
}

func addAction(filename string, config *Configuration) error {
fileInfo, err := os.Lstat(filename)
if err != nil {
Expand Down Expand Up @@ -304,3 +330,9 @@ func installDotfile(src, dest string, config *Configuration, srcDirAbs string) {
exit(1)
}
}

// exit actually calls os.Exit after logger logs exit message.
func exit(exitCode int) {
debugLogger.Write("Exit with code %d.", exitCode)
os.Exit(exitCode)
}
12 changes: 6 additions & 6 deletions outputer.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ const (
type Outputer struct {
Mode OutputerMode
Output io.Writer
Logger ILogger // TODO: refactor to interface
Logger LogWriter
}

// NewOutputer creates a new Outputer.
func NewOutputer(mode OutputerMode, output io.Writer, logger ILogger) Outputer {
func NewOutputer(mode OutputerMode, output io.Writer, logger LogWriter) Outputer {
return Outputer{
Mode: mode,
Output: output,
Expand All @@ -33,7 +33,7 @@ func NewOutputer(mode OutputerMode, output io.Writer, logger ILogger) Outputer {
func (o *Outputer) OutVerbose(format string, v ...interface{}) {
msg := fmt.Sprintf(format, v...)

o.Logger.Msg(msg)
o.Logger.Write(msg)

if o.Mode < OutputerModeVerbose {
return
Expand All @@ -46,7 +46,7 @@ func (o *Outputer) OutVerbose(format string, v ...interface{}) {
func (o *Outputer) OutInfo(format string, v ...interface{}) {
msg := fmt.Sprintf(format, v...)

o.Logger.Msg(msg)
o.Logger.Write(msg)

if o.Mode < OutputerModeNormal {
return
Expand All @@ -59,7 +59,7 @@ func (o *Outputer) OutInfo(format string, v ...interface{}) {
func (o *Outputer) OutWarn(format string, v ...interface{}) {
msg := fmt.Sprintf("WARN: %s", fmt.Sprintf(format, v...))

o.Logger.Msg(msg)
o.Logger.Write(msg)

fmt.Fprintln(o.Output, msg)
}
Expand All @@ -68,7 +68,7 @@ func (o *Outputer) OutWarn(format string, v ...interface{}) {
func (o *Outputer) OutError(format string, v ...interface{}) {
msg := fmt.Sprintf("ERRO: %s", fmt.Sprintf(format, v...))

o.Logger.Msg(msg)
o.Logger.Write(msg)

// TODO: write to stderr
fmt.Fprintln(o.Output, msg)
Expand Down
21 changes: 11 additions & 10 deletions outputer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,14 @@ import (
"testing"
)

type FakeLogWriterForOutputer struct{}

func (f *FakeLogWriterForOutputer) Write(format string, v ...interface{}) {
return
}

func TestNewOutputer(t *testing.T) {
fakeLogger := new(FakeLogger)
NewOutputer(OutputerModeNormal, os.Stdout, fakeLogger)
NewOutputer(OutputerModeNormal, os.Stdout, &FakeLogWriterForOutputer{})
}

func TestOutputer_OutVerbose(t *testing.T) {
Expand Down Expand Up @@ -38,9 +43,8 @@ func TestOutputer_OutVerbose(t *testing.T) {
},
}

fakeLogger := new(FakeLogger)
output := bytes.NewBufferString("")
outputer := NewOutputer(OutputerModeVerbose, output, fakeLogger)
outputer := NewOutputer(OutputerModeVerbose, output, &FakeLogWriterForOutputer{})

for _, c := range cases {
output.Reset()
Expand Down Expand Up @@ -81,9 +85,8 @@ func TestOutputer_OutInfo(t *testing.T) {
},
}

fakeLogger := new(FakeLogger)
output := bytes.NewBufferString("")
outputer := NewOutputer(OutputerModeVerbose, output, fakeLogger)
outputer := NewOutputer(OutputerModeVerbose, output, &FakeLogWriterForOutputer{})

for _, c := range cases {
output.Reset()
Expand Down Expand Up @@ -124,9 +127,8 @@ func TestOutputer_OutWarn(t *testing.T) {
},
}

fakeLogger := new(FakeLogger)
output := bytes.NewBufferString("")
outputer := NewOutputer(OutputerModeVerbose, output, fakeLogger)
outputer := NewOutputer(OutputerModeVerbose, output, &FakeLogWriterForOutputer{})

for _, c := range cases {
output.Reset()
Expand Down Expand Up @@ -167,9 +169,8 @@ func TestOutputer_OutError(t *testing.T) {
},
}

fakeLogger := new(FakeLogger)
output := bytes.NewBufferString("")
outputer := NewOutputer(OutputerModeVerbose, output, fakeLogger)
outputer := NewOutputer(OutputerModeVerbose, output, &FakeLogWriterForOutputer{})

for _, c := range cases {
output.Reset()
Expand Down

0 comments on commit 3e6d8ac

Please sign in to comment.