|
4 | 4 | "context" |
5 | 5 | "net/http" |
6 | 6 | "testing" |
| 7 | + "time" |
7 | 8 |
|
8 | 9 | "github.com/codex2api/auth" |
9 | 10 | ) |
@@ -59,3 +60,47 @@ func TestPoolKeyKeepsSameSessionStable(t *testing.T) { |
59 | 60 | t.Fatal("expected identical session keys to produce the same pool key") |
60 | 61 | } |
61 | 62 | } |
| 63 | + |
| 64 | +func TestCanReuseConnection(t *testing.T) { |
| 65 | + manager := NewManager() |
| 66 | + t.Cleanup(manager.Stop) |
| 67 | + |
| 68 | + t.Run("idle connected session can be reused", func(t *testing.T) { |
| 69 | + session := NewSession(42, manager) |
| 70 | + session.SetConnected(true) |
| 71 | + conn := &WsConnection{session: session} |
| 72 | + conn.SetState(StateConnected) |
| 73 | + conn.Touch() |
| 74 | + |
| 75 | + if !canReuseConnection(conn) { |
| 76 | + t.Fatal("expected connection to be reusable") |
| 77 | + } |
| 78 | + }) |
| 79 | + |
| 80 | + t.Run("pending request blocks reuse", func(t *testing.T) { |
| 81 | + session := NewSession(42, manager) |
| 82 | + session.SetConnected(true) |
| 83 | + pending := session.AddPendingRequest("session-a") |
| 84 | + t.Cleanup(func() { session.RemovePendingRequest(pending.RequestID) }) |
| 85 | + |
| 86 | + conn := &WsConnection{session: session} |
| 87 | + conn.SetState(StateConnected) |
| 88 | + conn.Touch() |
| 89 | + |
| 90 | + if canReuseConnection(conn) { |
| 91 | + t.Fatal("expected connection with pending request to be non-reusable") |
| 92 | + } |
| 93 | + }) |
| 94 | + |
| 95 | + t.Run("expired connection cannot be reused", func(t *testing.T) { |
| 96 | + session := NewSession(42, manager) |
| 97 | + session.SetConnected(true) |
| 98 | + conn := &WsConnection{session: session} |
| 99 | + conn.SetState(StateConnected) |
| 100 | + conn.lastUsed.Store(time.Now().Add(-IdleTimeout - time.Second).UnixNano()) |
| 101 | + |
| 102 | + if canReuseConnection(conn) { |
| 103 | + t.Fatal("expected expired connection to be non-reusable") |
| 104 | + } |
| 105 | + }) |
| 106 | +} |
0 commit comments