140 lines
3.9 KiB
Go
Executable File
140 lines
3.9 KiB
Go
Executable File
// Copyright 2012-2018 The NATS Authors
|
|
// 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.
|
|
|
|
// +build windows
|
|
|
|
package logger
|
|
|
|
import (
|
|
"os/exec"
|
|
"strings"
|
|
"testing"
|
|
|
|
"golang.org/x/sys/windows/svc/eventlog"
|
|
)
|
|
|
|
// Skips testing if we do not have privledges to run this test.
|
|
// This lets us skip the tests for general (non admin/system) users.
|
|
func checkPrivledges(t *testing.T) {
|
|
src := "NATS-eventlog-testsource"
|
|
defer eventlog.Remove(src)
|
|
if err := eventlog.InstallAsEventCreate(src, eventlog.Info|eventlog.Error|eventlog.Warning); err != nil {
|
|
if strings.Contains(err.Error(), "Access is denied") {
|
|
t.Skip("skipping: elevated privledges are required.")
|
|
}
|
|
// let the tests report other types of errors
|
|
}
|
|
}
|
|
|
|
// lastLogEntryContains reads the last entry (/c:1 /rd:true) written
|
|
// to the event log by the NATS-Server source, returning true if the
|
|
// passed text was found, false otherwise.
|
|
func lastLogEntryContains(t *testing.T, text string) bool {
|
|
var output []byte
|
|
var err error
|
|
|
|
cmd := exec.Command("wevtutil.exe", "qe", "Application", "/q:*[System[Provider[@Name='NATS-Server']]]",
|
|
"/rd:true", "/c:1")
|
|
if output, err = cmd.Output(); err != nil {
|
|
t.Fatalf("Unable to execute command: %v", err)
|
|
}
|
|
return strings.Contains(string(output), text)
|
|
}
|
|
|
|
// TestSysLogger tests event logging on windows
|
|
func TestSysLogger(t *testing.T) {
|
|
checkPrivledges(t)
|
|
logger := NewSysLogger(false, false)
|
|
if logger.debug {
|
|
t.Fatalf("Expected %t, received %t\n", false, logger.debug)
|
|
}
|
|
|
|
if logger.trace {
|
|
t.Fatalf("Expected %t, received %t\n", false, logger.trace)
|
|
}
|
|
logger.Noticef("%s", "Noticef")
|
|
if !lastLogEntryContains(t, "[NOTICE]: Noticef") {
|
|
t.Fatalf("missing log entry")
|
|
}
|
|
|
|
logger.Errorf("%s", "Errorf")
|
|
if !lastLogEntryContains(t, "[ERROR]: Errorf") {
|
|
t.Fatalf("missing log entry")
|
|
}
|
|
|
|
logger.Tracef("%s", "Tracef")
|
|
if lastLogEntryContains(t, "Tracef") {
|
|
t.Fatalf("should not contain log entry")
|
|
}
|
|
|
|
logger.Debugf("%s", "Debugf")
|
|
if lastLogEntryContains(t, "Debugf") {
|
|
t.Fatalf("should not contain log entry")
|
|
}
|
|
}
|
|
|
|
// TestSysLoggerWithDebugAndTrace tests event logging
|
|
func TestSysLoggerWithDebugAndTrace(t *testing.T) {
|
|
checkPrivledges(t)
|
|
logger := NewSysLogger(true, true)
|
|
if !logger.debug {
|
|
t.Fatalf("Expected %t, received %t\n", true, logger.debug)
|
|
}
|
|
|
|
if !logger.trace {
|
|
t.Fatalf("Expected %t, received %t\n", true, logger.trace)
|
|
}
|
|
|
|
logger.Tracef("%s", "Tracef")
|
|
if !lastLogEntryContains(t, "[TRACE]: Tracef") {
|
|
t.Fatalf("missing log entry")
|
|
}
|
|
|
|
logger.Debugf("%s", "Debugf")
|
|
if !lastLogEntryContains(t, "[DEBUG]: Debugf") {
|
|
t.Fatalf("missing log entry")
|
|
}
|
|
}
|
|
|
|
// TestSysLoggerWithDebugAndTrace tests remote event logging
|
|
func TestRemoteSysLoggerWithDebugAndTrace(t *testing.T) {
|
|
checkPrivledges(t)
|
|
logger := NewRemoteSysLogger("", true, true)
|
|
if !logger.debug {
|
|
t.Fatalf("Expected %t, received %t\n", true, logger.debug)
|
|
}
|
|
|
|
if !logger.trace {
|
|
t.Fatalf("Expected %t, received %t\n", true, logger.trace)
|
|
}
|
|
logger.Tracef("NATS %s", "[TRACE]: Remote Noticef")
|
|
if !lastLogEntryContains(t, "Remote Noticef") {
|
|
t.Fatalf("missing log entry")
|
|
}
|
|
}
|
|
|
|
func TestSysLoggerFatalf(t *testing.T) {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
if !lastLogEntryContains(t, "[FATAL]: Fatalf") {
|
|
t.Fatalf("missing log entry")
|
|
}
|
|
}
|
|
}()
|
|
|
|
checkPrivledges(t)
|
|
logger := NewSysLogger(true, true)
|
|
logger.Fatalf("%s", "Fatalf")
|
|
t.Fatalf("did not panic when expected to")
|
|
}
|