forked from hashicorp/go-plugin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
client_posix_test.go
108 lines (90 loc) · 2.13 KB
/
client_posix_test.go
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
105
106
107
108
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
//go:build !windows
// +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")
}
}