OSDN Git Service

add package
[bytom/vapor.git] / vendor / github.com / hashicorp / go-plugin / client_posix_test.go
diff --git a/vendor/github.com/hashicorp/go-plugin/client_posix_test.go b/vendor/github.com/hashicorp/go-plugin/client_posix_test.go
new file mode 100644 (file)
index 0000000..523ec11
--- /dev/null
@@ -0,0 +1,104 @@
+// +build !windows
+
+package plugin
+
+import (
+       "os"
+       "reflect"
+       "syscall"
+       "testing"
+       "time"
+)
+
+func TestClient_testInterfaceReattach(t *testing.T) {
+       // Setup the process for daemonization
+       process := helperProcess("test-interface-daemon")
+       if process.SysProcAttr == nil {
+               process.SysProcAttr = &syscall.SysProcAttr{}
+       }
+       process.SysProcAttr.Setsid = true
+       syscall.Umask(0)
+
+       c := NewClient(&ClientConfig{
+               Cmd:             process,
+               HandshakeConfig: testHandshake,
+               Plugins:         testPluginMap,
+       })
+
+       // Start it so we can get the reattach info
+       if _, err := c.Start(); err != nil {
+               t.Fatalf("err should be nil, got %s", err)
+       }
+
+       // New client with reattach info
+       reattach := c.ReattachConfig()
+       if reattach == nil {
+               c.Kill()
+               t.Fatal("reattach config should be non-nil")
+       }
+
+       // Find the process and defer a kill so we know it is gone
+       p, err := os.FindProcess(reattach.Pid)
+       if err != nil {
+               c.Kill()
+               t.Fatalf("couldn't find process: %s", err)
+       }
+       defer p.Kill()
+
+       // Reattach
+       c = NewClient(&ClientConfig{
+               Reattach:        reattach,
+               HandshakeConfig: testHandshake,
+               Plugins:         testPluginMap,
+       })
+
+       // Start shouldn't error
+       if _, err := c.Start(); err != nil {
+               t.Fatalf("err: %s", err)
+       }
+
+       // It should still be alive
+       time.Sleep(1 * time.Second)
+       if c.Exited() {
+               t.Fatal("should not be exited")
+       }
+
+       // Grab the RPC client
+       client, err := c.Client()
+       if err != nil {
+               t.Fatalf("err should be nil, got %s", err)
+       }
+
+       // Grab the impl
+       raw, err := client.Dispense("test")
+       if err != nil {
+               t.Fatalf("err should be nil, got %s", err)
+       }
+
+       impl, ok := raw.(testInterface)
+       if !ok {
+               t.Fatalf("bad: %#v", raw)
+       }
+
+       result := impl.Double(21)
+       if result != 42 {
+               t.Fatalf("bad: %#v", result)
+       }
+
+       // Test the resulting reattach config
+       reattach2 := c.ReattachConfig()
+       if reattach2 == nil {
+               t.Fatal("reattach from reattached should not be nil")
+       }
+       if !reflect.DeepEqual(reattach, reattach2) {
+               t.Fatalf("bad: %#v", reattach)
+       }
+
+       // Kill it
+       c.Kill()
+
+       // Test that it knows it is exited
+       if !c.Exited() {
+               t.Fatal("should say client has exited")
+       }
+}