plugin_test.go 923 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package plugins
  2. import (
  3. "errors"
  4. "path/filepath"
  5. "runtime"
  6. "sync"
  7. "testing"
  8. "time"
  9. )
  10. // regression test for deadlock in handlers
  11. func TestPluginAddHandler(t *testing.T) {
  12. // make a plugin which is pre-activated
  13. p := &Plugin{activateWait: sync.NewCond(&sync.Mutex{})}
  14. p.Manifest = &Manifest{Implements: []string{"bananas"}}
  15. storage.plugins["qwerty"] = p
  16. testActive(t, p)
  17. Handle("bananas", func(_ string, _ *Client) {})
  18. testActive(t, p)
  19. }
  20. func TestPluginWaitBadPlugin(t *testing.T) {
  21. p := &Plugin{activateWait: sync.NewCond(&sync.Mutex{})}
  22. p.activateErr = errors.New("some junk happened")
  23. testActive(t, p)
  24. }
  25. func testActive(t *testing.T, p *Plugin) {
  26. done := make(chan struct{})
  27. go func() {
  28. p.waitActive()
  29. close(done)
  30. }()
  31. select {
  32. case <-time.After(100 * time.Millisecond):
  33. _, f, l, _ := runtime.Caller(1)
  34. t.Fatalf("%s:%d: deadlock in waitActive", filepath.Base(f), l)
  35. case <-done:
  36. }
  37. }