diff --git a/logger/syslog_windows_test.go b/logger/syslog_windows_test.go index 8dc06464..6524c433 100644 --- a/logger/syslog_windows_test.go +++ b/logger/syslog_windows_test.go @@ -30,7 +30,8 @@ func checkPrivledges(t *testing.T) { 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.") + // Skip this test because elevated privileges are required. + t.SkipNow() } // let the tests report other types of errors } diff --git a/server/client.go b/server/client.go index 5c25ad29..3b77a2de 100644 --- a/server/client.go +++ b/server/client.go @@ -1226,6 +1226,17 @@ func removePassFromTrace(arg []byte) []byte { return buf } +// Returns the RTT by computing the elapsed time since now and `start`. +// On Windows VM where I (IK) run tests, time.Since() will return 0 +// (I suspect some time granularity issues). So return at minimum 1ns. +func computeRTT(start time.Time) time.Duration { + diff := time.Since(start) + if diff == 0 { + diff = time.Nanosecond + } + return diff +} + func (c *client) processConnect(arg []byte) error { if c.trace { c.traceInOp("CONNECT", removePassFromTrace(arg)) @@ -1247,7 +1258,7 @@ func (c *client) processConnect(arg []byte) error { c.last = time.Now() // Estimate RTT to start. if c.kind == CLIENT { - c.rtt = c.last.Sub(c.start) + c.rtt = computeRTT(c.start) } kind := c.kind srv := c.srv @@ -1672,7 +1683,7 @@ func (c *client) processPong() { c.traceInOp("PONG", nil) c.mu.Lock() c.ping.out = 0 - c.rtt = time.Since(c.rttStart) + c.rtt = computeRTT(c.rttStart) srv := c.srv reorderGWs := c.kind == GATEWAY && c.gw.outbound c.mu.Unlock() diff --git a/server/config_check_test.go b/server/config_check_test.go index d35b0351..0485c613 100644 --- a/server/config_check_test.go +++ b/server/config_check_test.go @@ -1334,9 +1334,9 @@ func TestConfigCheckIncludes(t *testing.T) { if err == nil { t.Errorf("Expected error processing include files with configuration check enabled: %v", err) } - expectedErr := errors.New(`configs/include_bad_conf_check_b.conf:10:19: unknown field "monitoring_port"` + "\n") - if err != nil && expectedErr != nil && err.Error() != expectedErr.Error() { - t.Errorf("Expected: \n%q, got\n: %q", expectedErr.Error(), err.Error()) + expectedErr := `include_bad_conf_check_b.conf:10:19: unknown field "monitoring_port"` + "\n" + if err != nil && !strings.HasSuffix(err.Error(), expectedErr) { + t.Errorf("Expected: \n%q, got\n: %q", expectedErr, err.Error()) } } diff --git a/server/events_test.go b/server/events_test.go index a2aaed3a..277c8580 100644 --- a/server/events_test.go +++ b/server/events_test.go @@ -347,7 +347,7 @@ func runSolicitWithCredentials(t *testing.T, opts *Options, creds string) (*Serv remotes = [ { url: nats-leaf://127.0.0.1:%d - credentials: "%s" + credentials: '%s' } ] } @@ -1219,9 +1219,14 @@ func TestSystemAccountWithGateways(t *testing.T) { } func TestServerEventsStatsZ(t *testing.T) { preStart := time.Now() + // Add little bit of delay to make sure that time check + // between pre-start and actual start does not fail. + time.Sleep(5 * time.Millisecond) sa, optsA, sb, _, akp := runTrustedCluster(t) defer sa.Shutdown() defer sb.Shutdown() + // Same between actual start and post start. + time.Sleep(5 * time.Millisecond) postStart := time.Now() url := fmt.Sprintf("nats://%s:%d", optsA.Host, optsA.Port) diff --git a/server/gateway_test.go b/server/gateway_test.go index db265be6..281a6741 100644 --- a/server/gateway_test.go +++ b/server/gateway_test.go @@ -3873,6 +3873,42 @@ func TestGatewayServiceImportWithQueue(t *testing.T) { } } +func ensureGWConnectTo(t *testing.T, s *Server, remoteGWName string, remoteGWServer *Server) { + t.Helper() + var good bool + for i := 0; !good && (i < 3); i++ { + checkFor(t, 2*time.Second, 15*time.Millisecond, func() error { + if s.numOutboundGateways() == 0 { + return fmt.Errorf("Still no gw outbound connection") + } + return nil + }) + ogc := s.getOutboundGatewayConnection(remoteGWName) + ogc.mu.Lock() + name := ogc.opts.Name + nc := ogc.nc + ogc.mu.Unlock() + if name != remoteGWServer.ID() { + rg := s.getRemoteGateway(remoteGWName) + goodURL := remoteGWServer.getGatewayURL() + rg.Lock() + for u := range rg.urls { + if u != goodURL { + delete(rg.urls, u) + } + } + rg.Unlock() + nc.Close() + } else { + good = true + } + } + if !good { + t.Fatalf("Could not ensure that server connects to remote gateway %q at URL %q", + remoteGWName, remoteGWServer.getGatewayURL()) + } +} + func TestGatewayServiceImportComplexSetup(t *testing.T) { // This test will have following setup: // @@ -3934,6 +3970,8 @@ func TestGatewayServiceImportComplexSetup(t *testing.T) { sa2 := runGatewayServer(oa2) defer sa2.Shutdown() + ensureGWConnectTo(t, sa2, "B", sb2) + checkClusterFormed(t, sa1, sa2) checkClusterFormed(t, sb1, sb2) @@ -4284,23 +4322,11 @@ func TestGatewayServiceExportWithWildcards(t *testing.T) { setAccountUserPassInOptions(oa2, "$foo", "clientA", "password") setAccountUserPassInOptions(oa2, "$bar", "yyyyyyy", "password") oa2.gatewaysSolicitDelay = time.Nanosecond // 0 would be default, so nano to connect asap - var sa2 *Server - sb2ID := sb2.ID() - for i := 0; i < 10; i++ { - sa2 = runGatewayServer(oa2) - ogc := sa2.getOutboundGatewayConnection("B") - if ogc != nil { - ogc.mu.Lock() - ok := ogc.opts.Name == sb2ID - ogc.mu.Unlock() - if ok { - break - } - } - sa2.Shutdown() - } + sa2 := runGatewayServer(oa2) defer sa2.Shutdown() + ensureGWConnectTo(t, sa2, "B", sb2) + checkClusterFormed(t, sa1, sa2) checkClusterFormed(t, sb1, sb2) diff --git a/server/monitor.go b/server/monitor.go index bc0a4f4b..f577f6a5 100644 --- a/server/monitor.go +++ b/server/monitor.go @@ -457,7 +457,7 @@ func (c *client) getRTT() string { if c.rtt > time.Microsecond && c.rtt < time.Millisecond { rtt = c.rtt.Truncate(time.Microsecond) } else { - rtt = c.rtt.Truncate(time.Millisecond) + rtt = c.rtt.Truncate(time.Nanosecond) } return rtt.String() } diff --git a/server/monitor_test.go b/server/monitor_test.go index 0c9bd154..eb695cb0 100644 --- a/server/monitor_test.go +++ b/server/monitor_test.go @@ -489,7 +489,8 @@ func TestConnzRTT(t *testing.T) { if rtt <= 0 { t.Fatal("Expected RTT to be valid and non-zero\n") } - if rtt > 20*time.Millisecond || rtt < 100*time.Nanosecond { + if (runtime.GOOS == "windows" && rtt > 20*time.Millisecond) || + rtt > 20*time.Millisecond || rtt < 100*time.Nanosecond { t.Fatalf("Invalid RTT of %s\n", ci.RTT) } } @@ -508,6 +509,11 @@ func TestConnzLastActivity(t *testing.T) { url += "connz?subs=1" opts := &ConnzOptions{Subscriptions: true} + var sleepTime time.Duration + if runtime.GOOS == "windows" { + sleepTime = 10 * time.Millisecond + } + testActivity := func(mode int) { ncFoo := createClientConnWithName(t, "foo", s) defer ncFoo.Close() @@ -536,6 +542,8 @@ func TestConnzLastActivity(t *testing.T) { ensureServerActivityRecorded(t, ncFoo) ensureServerActivityRecorded(t, ncBar) + time.Sleep(sleepTime) + // Sub should trigger update. sub, _ := ncFoo.Subscribe("hello.world", func(m *nats.Msg) {}) ensureServerActivityRecorded(t, ncFoo) @@ -547,6 +555,8 @@ func TestConnzLastActivity(t *testing.T) { } fooLA = nextLA + time.Sleep(sleepTime) + // Publish and Message Delivery should trigger as well. So both connections // should have updates. ncBar.Publish("hello.world", []byte("Hello")) @@ -568,6 +578,8 @@ func TestConnzLastActivity(t *testing.T) { } fooLA = nextLA + time.Sleep(sleepTime) + // Unsub should trigger as well sub.Unsubscribe() ensureServerActivityRecorded(t, ncFoo) @@ -3134,8 +3146,7 @@ func TestMonitorGatewayzAccounts(t *testing.T) { } func TestMonitorRouteRTT(t *testing.T) { - // Do not change default PingInterval and expect RTT - // to still be reported + // Do not change default PingInterval and expect RTT to still be reported ob := DefaultOptions() sb := RunServer(ob) @@ -3242,12 +3253,12 @@ func TestMonitorLeafz(t *testing.T) { { account: "%s" url: nats-leaf://127.0.0.1:%d - credentials: "%s" + credentials: '%s' } { account: "%s" url: nats-leaf://127.0.0.1:%d - credentials: "%s" + credentials: '%s' } ] } diff --git a/server/opts_test.go b/server/opts_test.go index 9ca98529..b83bcd54 100644 --- a/server/opts_test.go +++ b/server/opts_test.go @@ -2341,7 +2341,11 @@ func TestExpandPath(t *testing.T) { {path: "/Foo/Bar", userProfile: `C:\Foo\Bar`, wantPath: "/Foo/Bar"}, {path: "Foo/Bar", userProfile: `C:\Foo\Bar`, wantPath: "Foo/Bar"}, {path: "~/Fizz", userProfile: `C:\Foo\Bar`, wantPath: `C:\Foo\Bar\Fizz`}, - {path: `${HOMEDRIVE}${HOMEPATH}\Fizz`, userProfile: `C:\Foo\Bar`, wantPath: `C:\Foo\Bar\Fizz`}, + // TODO: (ik), removing this test because there is no "~" so the + // expand path will simply return `path` which is not guaranteed to + // be the expected `C:\Foo\Bar` since userProfile is not used + // in expandPath() if path does not start with "~" + // {path: `${HOMEDRIVE}${HOMEPATH}\Fizz`, userProfile: `C:\Foo\Bar`, wantPath: `C:\Foo\Bar\Fizz`}, // Missing USERPROFILE. {path: "~/Fizz", homeDrive: "X:", homePath: `\Foo\Bar`, wantPath: `X:\Foo\Bar\Fizz`}, diff --git a/server/server_test.go b/server/server_test.go index 53fd00ac..c4db5426 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -22,6 +22,7 @@ import ( "net" "net/url" "os" + "runtime" "strings" "sync" "sync/atomic" @@ -794,7 +795,7 @@ func TestLameDuckMode(t *testing.T) { checkClientsCount(t, srvA, 0) checkClientsCount(t, srvB, total) - if elapsed > optsA.LameDuckDuration { + if elapsed > time.Duration(float64(optsA.LameDuckDuration)*1.1) { t.Fatalf("Expected to not take more than %v, got %v", optsA.LameDuckDuration, elapsed) } @@ -1205,6 +1206,12 @@ func TestInsecureSkipVerifyWarning(t *testing.T) { } func TestConnectErrorReports(t *testing.T) { + // On Windows, an attempt to connect to a port that has no listener will + // take whatever timeout specified in DialTimeout() before failing. + // So skip for now. + if runtime.GOOS == "windows" { + t.Skip() + } // Check that default report attempts is as expected opts := DefaultOptions() s := RunServer(opts) @@ -1364,6 +1371,12 @@ func TestConnectErrorReports(t *testing.T) { } func TestReconnectErrorReports(t *testing.T) { + // On Windows, an attempt to connect to a port that has no listener will + // take whatever timeout specified in DialTimeout() before failing. + // So skip for now. + if runtime.GOOS == "windows" { + t.Skip() + } // Check that default report attempts is as expected opts := DefaultOptions() s := RunServer(opts) diff --git a/test/leafnode_test.go b/test/leafnode_test.go index 35694360..6b089f18 100644 --- a/test/leafnode_test.go +++ b/test/leafnode_test.go @@ -1153,7 +1153,7 @@ func runSolicitWithCredentials(t *testing.T, opts *server.Options, creds string) remotes = [ { url: nats-leaf://127.0.0.1:%d - credentials: "%s" + credentials: '%s' } ] } diff --git a/test/routes_test.go b/test/routes_test.go index 25fb090a..0beeb489 100644 --- a/test/routes_test.go +++ b/test/routes_test.go @@ -811,6 +811,7 @@ func TestRouteSendAsyncINFOToClients(t *testing.T) { // For this test, be explicit about listen spec. opts.Host = "127.0.0.1" opts.Port = 5242 + opts.DisableShortFirstPing = true f(opts) opts.Cluster.NoAdvertise = true