diff options
Diffstat (limited to 'vendor/github.com/getlantern/golog')
-rw-r--r-- | vendor/github.com/getlantern/golog/LICENSE | 202 | ||||
-rw-r--r-- | vendor/github.com/getlantern/golog/README.md | 6 | ||||
-rw-r--r-- | vendor/github.com/getlantern/golog/golog.go | 458 | ||||
-rw-r--r-- | vendor/github.com/getlantern/golog/golog_test.go | 224 |
4 files changed, 0 insertions, 890 deletions
diff --git a/vendor/github.com/getlantern/golog/LICENSE b/vendor/github.com/getlantern/golog/LICENSE deleted file mode 100644 index 3ee0162..0000000 --- a/vendor/github.com/getlantern/golog/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2014 Brave New Software Project, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/getlantern/golog/README.md b/vendor/github.com/getlantern/golog/README.md deleted file mode 100644 index 88fe677..0000000 --- a/vendor/github.com/getlantern/golog/README.md +++ /dev/null @@ -1,6 +0,0 @@ -golog [![Travis CI Status](https://travis-ci.org/getlantern/golog.svg?branch=master)](https://travis-ci.org/getlantern/golog) [![Coverage Status](https://coveralls.io/repos/getlantern/golog/badge.png)](https://coveralls.io/r/getlantern/golog) [![GoDoc](https://godoc.org/github.com/getlantern/golog?status.png)](http://godoc.org/github.com/getlantern/golog) -========== -Provides logging used in many getlantern components. - -[GoDoc](https://godoc.org/github.com/getlantern/golog) - diff --git a/vendor/github.com/getlantern/golog/golog.go b/vendor/github.com/getlantern/golog/golog.go deleted file mode 100644 index 143e904..0000000 --- a/vendor/github.com/getlantern/golog/golog.go +++ /dev/null @@ -1,458 +0,0 @@ -// Package golog implements logging functions that log errors to stderr and -// debug messages to stdout. Trace logging is also supported. -// Trace logs go to stdout as well, but they are only written if the program -// is run with environment variable "TRACE=true". -// A stack dump will be printed after the message if "PRINT_STACK=true". -package golog - -import ( - "bufio" - "bytes" - "fmt" - "io" - "io/ioutil" - "log" - "os" - "path/filepath" - "runtime" - "sort" - "strconv" - "strings" - "sync" - "sync/atomic" - - "github.com/getlantern/errors" - "github.com/getlantern/hidden" - "github.com/getlantern/ops" - "github.com/oxtoacart/bpool" -) - -const ( - // ERROR is an error Severity - ERROR = 500 - - // FATAL is an error Severity - FATAL = 600 -) - -var ( - outs atomic.Value - reporters []ErrorReporter - reportersMutex sync.RWMutex - - bufferPool = bpool.NewBufferPool(200) - - onFatal atomic.Value -) - -// Severity is a level of error (higher values are more severe) -type Severity int - -func (s Severity) String() string { - switch s { - case ERROR: - return "ERROR" - case FATAL: - return "FATAL" - default: - return "UNKNOWN" - } -} - -func init() { - DefaultOnFatal() - ResetOutputs() -} - -func SetOutputs(errorOut io.Writer, debugOut io.Writer) { - outs.Store(&outputs{ - ErrorOut: errorOut, - DebugOut: debugOut, - }) -} - -func ResetOutputs() { - SetOutputs(os.Stderr, os.Stdout) -} - -func GetOutputs() *outputs { - return outs.Load().(*outputs) -} - -// RegisterReporter registers the given ErrorReporter. All logged Errors are -// sent to this reporter. -func RegisterReporter(reporter ErrorReporter) { - reportersMutex.Lock() - reporters = append(reporters, reporter) - reportersMutex.Unlock() -} - -// OnFatal configures golog to call the given function on any FATAL error. By -// default, golog calls os.Exit(1) on any FATAL error. -func OnFatal(fn func(err error)) { - onFatal.Store(fn) -} - -// DefaultOnFatal enables the default behavior for OnFatal -func DefaultOnFatal() { - onFatal.Store(func(err error) { - os.Exit(1) - }) -} - -type outputs struct { - ErrorOut io.Writer - DebugOut io.Writer -} - -// MultiLine is an interface for arguments that support multi-line output. -type MultiLine interface { - // MultiLinePrinter returns a function that can be used to print the - // multi-line output. The returned function writes one line to the buffer and - // returns true if there are more lines to write. This function does not need - // to take care of trailing carriage returns, golog handles that - // automatically. - MultiLinePrinter() func(buf *bytes.Buffer) bool -} - -// ErrorReporter is a function to which the logger will report errors. -// It the given error and corresponding message along with associated ops -// context. This should return quickly as it executes on the critical code -// path. The recommended approach is to buffer as much as possible and discard -// new reports if the buffer becomes saturated. -type ErrorReporter func(err error, linePrefix string, severity Severity, ctx map[string]interface{}) - -type Logger interface { - // Debug logs to stdout - Debug(arg interface{}) - // Debugf logs to stdout - Debugf(message string, args ...interface{}) - - // Error logs to stderr - Error(arg interface{}) error - // Errorf logs to stderr. It returns the first argument that's an error, or - // a new error built using fmt.Errorf if none of the arguments are errors. - Errorf(message string, args ...interface{}) error - - // Fatal logs to stderr and then exits with status 1 - Fatal(arg interface{}) - // Fatalf logs to stderr and then exits with status 1 - Fatalf(message string, args ...interface{}) - - // Trace logs to stderr only if TRACE=true - Trace(arg interface{}) - // Tracef logs to stderr only if TRACE=true - Tracef(message string, args ...interface{}) - - // TraceOut provides access to an io.Writer to which trace information can - // be streamed. If running with environment variable "TRACE=true", TraceOut - // will point to os.Stderr, otherwise it will point to a ioutil.Discared. - // Each line of trace information will be prefixed with this Logger's - // prefix. - TraceOut() io.Writer - - // IsTraceEnabled() indicates whether or not tracing is enabled for this - // logger. - IsTraceEnabled() bool - - // AsStdLogger returns an standard logger - AsStdLogger() *log.Logger -} - -func LoggerFor(prefix string) Logger { - l := &logger{ - prefix: prefix + ": ", - pc: make([]uintptr, 10), - } - - trace := os.Getenv("TRACE") - l.traceOn, _ = strconv.ParseBool(trace) - if !l.traceOn { - prefixes := strings.Split(trace, ",") - for _, p := range prefixes { - if prefix == strings.Trim(p, " ") { - l.traceOn = true - break - } - } - } - if l.traceOn { - l.traceOut = l.newTraceWriter() - } else { - l.traceOut = ioutil.Discard - } - - printStack := os.Getenv("PRINT_STACK") - l.printStack, _ = strconv.ParseBool(printStack) - - return l -} - -type logger struct { - prefix string - traceOn bool - traceOut io.Writer - printStack bool - outs atomic.Value - pc []uintptr - funcForPc *runtime.Func -} - -// attaches the file and line number corresponding to -// the log message -func (l *logger) linePrefix(skipFrames int) string { - runtime.Callers(skipFrames, l.pc) - funcForPc := runtime.FuncForPC(l.pc[0]) - file, line := funcForPc.FileLine(l.pc[0] - 1) - return fmt.Sprintf("%s%s:%d ", l.prefix, filepath.Base(file), line) -} - -func (l *logger) print(out io.Writer, skipFrames int, severity string, arg interface{}) string { - buf := bufferPool.Get() - defer bufferPool.Put(buf) - - linePrefix := l.linePrefix(skipFrames) - writeHeader := func() { - buf.WriteString(severity) - buf.WriteString(" ") - buf.WriteString(linePrefix) - } - if arg != nil { - ml, isMultiline := arg.(MultiLine) - if !isMultiline { - writeHeader() - fmt.Fprintf(buf, "%v", arg) - printContext(buf, arg) - buf.WriteByte('\n') - } else { - mlp := ml.MultiLinePrinter() - first := true - for { - writeHeader() - more := mlp(buf) - if first { - printContext(buf, arg) - first = false - } - buf.WriteByte('\n') - if !more { - break - } - } - } - } - b := []byte(hidden.Clean(buf.String())) - _, err := out.Write(b) - if err != nil { - errorOnLogging(err) - } - if l.printStack { - l.doPrintStack() - } - - return linePrefix -} - -func (l *logger) printf(out io.Writer, skipFrames int, severity string, err error, message string, args ...interface{}) string { - buf := bufferPool.Get() - defer bufferPool.Put(buf) - - linePrefix := l.linePrefix(skipFrames) - buf.WriteString(severity) - buf.WriteString(" ") - buf.WriteString(linePrefix) - fmt.Fprintf(buf, message, args...) - printContext(buf, err) - buf.WriteByte('\n') - b := []byte(hidden.Clean(buf.String())) - _, err2 := out.Write(b) - if err2 != nil { - errorOnLogging(err) - } - if l.printStack { - l.doPrintStack() - } - return linePrefix -} - -func (l *logger) Debug(arg interface{}) { - l.print(GetOutputs().DebugOut, 4, "DEBUG", arg) -} - -func (l *logger) Debugf(message string, args ...interface{}) { - l.printf(GetOutputs().DebugOut, 4, "DEBUG", nil, message, args...) -} - -func (l *logger) Error(arg interface{}) error { - return l.errorSkipFrames(arg, 1, ERROR) -} - -func (l *logger) Errorf(message string, args ...interface{}) error { - return l.errorSkipFrames(errors.NewOffset(1, message, args...), 1, ERROR) -} - -func (l *logger) Fatal(arg interface{}) { - fatal(l.errorSkipFrames(arg, 1, FATAL)) -} - -func (l *logger) Fatalf(message string, args ...interface{}) { - fatal(l.errorSkipFrames(errors.NewOffset(1, message, args...), 1, FATAL)) -} - -func fatal(err error) { - fn := onFatal.Load().(func(err error)) - fn(err) -} - -func (l *logger) errorSkipFrames(arg interface{}, skipFrames int, severity Severity) error { - var err error - switch e := arg.(type) { - case error: - err = e - default: - err = fmt.Errorf("%v", e) - } - linePrefix := l.print(GetOutputs().ErrorOut, skipFrames+4, severity.String(), err) - return report(err, linePrefix, severity) -} - -func (l *logger) Trace(arg interface{}) { - if l.traceOn { - l.print(GetOutputs().DebugOut, 4, "TRACE", arg) - } -} - -func (l *logger) Tracef(message string, args ...interface{}) { - if l.traceOn { - l.printf(GetOutputs().DebugOut, 4, "TRACE", nil, message, args...) - } -} - -func (l *logger) TraceOut() io.Writer { - return l.traceOut -} - -func (l *logger) IsTraceEnabled() bool { - return l.traceOn -} - -func (l *logger) newTraceWriter() io.Writer { - pr, pw := io.Pipe() - br := bufio.NewReader(pr) - - if !l.traceOn { - return pw - } - go func() { - defer func() { - if err := pr.Close(); err != nil { - errorOnLogging(err) - } - }() - defer func() { - if err := pw.Close(); err != nil { - errorOnLogging(err) - } - }() - - for { - line, err := br.ReadString('\n') - if err == nil { - // Log the line (minus the trailing newline) - l.print(GetOutputs().DebugOut, 6, "TRACE", line[:len(line)-1]) - } else { - l.printf(GetOutputs().DebugOut, 6, "TRACE", nil, "TraceWriter closed due to unexpected error: %v", err) - return - } - } - }() - - return pw -} - -type errorWriter struct { - l *logger -} - -// Write implements method of io.Writer, due to different call depth, -// it will not log correct file and line prefix -func (w *errorWriter) Write(p []byte) (n int, err error) { - s := string(p) - if s[len(s)-1] == '\n' { - s = s[:len(s)-1] - } - w.l.print(GetOutputs().ErrorOut, 6, "ERROR", s) - return len(p), nil -} - -func (l *logger) AsStdLogger() *log.Logger { - return log.New(&errorWriter{l}, "", 0) -} - -func (l *logger) doPrintStack() { - var b []byte - buf := bytes.NewBuffer(b) - for _, pc := range l.pc { - funcForPc := runtime.FuncForPC(pc) - if funcForPc == nil { - break - } - name := funcForPc.Name() - if strings.HasPrefix(name, "runtime.") { - break - } - file, line := funcForPc.FileLine(pc) - fmt.Fprintf(buf, "\t%s\t%s: %d\n", name, file, line) - } - if _, err := buf.WriteTo(os.Stderr); err != nil { - errorOnLogging(err) - } -} - -func errorOnLogging(err error) { - fmt.Fprintf(os.Stderr, "Unable to log: %v\n", err) -} - -func printContext(buf *bytes.Buffer, err interface{}) { - // Note - we don't include globals when printing in order to avoid polluting the text log - values := ops.AsMap(err, false) - if len(values) == 0 { - return - } - buf.WriteString(" [") - var keys []string - for key := range values { - keys = append(keys, key) - } - sort.Strings(keys) - for i, key := range keys { - value := values[key] - if i > 0 { - buf.WriteString(" ") - } - buf.WriteString(key) - buf.WriteString("=") - fmt.Fprintf(buf, "%v", value) - } - buf.WriteByte(']') -} - -func report(err error, linePrefix string, severity Severity) error { - var reportersCopy []ErrorReporter - reportersMutex.RLock() - if len(reporters) > 0 { - reportersCopy = make([]ErrorReporter, len(reporters)) - copy(reportersCopy, reporters) - } - reportersMutex.RUnlock() - - if len(reportersCopy) > 0 { - ctx := ops.AsMap(err, true) - ctx["severity"] = severity.String() - for _, reporter := range reportersCopy { - // We include globals when reporting - reporter(err, linePrefix, severity, ctx) - } - } - return err -} diff --git a/vendor/github.com/getlantern/golog/golog_test.go b/vendor/github.com/getlantern/golog/golog_test.go deleted file mode 100644 index bce36e8..0000000 --- a/vendor/github.com/getlantern/golog/golog_test.go +++ /dev/null @@ -1,224 +0,0 @@ -package golog - -import ( - "bytes" - "io" - "io/ioutil" - "os" - "regexp" - "strings" - "sync" - "testing" - "time" - - "github.com/getlantern/errors" - "github.com/getlantern/ops" - - "github.com/stretchr/testify/assert" -) - -var ( - expectedLog = "SEVERITY myprefix: golog_test.go:999 Hello world\nSEVERITY myprefix: golog_test.go:999 Hello true [cvarA=a cvarB=b op=name root_op=name]\n" - expectedErrorLog = `ERROR myprefix: golog_test.go:999 Hello world [cvarC=c cvarD=d error=Hello %v error_location=github.com/getlantern/golog.TestError (golog_test.go:999) error_text=Hello world error_type=errors.Error op=name root_op=name] -ERROR myprefix: golog_test.go:999 at github.com/getlantern/golog.TestError (golog_test.go:999) -ERROR myprefix: golog_test.go:999 at testing.tRunner (testing.go:999) -ERROR myprefix: golog_test.go:999 at runtime.goexit (asm_amd999.s:999) -ERROR myprefix: golog_test.go:999 Caused by: world -ERROR myprefix: golog_test.go:999 at github.com/getlantern/golog.errorReturner (golog_test.go:999) -ERROR myprefix: golog_test.go:999 at github.com/getlantern/golog.TestError (golog_test.go:999) -ERROR myprefix: golog_test.go:999 at testing.tRunner (testing.go:999) -ERROR myprefix: golog_test.go:999 at runtime.goexit (asm_amd999.s:999) -ERROR myprefix: golog_test.go:999 Hello true [cvarA=a cvarB=b cvarC=c error=%v %v error_location=github.com/getlantern/golog.TestError (golog_test.go:999) error_text=Hello true error_type=errors.Error op=name999 root_op=name999] -ERROR myprefix: golog_test.go:999 at github.com/getlantern/golog.TestError (golog_test.go:999) -ERROR myprefix: golog_test.go:999 at testing.tRunner (testing.go:999) -ERROR myprefix: golog_test.go:999 at runtime.goexit (asm_amd999.s:999) -ERROR myprefix: golog_test.go:999 Caused by: Hello -ERROR myprefix: golog_test.go:999 at github.com/getlantern/golog.TestError (golog_test.go:999) -ERROR myprefix: golog_test.go:999 at testing.tRunner (testing.go:999) -ERROR myprefix: golog_test.go:999 at runtime.goexit (asm_amd999.s:999) -` - expectedTraceLog = "TRACE myprefix: golog_test.go:999 Hello world\nTRACE myprefix: golog_test.go:999 Hello true\nTRACE myprefix: golog_test.go:999 Gravy\nTRACE myprefix: golog_test.go:999 TraceWriter closed due to unexpected error: EOF\n" - expectedStdLog = expectedLog -) - -var ( - replaceNumbers = regexp.MustCompile("[0-9]+") -) - -func init() { - ops.SetGlobal("global", "shouldn't show up") -} - -func expected(severity string, log string) string { - return strings.Replace(log, "SEVERITY", severity, -1) -} - -func normalized(log string) string { - return replaceNumbers.ReplaceAllString(log, "999") -} - -func TestReport(t *testing.T) { - SetOutputs(ioutil.Discard, ioutil.Discard) - OnFatal(func(err error) { - // ignore (prevents test from exiting) - }) - - errors := 0 - fatals := 0 - RegisterReporter(func(err error, linePrefix string, severity Severity, ctx map[string]interface{}) { - switch severity { - case ERROR: - errors++ - case FATAL: - fatals++ - } - }) - l := LoggerFor("reporting") - l.Error("Some error") - l.Fatal("Fatal error") - assert.Equal(t, 1, errors) - assert.Equal(t, 1, fatals) -} - -func TestDebug(t *testing.T) { - out := newBuffer() - SetOutputs(ioutil.Discard, out) - l := LoggerFor("myprefix") - l.Debug("Hello world") - defer ops.Begin("name").Set("cvarA", "a").Set("cvarB", "b").End() - l.Debugf("Hello %v", true) - assert.Equal(t, expected("DEBUG", expectedLog), out.String()) -} - -func TestError(t *testing.T) { - out := newBuffer() - SetOutputs(out, ioutil.Discard) - l := LoggerFor("myprefix") - ctx := ops.Begin("name").Set("cvarC", "c") - err := errorReturner() - err1 := errors.New("Hello %v", err) - err2 := errors.New("Hello") - ctx.End() - l.Error(err1) - defer ops.Begin("name2").Set("cvarA", "a").Set("cvarB", "b").End() - l.Errorf("%v %v", err2, true) - t.Log(out.String()) - assert.Equal(t, expectedErrorLog, out.String()) -} - -func errorReturner() error { - defer ops.Begin("name").Set("cvarD", "d").End() - return errors.New("world") -} - -func TestTraceEnabled(t *testing.T) { - originalTrace := os.Getenv("TRACE") - err := os.Setenv("TRACE", "true") - if err != nil { - t.Fatalf("Unable to set trace to true") - } - defer func() { - if err := os.Setenv("TRACE", originalTrace); err != nil { - t.Fatalf("Unable to set TRACE environment variable: %v", err) - } - }() - - out := newBuffer() - SetOutputs(ioutil.Discard, out) - l := LoggerFor("myprefix") - l.Trace("Hello world") - l.Tracef("Hello %v", true) - tw := l.TraceOut() - if _, err := tw.Write([]byte("Gravy\n")); err != nil { - t.Fatalf("Unable to write: %v", err) - } - if err := tw.(io.Closer).Close(); err != nil { - t.Fatalf("Unable to close: %v", err) - } - - // Give trace writer a moment to catch up - time.Sleep(50 * time.Millisecond) - assert.Regexp(t, expected("TRACE", expectedTraceLog), out.String()) -} - -func TestTraceDisabled(t *testing.T) { - originalTrace := os.Getenv("TRACE") - err := os.Setenv("TRACE", "false") - if err != nil { - t.Fatalf("Unable to set trace to false") - } - defer func() { - if err := os.Setenv("TRACE", originalTrace); err != nil { - t.Fatalf("Unable to set TRACE environment variable: %v", err) - } - }() - - out := newBuffer() - SetOutputs(ioutil.Discard, out) - l := LoggerFor("myprefix") - l.Trace("Hello world") - l.Tracef("Hello %v", true) - if _, err := l.TraceOut().Write([]byte("Gravy\n")); err != nil { - t.Fatalf("Unable to write: %v", err) - } - - // Give trace writer a moment to catch up - time.Sleep(50 * time.Millisecond) - - assert.Equal(t, "", out.String(), "Nothing should have been logged") -} - -func TestAsStdLogger(t *testing.T) { - out := newBuffer() - SetOutputs(out, ioutil.Discard) - l := LoggerFor("myprefix") - stdlog := l.AsStdLogger() - stdlog.Print("Hello world") - defer ops.Begin("name").Set("cvarA", "a").Set("cvarB", "b").End() - stdlog.Printf("Hello %v", true) - assert.Equal(t, expected("ERROR", expectedStdLog), out.String()) -} - -// TODO: TraceWriter appears to have been broken since we added line numbers -// func TestTraceWriter(t *testing.T) { -// originalTrace := os.Getenv("TRACE") -// err := os.Setenv("TRACE", "true") -// if err != nil { -// t.Fatalf("Unable to set trace to true") -// } -// defer func() { -// if err := os.Setenv("TRACE", originalTrace); err != nil { -// t.Fatalf("Unable to set TRACE environment variable: %v", err) -// } -// }() -// -// out := newBuffer() -// SetOutputs(ioutil.Discard, out) -// l := LoggerFor("myprefix") -// trace := l.TraceOut() -// trace.Write([]byte("Hello world\n")) -// defer ops.Begin().Set("cvarA", "a").Set("cvarB", "b").End() -// trace.Write([]byte("Hello true\n")) -// assert.Equal(t, expected("TRACE", expectedStdLog), out.String()) -// } - -func newBuffer() *synchronizedbuffer { - return &synchronizedbuffer{orig: &bytes.Buffer{}} -} - -type synchronizedbuffer struct { - orig *bytes.Buffer - mutex sync.RWMutex -} - -func (buf *synchronizedbuffer) Write(p []byte) (int, error) { - buf.mutex.Lock() - defer buf.mutex.Unlock() - return buf.orig.Write(p) -} - -func (buf *synchronizedbuffer) String() string { - buf.mutex.RLock() - defer buf.mutex.RUnlock() - return normalized(buf.orig.String()) -} |