github.com/vlifesystems/rulehunter@v0.0.0-20180501090014-673078aa4a83/internal/testhelpers/logger.go (about) 1 // Copyright (C) 2016-2017 vLife Systems Ltd <http://vlifesystems.com> 2 // Licensed under an MIT licence. Please see LICENSE.md for details. 3 4 package testhelpers 5 6 import ( 7 "sort" 8 9 "github.com/kardianos/service" 10 "github.com/vlifesystems/rulehunter/quitter" 11 ) 12 13 type Logger struct { 14 entries []Entry 15 isRunning bool 16 } 17 18 type Entry struct { 19 Level Level 20 Msg string 21 } 22 23 type Level int 24 25 const ( 26 Info Level = iota 27 Error 28 ) 29 30 func NewLogger() *Logger { 31 return &Logger{ 32 entries: make([]Entry, 0), 33 isRunning: false, 34 } 35 } 36 37 func (l *Logger) Run(quit *quitter.Quitter) { 38 quit.Add() 39 defer quit.Done() 40 l.isRunning = true 41 defer func() { l.isRunning = false }() 42 for { 43 select { 44 case <-quit.C: 45 return 46 } 47 } 48 } 49 50 // Running returns whether Logger is running 51 func (l *Logger) Running() bool { 52 return l.isRunning 53 } 54 55 func (l *Logger) SetSvcLogger(logger service.Logger) { 56 } 57 58 func (l *Logger) Error(err error) error { 59 entry := Entry{ 60 Level: Error, 61 Msg: err.Error(), 62 } 63 l.entries = append(l.entries, entry) 64 return err 65 } 66 67 func (l *Logger) Info(msg string) { 68 entry := Entry{ 69 Level: Info, 70 Msg: msg, 71 } 72 l.entries = append(l.entries, entry) 73 } 74 75 // GetEntries returns the entries from the log. If an argument is passed, 76 // it represents whether to make the errors unique. 77 func (l *Logger) GetEntries(args ...bool) []Entry { 78 uniqueErrors := false 79 if len(args) == 1 { 80 uniqueErrors = args[0] 81 } 82 if !uniqueErrors { 83 return l.entries 84 } 85 r := []Entry{} 86 for _, e := range l.entries { 87 found := false 88 if e.Level == Error { 89 for _, re := range r { 90 if e.Level == re.Level && e.Msg == re.Msg { 91 found = true 92 break 93 } 94 } 95 } 96 if !found { 97 r = append(r, e) 98 } 99 } 100 return r 101 } 102 103 func SortLogEntries(entries []Entry) []Entry { 104 r := make([]Entry, len(entries)) 105 copy(r, entries) 106 sort.SliceStable( 107 r, 108 func(i, j int) bool { 109 if r[i].Level < r[j].Level { 110 return true 111 } else if r[i].Level == r[j].Level && r[i].Msg < r[j].Msg { 112 return true 113 } 114 return false 115 }, 116 ) 117 return r 118 }