mirror of
https://github.com/gogrlx/nats-server.git
synced 2026-04-02 03:38:42 -07:00
The use of the `svc` API prevented the NATS Server to run as a container on both nanoserver and windowsservercore Docker images. An attempt was made to replace svc.Debug with normal server.Start() if detected to be interactive, however, that did not work. The fact of detecting if interactive or not already requires connecting to the service controller apparently. This change looks up for an environment variable (NATS_DOCKERIZED) and if set to "1", will not make use of the `svc` package. This environment variable will be set in the Docker image (in nats-docker/windows/nanoserver/Dockerfile and windowsservercore/Dockerfile). Resolves #543
128 lines
3.3 KiB
Go
Executable File
128 lines
3.3 KiB
Go
Executable File
// Copyright 2016 Apcera Inc. All rights reserved.
|
|
// +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")
|
|
}
|