forked from mystiq/dex
Functional tests for LDAP Connection Pool
This commit is contained in:
parent
e531dd6be5
commit
3077979a3b
1 changed files with 57 additions and 0 deletions
|
@ -7,9 +7,12 @@ import (
|
|||
"net/url"
|
||||
"os"
|
||||
"strconv"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/coreos/dex/connector"
|
||||
"golang.org/x/net/context"
|
||||
"gopkg.in/ldap.v2"
|
||||
)
|
||||
|
||||
|
@ -123,3 +126,57 @@ func TestConnectorLDAPHealthy(t *testing.T) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestLDAPPoolHighWatermarkAndLockContention(t *testing.T) {
|
||||
server := ldapServer(t)
|
||||
ldapPool := &connector.LDAPPool{
|
||||
MaxIdleConn: 30,
|
||||
ServerHost: server.Host,
|
||||
ServerPort: server.Port,
|
||||
UseTLS: false,
|
||||
UseSSL: false,
|
||||
}
|
||||
|
||||
// Excercise pool operations with MaxIdleConn + 10 concurrent goroutines.
|
||||
// We are testing both pool high watermark code and lock contention
|
||||
numRoutines := ldapPool.MaxIdleConn + 10
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(numRoutines)
|
||||
ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
for i := 0; i < numRoutines; i++ {
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
default:
|
||||
ldapConn, err := ldapPool.Acquire()
|
||||
if err != nil {
|
||||
t.Errorf("Unable to acquire LDAP Connection: %v", err)
|
||||
}
|
||||
s := ldap.NewSearchRequest("", ldap.ScopeBaseObject, ldap.NeverDerefAliases, 0, 0, false, "(objectClass=*)", []string{}, nil)
|
||||
_, err = ldapConn.Search(s)
|
||||
if err != nil {
|
||||
t.Errorf("Search request failed. Dead/invalid LDAP connection from pool?: %v", err)
|
||||
ldapConn.Close()
|
||||
} else {
|
||||
ldapPool.Put(ldapConn)
|
||||
}
|
||||
_, _ = ldapPool.CheckConnections()
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
// Wait for all operations to complete and check status.
|
||||
// There should be MaxIdleConn connections in the pool. This confirms:
|
||||
// 1. The tests was indeed executed concurrently
|
||||
// 2. Even though we ran more routines than the configured MaxIdleConn the high
|
||||
// watermark code did its job and closed surplus connections
|
||||
wg.Wait()
|
||||
alive, killed := ldapPool.CheckConnections()
|
||||
if alive < ldapPool.MaxIdleConn {
|
||||
t.Errorf("expected %v connections, got alive=%v killed=%v", ldapPool.MaxIdleConn, alive, killed)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue