mirror of
https://github.com/Luzifer/cloudkeys-go.git
synced 2024-11-13 00:12:43 +00:00
68 lines
1.6 KiB
Go
68 lines
1.6 KiB
Go
// Copyright 2016 Canonical Ltd.
|
|
// Licensed under the LGPLv3, see LICENCE file for details.
|
|
|
|
package loggo_test
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"strings"
|
|
|
|
"github.com/juju/loggo"
|
|
|
|
gc "gopkg.in/check.v1"
|
|
)
|
|
|
|
func init() {
|
|
setLocationsForTags("logging_test.go")
|
|
setLocationsForTags("writer_test.go")
|
|
}
|
|
|
|
func assertLocation(c *gc.C, msg loggo.Entry, tag string) {
|
|
loc := location(tag)
|
|
c.Assert(msg.Filename, gc.Equals, loc.file)
|
|
c.Assert(msg.Line, gc.Equals, loc.line)
|
|
}
|
|
|
|
// All this location stuff is to avoid having hard coded line numbers
|
|
// in the tests. Any line where as a test writer you want to capture the
|
|
// file and line number, add a comment that has `//tag name` as the end of
|
|
// the line. The name must be unique across all the tests, and the test
|
|
// will panic if it is not. This name is then used to read the actual
|
|
// file and line numbers.
|
|
|
|
func location(tag string) Location {
|
|
loc, ok := tagToLocation[tag]
|
|
if !ok {
|
|
panic(fmt.Errorf("tag %q not found", tag))
|
|
}
|
|
return loc
|
|
}
|
|
|
|
type Location struct {
|
|
file string
|
|
line int
|
|
}
|
|
|
|
func (loc Location) String() string {
|
|
return fmt.Sprintf("%s:%d", loc.file, loc.line)
|
|
}
|
|
|
|
var tagToLocation = make(map[string]Location)
|
|
|
|
func setLocationsForTags(filename string) {
|
|
data, err := ioutil.ReadFile(filename)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
lines := strings.Split(string(data), "\n")
|
|
for i, line := range lines {
|
|
if j := strings.Index(line, "//tag "); j >= 0 {
|
|
tag := line[j+len("//tag "):]
|
|
if _, found := tagToLocation[tag]; found {
|
|
panic(fmt.Errorf("tag %q already processed previously"))
|
|
}
|
|
tagToLocation[tag] = Location{file: filename, line: i + 1}
|
|
}
|
|
}
|
|
}
|