plugin_test.go 740 B

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