get.pme.sh/pnats@v0.0.0-20240304004023-26bb5a137ed0/logger/syslog_windows_test.go (about) 1 // Copyright 2012-2018 The NATS Authors 2 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // you may not use this file except in compliance with the License. 4 // You may obtain a copy of the License at 5 // 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 //go:build windows 15 // +build windows 16 17 package logger 18 19 import ( 20 "os/exec" 21 "strings" 22 "testing" 23 24 "golang.org/x/sys/windows/svc/eventlog" 25 ) 26 27 // Skips testing if we do not have privledges to run this test. 28 // This lets us skip the tests for general (non admin/system) users. 29 func checkPrivledges(t *testing.T) { 30 src := "NATS-eventlog-testsource" 31 defer eventlog.Remove(src) 32 if err := eventlog.InstallAsEventCreate(src, eventlog.Info|eventlog.Error|eventlog.Warning); err != nil { 33 if strings.Contains(err.Error(), "Access is denied") { 34 // Skip this test because elevated privileges are required. 35 t.SkipNow() 36 } 37 // let the tests report other types of errors 38 } 39 } 40 41 // lastLogEntryContains reads the last entry (/c:1 /rd:true) written 42 // to the event log by the NATS-Server source, returning true if the 43 // passed text was found, false otherwise. 44 func lastLogEntryContains(t *testing.T, text string) bool { 45 var output []byte 46 var err error 47 48 cmd := exec.Command("wevtutil.exe", "qe", "Application", "/q:*[System[Provider[@Name='NATS-Server']]]", 49 "/rd:true", "/c:1") 50 if output, err = cmd.Output(); err != nil { 51 t.Fatalf("Unable to execute command: %v", err) 52 } 53 return strings.Contains(string(output), text) 54 } 55 56 // TestSysLogger tests event logging on windows 57 func TestSysLogger(t *testing.T) { 58 checkPrivledges(t) 59 logger := NewSysLogger(false, false) 60 if logger.debug { 61 t.Fatalf("Expected %t, received %t\n", false, logger.debug) 62 } 63 64 if logger.trace { 65 t.Fatalf("Expected %t, received %t\n", false, logger.trace) 66 } 67 logger.Noticef("%s", "Noticef") 68 if !lastLogEntryContains(t, "[NOTICE]: Noticef") { 69 t.Fatalf("missing log entry") 70 } 71 72 logger.Errorf("%s", "Errorf") 73 if !lastLogEntryContains(t, "[ERROR]: Errorf") { 74 t.Fatalf("missing log entry") 75 } 76 77 logger.Tracef("%s", "Tracef") 78 if lastLogEntryContains(t, "Tracef") { 79 t.Fatalf("should not contain log entry") 80 } 81 82 logger.Debugf("%s", "Debugf") 83 if lastLogEntryContains(t, "Debugf") { 84 t.Fatalf("should not contain log entry") 85 } 86 } 87 88 // TestSysLoggerWithDebugAndTrace tests event logging 89 func TestSysLoggerWithDebugAndTrace(t *testing.T) { 90 checkPrivledges(t) 91 logger := NewSysLogger(true, true) 92 if !logger.debug { 93 t.Fatalf("Expected %t, received %t\n", true, logger.debug) 94 } 95 96 if !logger.trace { 97 t.Fatalf("Expected %t, received %t\n", true, logger.trace) 98 } 99 100 logger.Tracef("%s", "Tracef") 101 if !lastLogEntryContains(t, "[TRACE]: Tracef") { 102 t.Fatalf("missing log entry") 103 } 104 105 logger.Debugf("%s", "Debugf") 106 if !lastLogEntryContains(t, "[DEBUG]: Debugf") { 107 t.Fatalf("missing log entry") 108 } 109 } 110 111 // TestSysLoggerWithDebugAndTrace tests remote event logging 112 func TestRemoteSysLoggerWithDebugAndTrace(t *testing.T) { 113 checkPrivledges(t) 114 logger := NewRemoteSysLogger("", true, true) 115 if !logger.debug { 116 t.Fatalf("Expected %t, received %t\n", true, logger.debug) 117 } 118 119 if !logger.trace { 120 t.Fatalf("Expected %t, received %t\n", true, logger.trace) 121 } 122 logger.Tracef("NATS %s", "[TRACE]: Remote Noticef") 123 if !lastLogEntryContains(t, "Remote Noticef") { 124 t.Fatalf("missing log entry") 125 } 126 } 127 128 func TestSysLoggerFatalf(t *testing.T) { 129 defer func() { 130 if r := recover(); r != nil { 131 if !lastLogEntryContains(t, "[FATAL]: Fatalf") { 132 t.Fatalf("missing log entry") 133 } 134 } 135 }() 136 137 checkPrivledges(t) 138 logger := NewSysLogger(true, true) 139 logger.Fatalf("%s", "Fatalf") 140 t.Fatalf("did not panic when expected to") 141 }