Merge pull request #22727 from mml/racey

Guarantee we finish writing to the test log before the test exits.
This commit is contained in:
Brian Grant 2016-03-11 12:20:36 -08:00
commit ac068cd178

View File

@ -18,8 +18,10 @@ package scheduler
import ( import (
"errors" "errors"
"fmt"
"math/rand" "math/rand"
"reflect" "reflect"
"sync"
"testing" "testing"
"time" "time"
@ -158,8 +160,34 @@ func TestScheduler(t *testing.T) {
} }
func TestSchedulerForgetAssumedPodAfterDelete(t *testing.T) { func TestSchedulerForgetAssumedPodAfterDelete(t *testing.T) {
// Set up a channel through which we'll funnel log messages from the watcher.
// This way, we can guarantee that when the test ends no thread will still be
// trying to write to t.Logf (which it would if we handed t.Logf directly to
// StartLogging).
ch := make(chan string)
done := make(chan struct{})
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
for {
select {
case msg := <-ch:
t.Log(msg)
case <-done:
return
}
}
}()
eventBroadcaster := record.NewBroadcaster() eventBroadcaster := record.NewBroadcaster()
defer eventBroadcaster.StartLogging(t.Logf).Stop() watcher := eventBroadcaster.StartLogging(func(format string, args ...interface{}) {
ch <- fmt.Sprintf(format, args...)
})
defer func() {
watcher.Stop()
close(done)
wg.Wait()
}()
// Setup modeler so we control the contents of all 3 stores: assumed, // Setup modeler so we control the contents of all 3 stores: assumed,
// scheduled and queued // scheduled and queued