File: client_posix_test.go

package info (click to toggle)
golang-github-hashicorp-go-plugin 0.0~git20170621.5ee1a665-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 388 kB
  • sloc: python: 38; makefile: 4
file content (104 lines) | stat: -rw-r--r-- 2,092 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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")
	}
}