summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValery Piashchynski <[email protected]>2021-06-09 02:31:33 +0300
committerValery Piashchynski <[email protected]>2021-06-09 02:31:33 +0300
commit6103228ee951c7c8bf5d425471b7c440980c6044 (patch)
tree698c28d3af1814f49958455a6c518ed62032830f
parent4f3e16892479db4bd8280a46987f3105e46e5c96 (diff)
- Update CI (add new tests)
- Add path scan with regex (find .php/.ph/.sh scripts). When found, try to stat path for potential fix for the [file not exists problem] Signed-off-by: Valery Piashchynski <[email protected]>
-rw-r--r--.github/workflows/linux.yml1
-rw-r--r--.github/workflows/windows.yml1
-rwxr-xr-xMakefile2
-rw-r--r--go.mod1
-rw-r--r--plugins/server/command.go33
-rw-r--r--plugins/server/command_test.go14
-rw-r--r--plugins/server/plugin.go19
-rw-r--r--tests/plugins/gzip/configs/.rr-http-middlewareNotExist.yaml6
-rw-r--r--tests/plugins/gzip/plugin_test.go1
-rw-r--r--tests/plugins/reload/reload_plugin_test.go7
-rw-r--r--tests/plugins/server/configs/.rr.yaml2
-rw-r--r--tests/plugins/server/plugin_pipes.go2
-rw-r--r--tests/plugins/server/server_plugin_test.go21
13 files changed, 80 insertions, 30 deletions
diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
index 041e6b6e..670919a5 100644
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -63,6 +63,7 @@ jobs:
go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage-ci/bst.txt -covermode=atomic ./pkg/bst
go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage-ci/worker_stack.txt -covermode=atomic ./pkg/worker_watcher
go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage-ci/http_config.txt -covermode=atomic ./plugins/http/config
+ go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage/server_cmd.out -covermode=atomic ./plugins/server
go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage-ci/http.txt -covermode=atomic ./tests/plugins/http
go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage-ci/informer.txt -covermode=atomic ./tests/plugins/informer
go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage-ci/reload.txt -covermode=atomic ./tests/plugins/reload
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
index 759137b5..f662b0b1 100644
--- a/.github/workflows/windows.yml
+++ b/.github/workflows/windows.yml
@@ -63,6 +63,7 @@ jobs:
go test -v -race ./pkg/bst
go test -v -race ./pkg/worker_watcher
go test -v -race ./plugins/http/config
+ go test -v -race ./plugins/server
go test -v -race ./tests/plugins/http
go test -v -race ./tests/plugins/informer
go test -v -race ./tests/plugins/reload
diff --git a/Makefile b/Makefile
index 9cd0531d..431cb017 100755
--- a/Makefile
+++ b/Makefile
@@ -16,6 +16,7 @@ test_coverage:
go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage/bst.out -covermode=atomic ./pkg/bst
go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage/http.out -covermode=atomic ./tests/plugins/http
go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage/http_config.out -covermode=atomic ./plugins/http/config
+ go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage/server_cmd.out -covermode=atomic ./plugins/server
go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage/informer.out -covermode=atomic ./tests/plugins/informer
go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage/reload.out -covermode=atomic ./tests/plugins/reload
go test -v -race -cover -tags=debug -coverpkg=./... -coverprofile=./coverage/server.out -covermode=atomic ./tests/plugins/server
@@ -44,6 +45,7 @@ test: ## Run application tests
go test -v -race -tags=debug ./pkg/bst
go test -v -race -tags=debug ./tests/plugins/http
go test -v -race -tags=debug ./plugins/http/config
+ go test -v -race -tags=debug ./plugins/server
go test -v -race -tags=debug ./tests/plugins/informer
go test -v -race -tags=debug ./tests/plugins/reload
go test -v -race -tags=debug ./tests/plugins/server
diff --git a/go.mod b/go.mod
index 0b8661c0..cbde0875 100644
--- a/go.mod
+++ b/go.mod
@@ -12,7 +12,6 @@ require (
github.com/go-redis/redis/v8 v8.9.0
github.com/gofiber/fiber/v2 v2.10.0
github.com/golang/mock v1.4.4
- github.com/golang/protobuf v1.4.3
github.com/google/uuid v1.2.0
github.com/json-iterator/go v1.1.11
github.com/klauspost/compress v1.13.0
diff --git a/plugins/server/command.go b/plugins/server/command.go
new file mode 100644
index 00000000..527cc224
--- /dev/null
+++ b/plugins/server/command.go
@@ -0,0 +1,33 @@
+package server
+
+import (
+ "os"
+ "regexp"
+
+ "github.com/spiral/errors"
+)
+
+// pattern for the path finding
+const pattern string = `^\/*([A-z0-9/.:-]+\.(php|sh|ph))$`
+
+func (server *Plugin) scanCommand(cmd []string) error {
+ const op = errors.Op("server_command_scan")
+ r, err := regexp.Compile(pattern)
+ if err != nil {
+ return err
+ }
+
+ for i := 0; i < len(cmd); i++ {
+ if r.MatchString(cmd[i]) {
+ // try to stat
+ _, err := os.Stat(cmd[i])
+ if err != nil {
+ return errors.E(op, err)
+ }
+
+ // stat successful
+ return nil
+ }
+ }
+ return errors.E(errors.Str("scan failed, possible path not found"), op)
+}
diff --git a/plugins/server/command_test.go b/plugins/server/command_test.go
new file mode 100644
index 00000000..24051fba
--- /dev/null
+++ b/plugins/server/command_test.go
@@ -0,0 +1,14 @@
+package server
+
+import (
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestServerCommandChecker(t *testing.T) {
+ s := &Plugin{}
+ cmd1 := "php ../../tests/client.php"
+ assert.NoError(t, s.scanCommand(strings.Split(cmd1, " ")))
+}
diff --git a/plugins/server/plugin.go b/plugins/server/plugin.go
index 7f694f3c..00639f43 100644
--- a/plugins/server/plugin.go
+++ b/plugins/server/plugin.go
@@ -24,10 +24,11 @@ import (
// PluginName for the server
const PluginName = "server"
-// RR_RELAY env variable key (internal)
-const RR_RELAY = "RR_RELAY" //nolint:stylecheck
-// RR_RPC env variable key (internal) if the RPC presents
-const RR_RPC = "RR_RPC" //nolint:stylecheck
+// RrRelay env variable key (internal)
+const RrRelay = "RR_RELAY"
+
+// RrRPC env variable key (internal) if the RPC presents
+const RrRPC = "RR_RPC"
// Plugin manages worker
type Plugin struct {
@@ -93,6 +94,12 @@ func (server *Plugin) CmdFactory(env Env) (func() *exec.Cmd, error) {
return nil, errors.E(op, errors.Str("minimum command should be `<executable> <script>"))
}
+ // try to find a path here
+ err := server.scanCommand(cmdArgs)
+ if err != nil {
+ server.log.Info("scan command", "error", err)
+ }
+
return func() *exec.Cmd {
cmd := exec.Command(cmdArgs[0], cmdArgs[1:]...) //nolint:gosec
utils.IsolateProcess(cmd)
@@ -183,13 +190,13 @@ func (server *Plugin) initFactory() (transport.Factory, error) {
}
func (server *Plugin) setEnv(e Env) []string {
- env := append(os.Environ(), fmt.Sprintf(RR_RELAY+"=%s", server.cfg.Server.Relay))
+ env := append(os.Environ(), fmt.Sprintf(RrRelay+"=%s", server.cfg.Server.Relay))
for k, v := range e {
env = append(env, fmt.Sprintf("%s=%s", strings.ToUpper(k), v))
}
if server.cfg.RPC != nil && server.cfg.RPC.Listen != "" {
- env = append(env, fmt.Sprintf("%s=%s", RR_RPC, server.cfg.RPC.Listen))
+ env = append(env, fmt.Sprintf("%s=%s", RrRPC, server.cfg.RPC.Listen))
}
// set env variables from the config
diff --git a/tests/plugins/gzip/configs/.rr-http-middlewareNotExist.yaml b/tests/plugins/gzip/configs/.rr-http-middlewareNotExist.yaml
index 9e5b9c60..73e4f6e6 100644
--- a/tests/plugins/gzip/configs/.rr-http-middlewareNotExist.yaml
+++ b/tests/plugins/gzip/configs/.rr-http-middlewareNotExist.yaml
@@ -1,9 +1,5 @@
server:
command: "php ../../psr-worker.php"
- user: ""
- group: ""
- env:
- "RR_HTTP": "true"
relay: "pipes"
relay_timeout: "20s"
@@ -21,4 +17,4 @@ http:
destroy_timeout: 60s
logs:
mode: development
- level: error \ No newline at end of file
+ level: error
diff --git a/tests/plugins/gzip/plugin_test.go b/tests/plugins/gzip/plugin_test.go
index 844fd411..b254fad5 100644
--- a/tests/plugins/gzip/plugin_test.go
+++ b/tests/plugins/gzip/plugin_test.go
@@ -120,6 +120,7 @@ func TestMiddlewareNotExist(t *testing.T) {
mockLogger.EXPECT().Warn("requested middleware does not exist", "requested", "foo").AnyTimes()
mockLogger.EXPECT().Debug("worker constructed", "pid", gomock.Any()).AnyTimes()
mockLogger.EXPECT().Debug("worker destructed", "pid", gomock.Any()).AnyTimes()
+ mockLogger.EXPECT().Info("scan command", gomock.Any()).Times(1)
mockLogger.EXPECT().Error(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() // placeholder for the workerlogerror
err = cont.RegisterAll(
diff --git a/tests/plugins/reload/reload_plugin_test.go b/tests/plugins/reload/reload_plugin_test.go
index 6db7b6d0..04c9849f 100644
--- a/tests/plugins/reload/reload_plugin_test.go
+++ b/tests/plugins/reload/reload_plugin_test.go
@@ -53,6 +53,7 @@ func TestReloadInit(t *testing.T) {
mockLogger.EXPECT().Debug("file was created", "path", gomock.Any(), "name", "file.txt", "size", gomock.Any()).Times(2)
mockLogger.EXPECT().Debug("file was added to watcher", "path", gomock.Any(), "name", "file.txt", "size", gomock.Any()).Times(2)
mockLogger.EXPECT().Info("HTTP plugin got restart request. Restarting...").Times(1)
+ mockLogger.EXPECT().Info("scan command", gomock.Any()).Times(1)
mockLogger.EXPECT().Info("HTTP workers Pool successfully restarted").Times(1)
mockLogger.EXPECT().Info("HTTP handler listeners successfully re-added").Times(1)
mockLogger.EXPECT().Info("HTTP plugin successfully restarted").Times(1)
@@ -150,6 +151,7 @@ func TestReloadHugeNumberOfFiles(t *testing.T) {
mockLogger.EXPECT().Debug("file was added to watcher", "path", gomock.Any(), "name", gomock.Any(), "size", gomock.Any()).MinTimes(1)
mockLogger.EXPECT().Info("HTTP plugin got restart request. Restarting...").MinTimes(1)
mockLogger.EXPECT().Info("HTTP workers Pool successfully restarted").MinTimes(1)
+ mockLogger.EXPECT().Info("scan command", gomock.Any()).Times(1)
mockLogger.EXPECT().Info("HTTP handler listeners successfully re-added").MinTimes(1)
mockLogger.EXPECT().Info("HTTP plugin successfully restarted").MinTimes(1)
mockLogger.EXPECT().Error(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() // placeholder for the workerlogerror
@@ -259,6 +261,7 @@ func TestReloadFilterFileExt(t *testing.T) {
mockLogger.EXPECT().Debug("file added to the list of removed files", "path", gomock.Any(), "name", gomock.Any(), "size", gomock.Any()).AnyTimes()
mockLogger.EXPECT().Info("HTTP plugin got restart request. Restarting...").Times(1)
mockLogger.EXPECT().Info("HTTP workers Pool successfully restarted").Times(1)
+ mockLogger.EXPECT().Info("scan command", gomock.Any()).AnyTimes()
mockLogger.EXPECT().Info("HTTP handler listeners successfully re-added").MinTimes(1)
mockLogger.EXPECT().Info("HTTP plugin successfully restarted").Times(1)
mockLogger.EXPECT().Error(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() // placeholder for the workerlogerror
@@ -387,7 +390,8 @@ func TestReloadCopy100(t *testing.T) {
mockLogger.EXPECT().Debug("file added to the list of removed files", "path", gomock.Any(), "name", gomock.Any(), "size", gomock.Any()).MinTimes(50)
mockLogger.EXPECT().Debug("file was removed from watcher", "path", gomock.Any(), "name", gomock.Any(), "size", gomock.Any()).MinTimes(50)
mockLogger.EXPECT().Debug("file was updated", "path", gomock.Any(), "name", gomock.Any(), "size", gomock.Any()).MinTimes(50)
- mockLogger.EXPECT().Info("HTTP plugin got restart request. Restarting...").MinTimes(1)
+ mockLogger.EXPECT().Info("HTTP plugin got restart request. Restarting...").AnyTimes()
+ mockLogger.EXPECT().Info("scan command", gomock.Any()).Times(1)
mockLogger.EXPECT().Info("HTTP workers Pool successfully restarted").MinTimes(1)
mockLogger.EXPECT().Info("HTTP handler listeners successfully re-added").MinTimes(1)
mockLogger.EXPECT().Info("HTTP plugin successfully restarted").MinTimes(1)
@@ -668,6 +672,7 @@ func TestReloadNoRecursion(t *testing.T) {
mockLogger.EXPECT().Debug("worker constructed", "pid", gomock.Any()).MinTimes(1)
mockLogger.EXPECT().Debug("http handler response received", "elapsed", gomock.Any(), "remote address", "127.0.0.1").Times(1)
mockLogger.EXPECT().Debug("file added to the list of removed files", "path", gomock.Any(), "name", gomock.Any(), "size", gomock.Any()).MinTimes(1)
+ mockLogger.EXPECT().Info("scan command", gomock.Any()).Times(1)
mockLogger.EXPECT().Error(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() // placeholder for the workerlogerror
err = cont.RegisterAll(
diff --git a/tests/plugins/server/configs/.rr.yaml b/tests/plugins/server/configs/.rr.yaml
index d28265d5..a1484c02 100644
--- a/tests/plugins/server/configs/.rr.yaml
+++ b/tests/plugins/server/configs/.rr.yaml
@@ -9,4 +9,4 @@ server:
relay_timeout: "20s"
logs:
mode: development
- level: error
+ level: info
diff --git a/tests/plugins/server/plugin_pipes.go b/tests/plugins/server/plugin_pipes.go
index af34b4d3..f1c13734 100644
--- a/tests/plugins/server/plugin_pipes.go
+++ b/tests/plugins/server/plugin_pipes.go
@@ -67,7 +67,7 @@ func (f *Foo) Serve() chan error {
return errCh
}
if cmd == nil {
- errCh <- errors.E(op, "command is nil")
+ errCh <- errors.E(op, errors.Str("command is nil"))
return errCh
}
diff --git a/tests/plugins/server/server_plugin_test.go b/tests/plugins/server/server_plugin_test.go
index c0c3c993..06c9eb50 100644
--- a/tests/plugins/server/server_plugin_test.go
+++ b/tests/plugins/server/server_plugin_test.go
@@ -23,22 +23,13 @@ func TestAppPipes(t *testing.T) {
vp := &config.Viper{}
vp.Path = "configs/.rr.yaml"
vp.Prefix = "rr"
- err = container.Register(vp)
- if err != nil {
- t.Fatal(err)
- }
-
- err = container.Register(&server.Plugin{})
- if err != nil {
- t.Fatal(err)
- }
- err = container.Register(&Foo{})
- if err != nil {
- t.Fatal(err)
- }
-
- err = container.Register(&logger.ZapLogger{})
+ err = container.RegisterAll(
+ vp,
+ &server.Plugin{},
+ &Foo{},
+ &logger.ZapLogger{},
+ )
if err != nil {
t.Fatal(err)
}