get.pme.sh/pnats@v0.0.0-20240304004023-26bb5a137ed0/logger/syslog_test.go (about)

     1  // Copyright 2012-2019 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  	"fmt"
    21  	"log"
    22  	"net"
    23  	"os"
    24  	"path/filepath"
    25  	"strings"
    26  	"testing"
    27  	"time"
    28  )
    29  
    30  var serverFQN string
    31  
    32  func TestSysLogger(t *testing.T) {
    33  	logger := NewSysLogger(false, false)
    34  
    35  	if logger.debug {
    36  		t.Fatalf("Expected %t, received %t\n", false, logger.debug)
    37  	}
    38  
    39  	if logger.trace {
    40  		t.Fatalf("Expected %t, received %t\n", false, logger.trace)
    41  	}
    42  }
    43  
    44  func TestSysLoggerWithDebugAndTrace(t *testing.T) {
    45  	logger := NewSysLogger(true, true)
    46  
    47  	if !logger.debug {
    48  		t.Fatalf("Expected %t, received %t\n", true, logger.debug)
    49  	}
    50  
    51  	if !logger.trace {
    52  		t.Fatalf("Expected %t, received %t\n", true, logger.trace)
    53  	}
    54  }
    55  
    56  func testTag(t *testing.T, exePath, expected string) {
    57  	os.Args[0] = exePath
    58  	if result := GetSysLoggerTag(); result != expected {
    59  		t.Fatalf("Expected %s, received %s", expected, result)
    60  	}
    61  }
    62  
    63  func restoreArg(orig string) {
    64  	os.Args[0] = orig
    65  }
    66  
    67  func TestSysLoggerTagGen(t *testing.T) {
    68  	origArg := os.Args[0]
    69  	defer restoreArg(origArg)
    70  
    71  	testTag(t, "nats-server", "nats-server")
    72  	testTag(t, filepath.Join(".", "nats-server"), "nats-server")
    73  	testTag(t, filepath.Join("home", "bin", "nats-server"), "nats-server")
    74  	testTag(t, filepath.Join("..", "..", "nats-server"), "nats-server")
    75  	testTag(t, "nats-server.service1", "nats-server.service1")
    76  	testTag(t, "nats-server_service1", "nats-server_service1")
    77  	testTag(t, "nats-server-service1", "nats-server-service1")
    78  	testTag(t, "nats-server service1", "nats-server service1")
    79  }
    80  
    81  func TestSysLoggerTag(t *testing.T) {
    82  	origArg := os.Args[0]
    83  	defer restoreArg(origArg)
    84  
    85  	os.Args[0] = "ServerLoggerTag"
    86  
    87  	done := make(chan string)
    88  	startServer(done)
    89  	logger := NewRemoteSysLogger(serverFQN, true, true)
    90  	logger.Noticef("foo")
    91  
    92  	line := <-done
    93  	data := strings.Split(line, "[")
    94  	if len(data) != 2 {
    95  		t.Fatalf("Unexpected syslog line %s\n", line)
    96  	}
    97  
    98  	if !strings.Contains(data[0], os.Args[0]) {
    99  		t.Fatalf("Expected '%s', received '%s'\n", os.Args[0], data[0])
   100  	}
   101  }
   102  
   103  func TestRemoteSysLogger(t *testing.T) {
   104  	done := make(chan string)
   105  	startServer(done)
   106  	logger := NewRemoteSysLogger(serverFQN, true, true)
   107  
   108  	if !logger.debug {
   109  		t.Fatalf("Expected %t, received %t\n", true, logger.debug)
   110  	}
   111  
   112  	if !logger.trace {
   113  		t.Fatalf("Expected %t, received %t\n", true, logger.trace)
   114  	}
   115  	logger.Noticef("foo")
   116  	<-done
   117  }
   118  
   119  func TestRemoteSysLoggerNotice(t *testing.T) {
   120  	done := make(chan string)
   121  	startServer(done)
   122  	logger := NewRemoteSysLogger(serverFQN, true, true)
   123  
   124  	logger.Noticef("foo %s", "bar")
   125  	expectSyslogOutput(t, <-done, "foo bar\n")
   126  }
   127  
   128  func TestRemoteSysLoggerDebug(t *testing.T) {
   129  	done := make(chan string)
   130  	startServer(done)
   131  	logger := NewRemoteSysLogger(serverFQN, true, true)
   132  
   133  	logger.Debugf("foo %s", "qux")
   134  	expectSyslogOutput(t, <-done, "foo qux\n")
   135  }
   136  
   137  func TestRemoteSysLoggerDebugDisabled(t *testing.T) {
   138  	done := make(chan string)
   139  	startServer(done)
   140  	logger := NewRemoteSysLogger(serverFQN, false, false)
   141  
   142  	logger.Debugf("foo %s", "qux")
   143  	rcvd := <-done
   144  	if rcvd != "" {
   145  		t.Fatalf("Unexpected syslog response %s\n", rcvd)
   146  	}
   147  }
   148  
   149  func TestRemoteSysLoggerTrace(t *testing.T) {
   150  	done := make(chan string)
   151  	startServer(done)
   152  	logger := NewRemoteSysLogger(serverFQN, true, true)
   153  
   154  	logger.Tracef("foo %s", "qux")
   155  	expectSyslogOutput(t, <-done, "foo qux\n")
   156  }
   157  
   158  func TestRemoteSysLoggerTraceDisabled(t *testing.T) {
   159  	done := make(chan string)
   160  	startServer(done)
   161  	logger := NewRemoteSysLogger(serverFQN, true, false)
   162  
   163  	logger.Tracef("foo %s", "qux")
   164  	rcvd := <-done
   165  	if rcvd != "" {
   166  		t.Fatalf("Unexpected syslog response %s\n", rcvd)
   167  	}
   168  }
   169  
   170  func TestGetNetworkAndAddrUDP(t *testing.T) {
   171  	n, a := getNetworkAndAddr("udp://foo.com:1000")
   172  
   173  	if n != "udp" {
   174  		t.Fatalf("Unexpected network %s\n", n)
   175  	}
   176  
   177  	if a != "foo.com:1000" {
   178  		t.Fatalf("Unexpected addr %s\n", a)
   179  	}
   180  }
   181  
   182  func TestGetNetworkAndAddrTCP(t *testing.T) {
   183  	n, a := getNetworkAndAddr("tcp://foo.com:1000")
   184  
   185  	if n != "tcp" {
   186  		t.Fatalf("Unexpected network %s\n", n)
   187  	}
   188  
   189  	if a != "foo.com:1000" {
   190  		t.Fatalf("Unexpected addr %s\n", a)
   191  	}
   192  }
   193  
   194  func TestGetNetworkAndAddrUnix(t *testing.T) {
   195  	n, a := getNetworkAndAddr("unix:///foo.sock")
   196  
   197  	if n != "unix" {
   198  		t.Fatalf("Unexpected network %s\n", n)
   199  	}
   200  
   201  	if a != "/foo.sock" {
   202  		t.Fatalf("Unexpected addr %s\n", a)
   203  	}
   204  }
   205  func expectSyslogOutput(t *testing.T, line string, expected string) {
   206  	data := strings.Split(line, "]: ")
   207  	if len(data) != 2 {
   208  		t.Fatalf("Unexpected syslog line %s\n", line)
   209  	}
   210  
   211  	if data[1] != expected {
   212  		t.Fatalf("Expected '%s', received '%s'\n", expected, data[1])
   213  	}
   214  }
   215  
   216  func runSyslog(c net.PacketConn, done chan<- string) {
   217  	var buf [4096]byte
   218  	var rcvd string
   219  	for {
   220  		n, _, err := c.ReadFrom(buf[:])
   221  		if err != nil || n == 0 {
   222  			break
   223  		}
   224  		rcvd += string(buf[:n])
   225  	}
   226  	done <- rcvd
   227  }
   228  
   229  func startServer(done chan<- string) {
   230  	c, e := net.ListenPacket("udp", "127.0.0.1:0")
   231  	if e != nil {
   232  		log.Fatalf("net.ListenPacket failed udp :0 %v", e)
   233  	}
   234  
   235  	serverFQN = fmt.Sprintf("udp://%s", c.LocalAddr().String())
   236  	c.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
   237  	go runSyslog(c, done)
   238  }