(t *testing.T)
| 1507 | } |
| 1508 | |
| 1509 | func TestReconnectToServerCallback(t *testing.T) { |
| 1510 | t.Run("select custom server", func(t *testing.T) { |
| 1511 | srv1 := RunServerOnPort(-1) |
| 1512 | defer srv1.Shutdown() |
| 1513 | srv2 := RunServerOnPort(-1) |
| 1514 | defer srv2.Shutdown() |
| 1515 | |
| 1516 | url1 := srv1.ClientURL() |
| 1517 | url2 := srv2.ClientURL() |
| 1518 | |
| 1519 | var callbackCalled atomic.Int32 |
| 1520 | reconnectCh := make(chan bool, 1) |
| 1521 | |
| 1522 | nc, err := nats.Connect( |
| 1523 | url1+","+url2, |
| 1524 | nats.ReconnectWait(100*time.Millisecond), |
| 1525 | nats.MaxReconnects(10), |
| 1526 | nats.DontRandomize(), |
| 1527 | nats.ReconnectToServer(func(servers []nats.Server, info nats.ServerInfo) (*nats.Server, time.Duration) { |
| 1528 | callbackCalled.Add(1) |
| 1529 | for i := range servers { |
| 1530 | if servers[i].URL.String() == url2 { |
| 1531 | return &servers[i], 0 |
| 1532 | } |
| 1533 | } |
| 1534 | return &servers[0], 0 |
| 1535 | }), |
| 1536 | nats.ReconnectHandler(func(_ *nats.Conn) { |
| 1537 | select { |
| 1538 | case reconnectCh <- true: |
| 1539 | default: |
| 1540 | } |
| 1541 | }), |
| 1542 | ) |
| 1543 | if err != nil { |
| 1544 | t.Fatalf("Failed to connect: %v", err) |
| 1545 | } |
| 1546 | defer nc.Close() |
| 1547 | |
| 1548 | if nc.ConnectedUrl() != url1 { |
| 1549 | t.Fatalf("Expected initial connection to %s, got %s", url1, nc.ConnectedUrl()) |
| 1550 | } |
| 1551 | |
| 1552 | // try reconnecting a few times, we should end up on url2 each time |
| 1553 | for i := range 5 { |
| 1554 | if err := nc.ForceReconnect(); err != nil { |
| 1555 | t.Fatalf("Failed to force reconnect: %v", err) |
| 1556 | } |
| 1557 | |
| 1558 | select { |
| 1559 | case <-reconnectCh: |
| 1560 | case <-time.After(2 * time.Second): |
| 1561 | t.Fatal("Timed out waiting for reconnect") |
| 1562 | } |
| 1563 | |
| 1564 | if callbackCalled.Load() != int32(i+1) { |
| 1565 | t.Fatal("Expected ReconnectToServer callback to be called on each reconnect") |
| 1566 | } |
nothing calls this directly
no test coverage detected