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: } }