...

Source file src/go.mongodb.org/mongo-driver/x/mongo/driver/session/session_pool_test.go

Documentation: go.mongodb.org/mongo-driver/x/mongo/driver/session

     1  // Copyright (C) MongoDB, Inc. 2017-present.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License"); you may
     4  // not use this file except in compliance with the License. You may obtain
     5  // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
     6  
     7  package session
     8  
     9  import (
    10  	"bytes"
    11  	"testing"
    12  
    13  	"go.mongodb.org/mongo-driver/internal/assert"
    14  	"go.mongodb.org/mongo-driver/mongo/description"
    15  )
    16  
    17  func TestSessionPool(t *testing.T) {
    18  	int64ToPtr := func(i64 int64) *int64 { return &i64 }
    19  
    20  	t.Run("TestLifo", func(t *testing.T) {
    21  		descChan := make(chan description.Topology)
    22  		p := NewPool(descChan)
    23  		p.latestTopology = topologyDescription{
    24  			timeoutMinutes: int64ToPtr(30), // Set to some arbitrarily high number greater than 1 minute.
    25  		}
    26  
    27  		first, err := p.GetSession()
    28  		assert.Nil(t, err, "GetSession error: %v", err)
    29  		firstID := first.SessionID
    30  
    31  		second, err := p.GetSession()
    32  		assert.Nil(t, err, "GetSession error: %v", err)
    33  		secondID := second.SessionID
    34  
    35  		p.ReturnSession(first)
    36  		p.ReturnSession(second)
    37  
    38  		sess, err := p.GetSession()
    39  		assert.Nil(t, err, "GetSession error: %v", err)
    40  		nextSess, err := p.GetSession()
    41  		assert.Nil(t, err, "GetSession error: %v", err)
    42  
    43  		assert.True(t, bytes.Equal(sess.SessionID, secondID),
    44  			"first session ID mismatch; expected %s, got %s", secondID, sess.SessionID)
    45  		assert.True(t, bytes.Equal(nextSess.SessionID, firstID),
    46  			"second session ID mismatch; expected %s, got %s", firstID, nextSess.SessionID)
    47  	})
    48  
    49  	t.Run("TestExpiredRemoved", func(t *testing.T) {
    50  		descChan := make(chan description.Topology)
    51  		p := NewPool(descChan)
    52  		// Set timeout minutes to 0 so new sessions will always become stale when returned
    53  		p.latestTopology = topologyDescription{}
    54  
    55  		first, err := p.GetSession()
    56  		assert.Nil(t, err, "GetSession error: %v", err)
    57  		firstID := first.SessionID
    58  
    59  		second, err := p.GetSession()
    60  		assert.Nil(t, err, "GetSession error: %v", err)
    61  		secondID := second.SessionID
    62  
    63  		p.ReturnSession(first)
    64  		p.ReturnSession(second)
    65  
    66  		sess, err := p.GetSession()
    67  		assert.Nil(t, err, "GetSession error: %v", err)
    68  
    69  		assert.False(t, bytes.Equal(sess.SessionID, firstID), "first expired session was not removed")
    70  		assert.False(t, bytes.Equal(sess.SessionID, secondID), "second expired session was not removed")
    71  	})
    72  }
    73  

View as plain text