From 1a720c03f846894beaeb79220b522a1eb1ded768 Mon Sep 17 00:00:00 2001 From: Rick <1450685+LinuxSuRen@users.noreply.github.com> Date: Wed, 29 May 2024 09:43:28 +0800 Subject: [PATCH] fix: avoid exit the main process when plugin start failed (#463) Co-authored-by: rick --- cmd/server.go | 10 ++++------ cmd/server_test.go | 34 +++++++++++++++++++++++++++++--- cmd/testdata/stores.yaml | 12 +++++++++++ pkg/server/remote_server_test.go | 7 ++++--- 4 files changed, 51 insertions(+), 12 deletions(-) create mode 100644 cmd/testdata/stores.yaml diff --git a/cmd/server.go b/cmd/server.go index c0a7e09..f368952 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -227,10 +227,10 @@ func (o *serverOption) runE(cmd *cobra.Command, args []string) (err error) { remoteServer := server.NewRemoteServer(loader, remote.NewGRPCloaderFromStore(), secretServer, storeExtMgr, o.configDir, o.grpcMaxRecvMsgSize) kinds, storeKindsErr := remoteServer.GetStoreKinds(ctx, nil) if storeKindsErr != nil { - cmd.PrintErrf("failed to get store kinds, error: %p\n", storeKindsErr) + cmd.PrintErrf("failed to get store kinds, error: %v\n", storeKindsErr) } else { - if err = startPlugins(storeExtMgr, kinds); err != nil { - return + if runPluginErr := startPlugins(storeExtMgr, kinds); runPluginErr != nil { + cmd.PrintErrf("error occurred during starting plugins, error: %v\n", runPluginErr) } } @@ -349,9 +349,7 @@ func startPlugins(storeExtMgr server.ExtManager, kinds *server.StoreKinds) (err for _, kind := range kinds.Data { if kind.Enabled && strings.HasPrefix(kind.Url, socketPrefix) { - if err = storeExtMgr.Start(kind.Name, kind.Url); err != nil { - break - } + err = errors.Join(err, storeExtMgr.Start(kind.Name, kind.Url)) } } return diff --git a/cmd/server_test.go b/cmd/server_test.go index 979e662..3d308d6 100644 --- a/cmd/server_test.go +++ b/cmd/server_test.go @@ -1,5 +1,5 @@ /* -Copyright 2023 API Testing Authors. +Copyright 2023-2024 API Testing Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,10 +17,14 @@ package cmd import ( "bytes" + _ "embed" "errors" "fmt" + "io" "net" "net/http" + "os" + "path/filepath" "strings" "testing" @@ -29,6 +33,7 @@ import ( "github.com/linuxsuren/api-testing/pkg/server" "github.com/linuxsuren/api-testing/pkg/util" fakeruntime "github.com/linuxsuren/go-fake-runtime" + "github.com/spf13/cobra" "github.com/stretchr/testify/assert" ) @@ -167,8 +172,6 @@ func TestFrontEndHandlerWithLocation(t *testing.T) { defer listen.Close() for _, name := range apis { - // gock.Off() - resp, err := http.Get(fmt.Sprintf("http://localhost:%s/debug/pprof/%s?seconds=1", port, name)) assert.NoError(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) @@ -275,6 +278,28 @@ func TestOAuth(t *testing.T) { } } +func TestStartPlugins(t *testing.T) { + dir, err := os.MkdirTemp(os.TempDir(), "atest") + assert.NoError(t, err) + defer os.RemoveAll(dir) + + err = os.WriteFile(filepath.Join(dir, "stores.yaml"), []byte(sampleStores), 0644) + assert.NoError(t, err) + + rootCmd := &cobra.Command{ + Use: "atest", + } + rootCmd.SetOut(io.Discard) + rootCmd.AddCommand(createServerCmd( + fakeruntime.FakeExecer{ExpectOS: "linux", ExpectLookPathError: errors.New("not-found")}, + server.NewFakeHTTPServer(), + )) + + rootCmd.SetArgs([]string{"server", "--config-dir", dir, "--dry-run", "--port=0", "--http-port=0"}) + err = rootCmd.Execute() + assert.NoError(t, err) +} + type fakeResponseWriter struct { buf *bytes.Buffer header http.Header @@ -299,3 +324,6 @@ func (w *fakeResponseWriter) WriteHeader(int) { func (w *fakeResponseWriter) GetBody() *bytes.Buffer { return w.buf } + +//go:embed testdata/stores.yaml +var sampleStores string diff --git a/cmd/testdata/stores.yaml b/cmd/testdata/stores.yaml new file mode 100644 index 0000000..e818158 --- /dev/null +++ b/cmd/testdata/stores.yaml @@ -0,0 +1,12 @@ +stores: + - name: git + kind: + name: atest-store-git + enabled: true + url: xxx + readonly: false + disabled: false +plugins: + - name: atest-store-git + url: unix:///tmp/atest-store-git.sock + enabled: true diff --git a/pkg/server/remote_server_test.go b/pkg/server/remote_server_test.go index 2448f0e..34b0979 100644 --- a/pkg/server/remote_server_test.go +++ b/pkg/server/remote_server_test.go @@ -649,13 +649,14 @@ func TestGetSuggestedAPIs(t *testing.T) { t.Run("normal", func(t *testing.T) { gock.Off() + randomName := fmt.Sprintf("fake-%d", time.Now().Nanosecond()) _, err := server.CreateTestSuite(ctx, &TestSuiteIdentity{ - Name: "fake-1", + Name: randomName, }) assert.NoError(t, err) _, err = server.UpdateTestSuite(ctx, &TestSuite{ - Name: "fake-1", + Name: randomName, Spec: &APISpec{ Kind: "swagger", Url: urlFoo + "/v1", @@ -666,7 +667,7 @@ func TestGetSuggestedAPIs(t *testing.T) { gock.New(urlFoo).Get("/v1").Reply(200).File("testdata/swagger.json") var testcases *TestCases - testcases, err = server.GetSuggestedAPIs(ctx, &TestSuiteIdentity{Name: "fake-1"}) + testcases, err = server.GetSuggestedAPIs(ctx, &TestSuiteIdentity{Name: randomName}) assert.NoError(t, err) if assert.NotNil(t, testcases) { assert.Equal(t, 5, len(testcases.Data))