github.com/olljanat/moby@v1.13.1/pkg/plugins/plugin_test.go (about)

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