summaryrefslogtreecommitdiff
path: root/plugins/http/rpc_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/http/rpc_test.go')
-rw-r--r--plugins/http/rpc_test.go221
1 files changed, 221 insertions, 0 deletions
diff --git a/plugins/http/rpc_test.go b/plugins/http/rpc_test.go
new file mode 100644
index 00000000..e57a8699
--- /dev/null
+++ b/plugins/http/rpc_test.go
@@ -0,0 +1,221 @@
+package http
+
+import (
+ json "github.com/json-iterator/go"
+ "github.com/sirupsen/logrus"
+ "github.com/sirupsen/logrus/hooks/test"
+ "github.com/spiral/roadrunner/service"
+ "github.com/spiral/roadrunner/service/rpc"
+ "github.com/stretchr/testify/assert"
+ "os"
+ "strconv"
+ "testing"
+ "time"
+)
+
+func Test_RPC(t *testing.T) {
+ logger, _ := test.NewNullLogger()
+ logger.SetLevel(logrus.DebugLevel)
+
+ c := service.NewContainer(logger)
+ c.Register(rpc.ID, &rpc.Service{})
+ c.Register(ID, &Service{})
+
+ assert.NoError(t, c.Init(&testCfg{
+ rpcCfg: `{"enable":true, "listen":"tcp://:5004"}`,
+ httpCfg: `{
+ "enable": true,
+ "address": ":16031",
+ "maxRequestSize": 1024,
+ "uploads": {
+ "dir": ` + tmpDir() + `,
+ "forbid": []
+ },
+ "workers":{
+ "command": "php ../../tests/http/client.php pid pipes",
+ "relay": "pipes",
+ "pool": {
+ "numWorkers": 1,
+ "allocateTimeout": 10000000,
+ "destroyTimeout": 10000000
+ }
+ }
+ }`}))
+
+ s, _ := c.Get(ID)
+ ss := s.(*Service)
+
+ s2, _ := c.Get(rpc.ID)
+ rs := s2.(*rpc.Service)
+
+ go func() {
+ err := c.Serve()
+ if err != nil {
+ t.Errorf("error during the Serve: error %v", err)
+ }
+ }()
+
+ time.Sleep(time.Second)
+
+ res, _, err := get("http://localhost:16031")
+ if err != nil {
+ t.Fatal(err)
+ }
+ assert.Equal(t, strconv.Itoa(*ss.rr.Workers()[0].Pid), res)
+
+ cl, err := rs.Client()
+ assert.NoError(t, err)
+
+ r := ""
+ assert.NoError(t, cl.Call("http.Reset", true, &r))
+ assert.Equal(t, "OK", r)
+
+ res2, _, err := get("http://localhost:16031")
+ if err != nil {
+ t.Fatal(err)
+ }
+ assert.Equal(t, strconv.Itoa(*ss.rr.Workers()[0].Pid), res2)
+ assert.NotEqual(t, res, res2)
+ c.Stop()
+}
+
+func Test_RPC_Unix(t *testing.T) {
+ logger, _ := test.NewNullLogger()
+ logger.SetLevel(logrus.DebugLevel)
+
+ c := service.NewContainer(logger)
+ c.Register(rpc.ID, &rpc.Service{})
+ c.Register(ID, &Service{})
+
+ sock := `unix://` + os.TempDir() + `/rpc.unix`
+ j := json.ConfigCompatibleWithStandardLibrary
+ data, _ := j.Marshal(sock)
+
+ assert.NoError(t, c.Init(&testCfg{
+ rpcCfg: `{"enable":true, "listen":` + string(data) + `}`,
+ httpCfg: `{
+ "enable": true,
+ "address": ":6032",
+ "maxRequestSize": 1024,
+ "uploads": {
+ "dir": ` + tmpDir() + `,
+ "forbid": []
+ },
+ "workers":{
+ "command": "php ../../tests/http/client.php pid pipes",
+ "relay": "pipes",
+ "pool": {
+ "numWorkers": 1,
+ "allocateTimeout": 10000000,
+ "destroyTimeout": 10000000
+ }
+ }
+ }`}))
+
+ s, _ := c.Get(ID)
+ ss := s.(*Service)
+
+ s2, _ := c.Get(rpc.ID)
+ rs := s2.(*rpc.Service)
+
+ go func() {
+ err := c.Serve()
+ if err != nil {
+ t.Errorf("error during the Serve: error %v", err)
+ }
+ }()
+
+ time.Sleep(time.Millisecond * 500)
+
+ res, _, err := get("http://localhost:6032")
+ if err != nil {
+ c.Stop()
+ t.Fatal(err)
+ }
+ if ss.rr.Workers() != nil && len(ss.rr.Workers()) > 0 {
+ assert.Equal(t, strconv.Itoa(*ss.rr.Workers()[0].Pid), res)
+ } else {
+ c.Stop()
+ t.Fatal("no workers initialized")
+ }
+
+ cl, err := rs.Client()
+ if err != nil {
+ c.Stop()
+ t.Fatal(err)
+ }
+
+ r := ""
+ assert.NoError(t, cl.Call("http.Reset", true, &r))
+ assert.Equal(t, "OK", r)
+
+ res2, _, err := get("http://localhost:6032")
+ if err != nil {
+ c.Stop()
+ t.Fatal(err)
+ }
+ assert.Equal(t, strconv.Itoa(*ss.rr.Workers()[0].Pid), res2)
+ assert.NotEqual(t, res, res2)
+ c.Stop()
+}
+
+func Test_Workers(t *testing.T) {
+ logger, _ := test.NewNullLogger()
+ logger.SetLevel(logrus.DebugLevel)
+
+ c := service.NewContainer(logger)
+ c.Register(rpc.ID, &rpc.Service{})
+ c.Register(ID, &Service{})
+
+ assert.NoError(t, c.Init(&testCfg{
+ rpcCfg: `{"enable":true, "listen":"tcp://:5005"}`,
+ httpCfg: `{
+ "enable": true,
+ "address": ":6033",
+ "maxRequestSize": 1024,
+ "uploads": {
+ "dir": ` + tmpDir() + `,
+ "forbid": []
+ },
+ "workers":{
+ "command": "php ../../tests/http/client.php pid pipes",
+ "relay": "pipes",
+ "pool": {
+ "numWorkers": 1,
+ "allocateTimeout": 10000000,
+ "destroyTimeout": 10000000
+ }
+ }
+ }`}))
+
+ s, _ := c.Get(ID)
+ ss := s.(*Service)
+
+ s2, _ := c.Get(rpc.ID)
+ rs := s2.(*rpc.Service)
+
+ go func() {
+ err := c.Serve()
+ if err != nil {
+ t.Errorf("error during the Serve: error %v", err)
+ }
+ }()
+ time.Sleep(time.Millisecond * 500)
+
+ cl, err := rs.Client()
+ assert.NoError(t, err)
+
+ r := &WorkerList{}
+ assert.NoError(t, cl.Call("http.Workers", true, &r))
+ assert.Len(t, r.Workers, 1)
+
+ assert.Equal(t, *ss.rr.Workers()[0].Pid, r.Workers[0].Pid)
+ c.Stop()
+}
+
+func Test_Errors(t *testing.T) {
+ r := &rpcServer{nil}
+
+ assert.Error(t, r.Reset(true, nil))
+ assert.Error(t, r.Workers(true, nil))
+}