Skip to content

Commit 1a720c0

Browse files
authored
fix: avoid exit the main process when plugin start failed (#463)
Co-authored-by: rick <[email protected]>
1 parent 92d517f commit 1a720c0

File tree

4 files changed

+51
-12
lines changed

4 files changed

+51
-12
lines changed

cmd/server.go

+4-6
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,10 @@ func (o *serverOption) runE(cmd *cobra.Command, args []string) (err error) {
227227
remoteServer := server.NewRemoteServer(loader, remote.NewGRPCloaderFromStore(), secretServer, storeExtMgr, o.configDir, o.grpcMaxRecvMsgSize)
228228
kinds, storeKindsErr := remoteServer.GetStoreKinds(ctx, nil)
229229
if storeKindsErr != nil {
230-
cmd.PrintErrf("failed to get store kinds, error: %p\n", storeKindsErr)
230+
cmd.PrintErrf("failed to get store kinds, error: %v\n", storeKindsErr)
231231
} else {
232-
if err = startPlugins(storeExtMgr, kinds); err != nil {
233-
return
232+
if runPluginErr := startPlugins(storeExtMgr, kinds); runPluginErr != nil {
233+
cmd.PrintErrf("error occurred during starting plugins, error: %v\n", runPluginErr)
234234
}
235235
}
236236

@@ -349,9 +349,7 @@ func startPlugins(storeExtMgr server.ExtManager, kinds *server.StoreKinds) (err
349349

350350
for _, kind := range kinds.Data {
351351
if kind.Enabled && strings.HasPrefix(kind.Url, socketPrefix) {
352-
if err = storeExtMgr.Start(kind.Name, kind.Url); err != nil {
353-
break
354-
}
352+
err = errors.Join(err, storeExtMgr.Start(kind.Name, kind.Url))
355353
}
356354
}
357355
return

cmd/server_test.go

+31-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2023 API Testing Authors.
2+
Copyright 2023-2024 API Testing Authors.
33
44
Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
@@ -17,10 +17,14 @@ package cmd
1717

1818
import (
1919
"bytes"
20+
_ "embed"
2021
"errors"
2122
"fmt"
23+
"io"
2224
"net"
2325
"net/http"
26+
"os"
27+
"path/filepath"
2428
"strings"
2529
"testing"
2630

@@ -29,6 +33,7 @@ import (
2933
"github.com/linuxsuren/api-testing/pkg/server"
3034
"github.com/linuxsuren/api-testing/pkg/util"
3135
fakeruntime "github.com/linuxsuren/go-fake-runtime"
36+
"github.com/spf13/cobra"
3237
"github.com/stretchr/testify/assert"
3338
)
3439

@@ -167,8 +172,6 @@ func TestFrontEndHandlerWithLocation(t *testing.T) {
167172
defer listen.Close()
168173

169174
for _, name := range apis {
170-
// gock.Off()
171-
172175
resp, err := http.Get(fmt.Sprintf("http://localhost:%s/debug/pprof/%s?seconds=1", port, name))
173176
assert.NoError(t, err)
174177
assert.Equal(t, http.StatusOK, resp.StatusCode)
@@ -275,6 +278,28 @@ func TestOAuth(t *testing.T) {
275278
}
276279
}
277280

281+
func TestStartPlugins(t *testing.T) {
282+
dir, err := os.MkdirTemp(os.TempDir(), "atest")
283+
assert.NoError(t, err)
284+
defer os.RemoveAll(dir)
285+
286+
err = os.WriteFile(filepath.Join(dir, "stores.yaml"), []byte(sampleStores), 0644)
287+
assert.NoError(t, err)
288+
289+
rootCmd := &cobra.Command{
290+
Use: "atest",
291+
}
292+
rootCmd.SetOut(io.Discard)
293+
rootCmd.AddCommand(createServerCmd(
294+
fakeruntime.FakeExecer{ExpectOS: "linux", ExpectLookPathError: errors.New("not-found")},
295+
server.NewFakeHTTPServer(),
296+
))
297+
298+
rootCmd.SetArgs([]string{"server", "--config-dir", dir, "--dry-run", "--port=0", "--http-port=0"})
299+
err = rootCmd.Execute()
300+
assert.NoError(t, err)
301+
}
302+
278303
type fakeResponseWriter struct {
279304
buf *bytes.Buffer
280305
header http.Header
@@ -299,3 +324,6 @@ func (w *fakeResponseWriter) WriteHeader(int) {
299324
func (w *fakeResponseWriter) GetBody() *bytes.Buffer {
300325
return w.buf
301326
}
327+
328+
//go:embed testdata/stores.yaml
329+
var sampleStores string

cmd/testdata/stores.yaml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
stores:
2+
- name: git
3+
kind:
4+
name: atest-store-git
5+
enabled: true
6+
url: xxx
7+
readonly: false
8+
disabled: false
9+
plugins:
10+
- name: atest-store-git
11+
url: unix:///tmp/atest-store-git.sock
12+
enabled: true

pkg/server/remote_server_test.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -649,13 +649,14 @@ func TestGetSuggestedAPIs(t *testing.T) {
649649

650650
t.Run("normal", func(t *testing.T) {
651651
gock.Off()
652+
randomName := fmt.Sprintf("fake-%d", time.Now().Nanosecond())
652653
_, err := server.CreateTestSuite(ctx, &TestSuiteIdentity{
653-
Name: "fake-1",
654+
Name: randomName,
654655
})
655656
assert.NoError(t, err)
656657

657658
_, err = server.UpdateTestSuite(ctx, &TestSuite{
658-
Name: "fake-1",
659+
Name: randomName,
659660
Spec: &APISpec{
660661
Kind: "swagger",
661662
Url: urlFoo + "/v1",
@@ -666,7 +667,7 @@ func TestGetSuggestedAPIs(t *testing.T) {
666667
gock.New(urlFoo).Get("/v1").Reply(200).File("testdata/swagger.json")
667668

668669
var testcases *TestCases
669-
testcases, err = server.GetSuggestedAPIs(ctx, &TestSuiteIdentity{Name: "fake-1"})
670+
testcases, err = server.GetSuggestedAPIs(ctx, &TestSuiteIdentity{Name: randomName})
670671
assert.NoError(t, err)
671672
if assert.NotNil(t, testcases) {
672673
assert.Equal(t, 5, len(testcases.Data))

0 commit comments

Comments
 (0)