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