mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
38 lines
740 B
Go
38 lines
740 B
Go
|
package plugins
|
||
|
|
||
|
import (
|
||
|
"path/filepath"
|
||
|
"runtime"
|
||
|
"sync"
|
||
|
"testing"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
// regression test for deadlock in handlers
|
||
|
func TestPluginAddHandler(t *testing.T) {
|
||
|
// make a plugin which is pre-activated
|
||
|
p := &Plugin{activateWait: sync.NewCond(&sync.Mutex{})}
|
||
|
p.Manifest = &Manifest{Implements: []string{"bananas"}}
|
||
|
storage.plugins["qwerty"] = p
|
||
|
|
||
|
testActive(t, p)
|
||
|
Handle("bananas", func(_ string, _ *Client) {})
|
||
|
testActive(t, p)
|
||
|
}
|
||
|
|
||
|
func testActive(t *testing.T, p *Plugin) {
|
||
|
done := make(chan struct{})
|
||
|
go func() {
|
||
|
p.waitActive()
|
||
|
close(done)
|
||
|
}()
|
||
|
|
||
|
select {
|
||
|
case <-time.After(100 * time.Millisecond):
|
||
|
_, f, l, _ := runtime.Caller(1)
|
||
|
t.Fatalf("%s:%d: deadlock in waitActive", filepath.Base(f), l)
|
||
|
case <-done:
|
||
|
}
|
||
|
|
||
|
}
|