Skip to content

Commit 11164d0

Browse files
authored
Add more tests (#513)
* Add test for act/buitins.go * Add pgx to allow list of tests * Update test to cover more lines * Add test for embed_swagger.go * Add test for api/healthcheck.go * Test Execute function * Redirect stdout and stderr to buffer * Create a directory before generating markdown files * Add test for cmd/gen_docs.go * Gofumpt * Fix magic number * Fix output message * Test multi-tenant config * Update config function signatures to return errors instead of log.Fatal that runs os.Exit * Add test for config validation * Fix linter errors * Add test for missing config file * Add more tests for config package * Add tests for syslog and rsyslog * Add tests for hclog log level * Test hclog logging with different levels * Add test for header bypass response writer * Test removal of plugin from metrics merger and start/stop of the merger scheduler * Add test for network/conn_wrapper.go * Address linter issues * Remove read/write test * Test more plugin registry function * Add test for OTLP tracer
1 parent 5147137 commit 11164d0

27 files changed

+856
-92
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ libtensorflow*
3434
# Test generated files
3535
cmd/test_*.yaml.bak
3636
cmd/test_*.yaml
37+
cmd/docs/*
3738

3839
# docker-compose
3940
gatewayd-files/
4041
cmd/gatewayd-plugin-cache-linux-amd64-*
42+

.golangci.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ linters-settings:
8787
- "github.com/spf13/cobra"
8888
- "github.com/knadh/koanf"
8989
- "github.com/spf13/cast"
90+
- "github.com/jackc/pgx/v5/pgproto3"
9091
tagalign:
9192
align: false
9293
sort: false

act/builtins_test.go

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package act
2+
3+
import (
4+
"testing"
5+
6+
sdkAct "github.com/gatewayd-io/gatewayd-plugin-sdk/act"
7+
"github.com/gatewayd-io/gatewayd-plugin-sdk/databases/postgres"
8+
gerr "github.com/gatewayd-io/gatewayd/errors"
9+
"github.com/jackc/pgx/v5/pgproto3"
10+
"github.com/rs/zerolog"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
13+
)
14+
15+
func Test_Terminate_Action(t *testing.T) {
16+
response, err := (&pgproto3.Terminate{}).Encode(
17+
postgres.ErrorResponse(
18+
"Request terminated",
19+
"ERROR",
20+
"42000",
21+
"Policy terminated the request",
22+
),
23+
)
24+
require.NoError(t, err)
25+
26+
tests := []struct {
27+
params []sdkAct.Parameter
28+
result any
29+
err error
30+
}{
31+
{
32+
params: []sdkAct.Parameter{},
33+
result: nil,
34+
err: gerr.ErrLoggerRequired,
35+
},
36+
{
37+
params: []sdkAct.Parameter{
38+
{
39+
Key: LoggerKey,
40+
Value: nil,
41+
},
42+
},
43+
result: nil,
44+
err: gerr.ErrLoggerRequired,
45+
},
46+
{
47+
params: []sdkAct.Parameter{
48+
{
49+
Key: LoggerKey,
50+
Value: zerolog.New(nil),
51+
},
52+
},
53+
result: true,
54+
},
55+
{
56+
params: []sdkAct.Parameter{
57+
{
58+
Key: LoggerKey,
59+
Value: zerolog.New(nil),
60+
},
61+
{
62+
Key: ResultKey,
63+
Value: nil,
64+
},
65+
},
66+
result: true,
67+
},
68+
{
69+
params: []sdkAct.Parameter{
70+
{
71+
Key: LoggerKey,
72+
Value: zerolog.New(nil),
73+
},
74+
{
75+
Key: ResultKey,
76+
Value: map[string]any{},
77+
},
78+
},
79+
result: map[string]any{"response": response},
80+
},
81+
}
82+
83+
for _, test := range tests {
84+
t.Run("Test_Terminate_Action", func(t *testing.T) {
85+
result, err := Terminate(nil, test.params...)
86+
assert.ErrorIs(t, err, test.err)
87+
assert.Equal(t, result, test.result)
88+
})
89+
}
90+
}
91+
92+
func Test_Log_Action(t *testing.T) {
93+
tests := []struct {
94+
params []sdkAct.Parameter
95+
result any
96+
err error
97+
}{
98+
{
99+
params: []sdkAct.Parameter{},
100+
result: nil,
101+
err: gerr.ErrLoggerRequired,
102+
},
103+
{
104+
params: []sdkAct.Parameter{
105+
{
106+
Key: LoggerKey,
107+
Value: nil,
108+
},
109+
},
110+
result: nil,
111+
err: gerr.ErrLoggerRequired,
112+
},
113+
{
114+
params: []sdkAct.Parameter{
115+
{
116+
Key: LoggerKey,
117+
Value: zerolog.New(nil),
118+
},
119+
},
120+
result: true,
121+
},
122+
}
123+
124+
for _, test := range tests {
125+
t.Run("Test_Log_Action", func(t *testing.T) {
126+
result, err := Log(nil, test.params...)
127+
assert.ErrorIs(t, err, test.err)
128+
assert.Equal(t, result, test.result)
129+
})
130+
}
131+
}

api/api_test.go

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"testing"
77

88
sdkPlugin "github.com/gatewayd-io/gatewayd-plugin-sdk/plugin"
9+
pluginV1 "github.com/gatewayd-io/gatewayd-plugin-sdk/plugin/v1"
910
"github.com/gatewayd-io/gatewayd/act"
1011
v1 "github.com/gatewayd-io/gatewayd/api/v1"
1112
"github.com/gatewayd-io/gatewayd/config"
@@ -30,7 +31,8 @@ func TestGetGlobalConfig(t *testing.T) {
3031
// Load config from the default config file.
3132
conf := config.NewConfig(context.TODO(),
3233
config.Config{GlobalConfigFile: "../gatewayd.yaml", PluginConfigFile: "../gatewayd_plugins.yaml"})
33-
conf.InitConfig(context.TODO())
34+
gerr := conf.InitConfig(context.TODO())
35+
require.Nil(t, gerr)
3436
assert.NotEmpty(t, conf.Global)
3537

3638
api := API{
@@ -53,13 +55,18 @@ func TestGetGlobalConfigWithGroupName(t *testing.T) {
5355
// Load config from the default config file.
5456
conf := config.NewConfig(context.TODO(),
5557
config.Config{GlobalConfigFile: "../gatewayd.yaml", PluginConfigFile: "../gatewayd_plugins.yaml"})
56-
conf.InitConfig(context.TODO())
58+
gerr := conf.InitConfig(context.TODO())
59+
require.Nil(t, gerr)
5760
assert.NotEmpty(t, conf.Global)
5861

5962
api := API{
6063
Config: conf,
6164
}
62-
globalConfig, err := api.GetGlobalConfig(context.Background(), &v1.Group{GroupName: nil})
65+
defaultGroup := config.Default
66+
globalConfig, err := api.GetGlobalConfig(
67+
context.Background(),
68+
&v1.Group{GroupName: &defaultGroup},
69+
)
6370
require.NoError(t, err)
6471
globalconf := globalConfig.AsMap()
6572
assert.NotEmpty(t, globalconf)
@@ -71,7 +78,7 @@ func TestGetGlobalConfigWithGroupName(t *testing.T) {
7178
assert.NotEmpty(t, globalconf["servers"])
7279
assert.NotEmpty(t, globalconf["metrics"])
7380
assert.NotEmpty(t, globalconf["api"])
74-
if _, ok := globalconf["loggers"].(map[string]interface{})["default"]; !ok {
81+
if _, ok := globalconf["loggers"].(map[string]interface{})[config.Default]; !ok {
7582
t.Errorf("loggers.default is not found")
7683
}
7784
}
@@ -80,7 +87,8 @@ func TestGetGlobalConfigWithNonExistingGroupName(t *testing.T) {
8087
// Load config from the default config file.
8188
conf := config.NewConfig(context.TODO(),
8289
config.Config{GlobalConfigFile: "../gatewayd.yaml", PluginConfigFile: "../gatewayd_plugins.yaml"})
83-
conf.InitConfig(context.TODO())
90+
gerr := conf.InitConfig(context.TODO())
91+
require.Nil(t, gerr)
8492
assert.NotEmpty(t, conf.Global)
8593

8694
api := API{
@@ -96,7 +104,8 @@ func TestGetPluginConfig(t *testing.T) {
96104
// Load config from the default config file.
97105
conf := config.NewConfig(context.TODO(),
98106
config.Config{GlobalConfigFile: "../gatewayd.yaml", PluginConfigFile: "../gatewayd_plugins.yaml"})
99-
conf.InitConfig(context.TODO())
107+
gerr := conf.InitConfig(context.TODO())
108+
require.Nil(t, gerr)
100109
assert.NotEmpty(t, conf.Global)
101110

102111
api := API{
@@ -136,6 +145,17 @@ func TestGetPlugins(t *testing.T) {
136145
RemoteURL: "plugin-url",
137146
Checksum: "plugin-checksum",
138147
},
148+
Requires: []sdkPlugin.Identifier{
149+
{
150+
Name: "plugin1-name",
151+
Version: "plugin1-version",
152+
RemoteURL: "plugin1-url",
153+
Checksum: "plugin1-checksum",
154+
},
155+
},
156+
Hooks: []pluginV1.HookName{
157+
pluginV1.HookName_HOOK_NAME_ON_TRAFFIC_FROM_CLIENT,
158+
},
139159
})
140160

141161
api := API{
@@ -145,6 +165,11 @@ func TestGetPlugins(t *testing.T) {
145165
require.NoError(t, err)
146166
assert.NotEmpty(t, plugins)
147167
assert.NotEmpty(t, plugins.GetConfigs())
168+
assert.NotEmpty(t, plugins.GetConfigs()[0].GetRequires())
169+
assert.Equal(
170+
t,
171+
int32(pluginV1.HookName_HOOK_NAME_ON_TRAFFIC_FROM_CLIENT),
172+
plugins.GetConfigs()[0].GetHooks()[0])
148173
}
149174

150175
func TestGetPluginsWithEmptyPluginRegistry(t *testing.T) {

api/embed_swagger_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package api
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func Test_IsSwaggerEmbedded(t *testing.T) {
10+
assert.False(t, IsSwaggerEmbedded())
11+
}

api/healthcheck_test.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package api
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/gatewayd-io/gatewayd/act"
8+
"github.com/gatewayd-io/gatewayd/config"
9+
"github.com/gatewayd-io/gatewayd/network"
10+
"github.com/gatewayd-io/gatewayd/plugin"
11+
"github.com/gatewayd-io/gatewayd/pool"
12+
"github.com/rs/zerolog"
13+
"github.com/stretchr/testify/assert"
14+
"github.com/stretchr/testify/require"
15+
"google.golang.org/grpc/health/grpc_health_v1"
16+
)
17+
18+
func Test_Healthchecker(t *testing.T) {
19+
clientConfig := &config.Client{
20+
Network: config.DefaultNetwork,
21+
Address: config.DefaultAddress,
22+
}
23+
client := network.NewClient(context.TODO(), clientConfig, zerolog.Logger{}, nil)
24+
newPool := pool.NewPool(context.TODO(), 1)
25+
require.NotNil(t, newPool)
26+
assert.Nil(t, newPool.Put(client.ID, client))
27+
28+
proxy := network.NewProxy(
29+
context.TODO(),
30+
network.Proxy{
31+
AvailableConnections: newPool,
32+
HealthCheckPeriod: config.DefaultHealthCheckPeriod,
33+
ClientConfig: &config.Client{
34+
Network: config.DefaultNetwork,
35+
Address: config.DefaultAddress,
36+
},
37+
Logger: zerolog.Logger{},
38+
PluginTimeout: config.DefaultPluginTimeout,
39+
},
40+
)
41+
42+
actRegistry := act.NewActRegistry(
43+
act.Registry{
44+
Signals: act.BuiltinSignals(),
45+
Policies: act.BuiltinPolicies(),
46+
Actions: act.BuiltinActions(),
47+
DefaultPolicyName: config.DefaultPolicy,
48+
PolicyTimeout: config.DefaultPolicyTimeout,
49+
DefaultActionTimeout: config.DefaultActionTimeout,
50+
Logger: zerolog.Logger{},
51+
})
52+
53+
pluginRegistry := plugin.NewRegistry(
54+
context.TODO(),
55+
plugin.Registry{
56+
ActRegistry: actRegistry,
57+
Compatibility: config.Loose,
58+
Logger: zerolog.Logger{},
59+
DevMode: true,
60+
},
61+
)
62+
63+
server := network.NewServer(
64+
context.TODO(),
65+
network.Server{
66+
Network: config.DefaultNetwork,
67+
Address: config.DefaultAddress,
68+
TickInterval: config.DefaultTickInterval,
69+
Options: network.Option{
70+
EnableTicker: false,
71+
},
72+
Proxy: proxy,
73+
Logger: zerolog.Logger{},
74+
PluginRegistry: pluginRegistry,
75+
PluginTimeout: config.DefaultPluginTimeout,
76+
HandshakeTimeout: config.DefaultHandshakeTimeout,
77+
},
78+
)
79+
80+
healthchecker := HealthChecker{
81+
Servers: map[string]*network.Server{
82+
config.Default: server,
83+
},
84+
}
85+
assert.NotNil(t, healthchecker)
86+
hcr, err := healthchecker.Check(context.TODO(), &grpc_health_v1.HealthCheckRequest{})
87+
assert.NoError(t, err)
88+
assert.NotNil(t, hcr)
89+
assert.Equal(t, grpc_health_v1.HealthCheckResponse_NOT_SERVING, hcr.GetStatus())
90+
91+
err = healthchecker.Watch(&grpc_health_v1.HealthCheckRequest{}, nil)
92+
assert.Error(t, err)
93+
assert.Equal(t, "rpc error: code = Unimplemented desc = not implemented", err.Error())
94+
}

0 commit comments

Comments
 (0)