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  }