2019-08-29 05:34:44 +08:00
//+build windows
package logger
import (
"bytes"
"encoding/xml"
"log"
"os/exec"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
2021-01-20 00:03:19 +08:00
"golang.org/x/sys/windows/svc/eventlog"
2019-08-29 05:34:44 +08:00
)
type Levels int
const (
Info Levels = iota + 1
Warning
Error
)
type Event struct {
Message string ` xml:"EventData>Data" `
Level Levels ` xml:"System>EventID" `
}
func getEventLog ( t * testing . T , since time . Time ) [ ] Event {
timeStr := since . UTC ( ) . Format ( time . RFC3339 )
2021-01-20 00:03:19 +08:00
timeStr = timeStr [ : 19 ]
cmd := exec . Command ( "wevtutil" , "qe" , "Application" , "/rd:true" , "/q:Event[System[TimeCreated[@SystemTime >= '" + timeStr + "'] and Provider[@Name='telegraf']]]" )
2019-08-29 05:34:44 +08:00
var out bytes . Buffer
cmd . Stdout = & out
err := cmd . Run ( )
require . NoError ( t , err )
xmlStr := "<events>" + out . String ( ) + "</events>"
var events struct {
Events [ ] Event ` xml:"Event" `
}
err = xml . Unmarshal ( [ ] byte ( xmlStr ) , & events )
require . NoError ( t , err )
return events . Events
}
func TestEventLog ( t * testing . T ) {
if testing . Short ( ) {
t . Skip ( "Skipping integration test in short mode" )
}
prepareLogger ( t )
config := LogConfig {
LogTarget : LogTargetEventlog ,
Logfile : "" ,
}
SetupLogging ( config )
now := time . Now ( )
log . Println ( "I! Info message" )
log . Println ( "W! Warn message" )
log . Println ( "E! Err message" )
events := getEventLog ( t , now )
assert . Len ( t , events , 3 )
assert . Contains ( t , events , Event { Message : "Info message" , Level : Info } )
assert . Contains ( t , events , Event { Message : "Warn message" , Level : Warning } )
assert . Contains ( t , events , Event { Message : "Err message" , Level : Error } )
}
func TestRestrictedEventLog ( t * testing . T ) {
if testing . Short ( ) {
t . Skip ( "Skipping integration test in short mode" )
}
prepareLogger ( t )
config := LogConfig {
LogTarget : LogTargetEventlog ,
Quiet : true ,
}
SetupLogging ( config )
//separate previous log messages by small delay
time . Sleep ( time . Second )
now := time . Now ( )
log . Println ( "I! Info message" )
log . Println ( "W! Warning message" )
log . Println ( "E! Error message" )
events := getEventLog ( t , now )
assert . Len ( t , events , 1 )
assert . Contains ( t , events , Event { Message : "Error message" , Level : Error } )
}
func prepareLogger ( t * testing . T ) {
2021-01-20 00:03:19 +08:00
eventLog , err := eventlog . Open ( "telegraf" )
2019-08-29 05:34:44 +08:00
require . NoError ( t , err )
2021-01-20 00:03:19 +08:00
require . NotNil ( t , eventLog )
registerLogger ( LogTargetEventlog , & eventLoggerCreator { logger : eventLog } )
2019-08-29 05:34:44 +08:00
}