e9751047e9
When a plugin has an activation error, it was not being checked in the
`waitActive` loop. This means it will just wait forever for a manifest
to be populated even though it may never come.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
(cherry picked from commit f2d384fca6
)
Signed-off-by: Victor Vieux <vieux@docker.com>
44 lines
923 B
Go
44 lines
923 B
Go
package plugins
|
|
|
|
import (
|
|
"errors"
|
|
"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 TestPluginWaitBadPlugin(t *testing.T) {
|
|
p := &Plugin{activateWait: sync.NewCond(&sync.Mutex{})}
|
|
p.activateErr = errors.New("some junk happened")
|
|
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:
|
|
}
|
|
|
|
}
|