Skip to content

Instantly share code, notes, and snippets.

@jeanbza
Created April 25, 2019 21:33
Show Gist options
  • Select an option

  • Save jeanbza/1b9606fa4cfc97e47bf7f7ccbb0fa15d to your computer and use it in GitHub Desktop.

Select an option

Save jeanbza/1b9606fa4cfc97e47bf7f7ccbb0fa15d to your computer and use it in GitHub Desktop.
cleaner_test
func TestTakeWriteSessionFromIdleList_Better(t *testing.T) {
ctx := context.Background()
sessionsToCreate := 10
idleSessions := 20
// Make sure maintainer keeps the idle sessions.
_, sp, mock, cleanup := serverClientMock(t, SessionPoolConfig{MaxIdle: uint64(idleSessions)})
defer cleanup()
// Cause sessions to be created.
shs := make([]*sessionHandle, sessionsToCreate)
for i := 0; i < sessionsToCreate; i++ {
var err error
shs[i], err = sp.takeWriteSession(ctx)
if err != nil {
t.Fatalf("failed to get session(%v): %v", i, err)
}
}
// Wait for all sessions to be created.
wants := []interface{}{}
for i := 0; i < sessionsToCreate; i++ {
wants = append(wants, &sppb.CreateSessionRequest{})
wants = append(wants, &sppb.BeginTransactionRequest{})
}
if err := waitForRequests(mock, wants); err != nil {
t.Fatal(err)
}
if got, want := sp.numOpened, uint64(sessionsToCreate); got != want {
t.Fatalf("expected %d sessions, got %d", want, got)
}
// Recycle all the sessions.
for _, sh := range shs {
sh.recycle()
}
// Take another set of sessions.
for i := 0; i < sessionsToCreate; i++ {
if _, err := sp.takeWriteSession(ctx); err != nil {
t.Fatalf("failed to get session(%v): %v", i, err)
}
}
// All sessions should have come from the idle list: no new sessions should
// have been created. We should _only_ see BeginTransactionRequests and
// no CreateSessionRequest.
wants = []interface{}{}
for i := 0; i < sessionsToCreate; i++ {
wants = append(wants, &sppb.BeginTransactionRequest{})
}
if err := waitForRequests(mock, wants); err != nil {
t.Fatal(err)
}
}
func waitForRequests(mock *testutil.FuncMock, wants []interface{}) error {
for i, want := range wants {
select {
case got := <-mock.ReceivedRequests:
if reflect.TypeOf(got) != reflect.TypeOf(want) {
return fmt.Errorf("%d: expected %v, got %v", i, reflect.TypeOf(want), reflect.TypeOf(got))
}
case <-time.After(5 * time.Second):
return fmt.Errorf("%d: timed out after 5s waiting for %v", i, reflect.TypeOf(want))
}
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment