Files
OpenList/shared/driver/plugin_test.go
j2rong4cn 368dc65a6e feat: Implement plugin architecture with gRPC support
- Added driver initialization for gRPC plugins in internal/bootstrap/driver.go.
- Introduced configuration structures and protobuf definitions for driver plugins in proto/driver/config.proto and proto/driver/driver.proto.
- Implemented gRPC server and client interfaces for driver plugins in shared/driver/grpc.go.
- Created common response handling utilities in server/common/common.go and server/common/resp.go.
- Developed plugin registration endpoint in server/handles/plugin.go.
- Added test cases for plugin functionality in shared/driver/plugin_test.go.
- Defined plugin reattachment configuration model in shared/model/plugin.go.
2025-08-13 19:04:38 +08:00

130 lines
2.5 KiB
Go

package driver
import (
"context"
"fmt"
"os"
"os/exec"
"testing"
"time"
"github.com/hashicorp/go-plugin"
)
func TestGrpcPlugin(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
c := plugin.NewClient(&plugin.ClientConfig{
Cmd: helperProcess("grpc"),
HandshakeConfig: GetHandshakeConfig(),
Plugins: plugin.PluginSet{
"grpc": &Plugin{},
},
AllowedProtocols: []plugin.Protocol{plugin.ProtocolGRPC},
SyncStdout: os.Stdout,
SyncStderr: os.Stderr,
})
client, err := c.Client()
if err != nil {
t.Fatalf("err: %s", err)
}
// Pinging should work
if err := client.Ping(); err != nil {
t.Fatalf("should not err: %s", err)
}
// Grab the impl
raw, err := client.Dispense("grpc")
if err != nil {
t.Fatalf("err should be nil, got %s", err)
}
storage, ok := raw.(PluginIF)
if !ok {
t.Fatalf("bad: %#v", raw)
}
conf, err := storage.Config(ctx)
if err != nil {
t.Fatalf("should not err: %s", err)
}
fmt.Printf("config: %+v\n", conf)
<-time.After(100 * time.Millisecond)
c.Kill()
cancel()
if err := client.Ping(); err == nil {
t.Fatal("should error")
}
// Try logging, this should show out in tests. We have to manually verify.
t.Logf("HELLO")
}
// This is not a real test. This is just a helper process kicked off by
// tests.
func TestHelperProcess(*testing.T) {
if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
return
}
defer os.Exit(0)
args := os.Args
for len(args) > 0 {
if args[0] == "--" {
args = args[1:]
break
}
args = args[1:]
}
if len(args) == 0 {
fmt.Fprintf(os.Stderr, "No command\n")
os.Exit(2)
}
cmd := args[0]
// args = args[1:]
switch cmd {
case "grpc":
plugin.Serve(&plugin.ServeConfig{
HandshakeConfig: GetHandshakeConfig(),
Plugins: plugin.PluginSet{
"grpc": &Plugin{
Impl: &TestServer{},
},
},
GRPCServer: plugin.DefaultGRPCServer,
})
default:
fmt.Fprintf(os.Stderr, "Unknown command %q\n", cmd)
os.Exit(2)
}
}
func helperProcess(s ...string) *exec.Cmd {
cs := []string{"-test.run=TestHelperProcess", "--"}
cs = append(cs, s...)
env := []string{
"GO_WANT_HELPER_PROCESS=1",
}
cmd := exec.Command(os.Args[0], cs...)
cmd.Env = append(env, os.Environ()...)
return cmd
}
type TestServer struct{}
func (s *TestServer) Config(ctx context.Context) (Config, error) {
fmt.Println("TestServer Config called")
return Config{
Name: "TestPlugin",
Version: "v0.0.1",
DefaultRoot: "/",
}, nil
}
var _ PluginIF = (*TestServer)(nil)