Skip to content

Commit c63f7c5

Browse files
authored
fix gateway port inconsistent setting issue (in-memory vs config file) (#46)
1 parent eb0a926 commit c63f7c5

File tree

3 files changed

+84
-9
lines changed

3 files changed

+84
-9
lines changed

main.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,8 @@ func init() {
112112
panic(err)
113113
}
114114

115-
_state.OnGatewayPortChange(func(s string) error {
116-
config.Set(common.ConfigKeyGatewayPort, _state.GetGatewayPort())
117-
config.Set(common.ConfigKeyRuntimePath, _state.GetRuntimePath())
118-
115+
_state.OnGatewayPortChange(func(port string) error {
116+
config.Set(common.ConfigKeyGatewayPort, port)
119117
return config.WriteConfig()
120118
})
121119
}

route/management_route_test.go

+73
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package route
33
import (
44
"bytes"
55
"encoding/json"
6+
"errors"
67
"net/http"
78
"net/http/httptest"
89
"os"
@@ -134,3 +135,75 @@ func TestChangePort(t *testing.T) {
134135
assert.NilError(t, err)
135136
assert.Equal(t, expectedPort, result.Data)
136137
}
138+
139+
func TestChangePortNegative(t *testing.T) {
140+
defer setup(t)(t)
141+
142+
expectedPort := "123"
143+
144+
// set
145+
request := &model.ChangePortRequest{
146+
Port: expectedPort,
147+
}
148+
149+
body, err := json.Marshal(request)
150+
assert.NilError(t, err)
151+
152+
req, _ := http.NewRequest(http.MethodPut, "/v1/gateway/port", bytes.NewReader(body))
153+
req.RemoteAddr = "127.0.0.1:0"
154+
155+
w := httptest.NewRecorder()
156+
_router.ServeHTTP(w, req)
157+
158+
assert.Equal(t, http.StatusOK, w.Code)
159+
assert.Equal(t, expectedPort, "123")
160+
161+
// get
162+
req, _ = http.NewRequest(http.MethodGet, "/v1/gateway/port", nil)
163+
164+
w = httptest.NewRecorder()
165+
_router.ServeHTTP(w, req)
166+
167+
assert.Equal(t, http.StatusOK, w.Code)
168+
169+
var result *model.Result
170+
decoder := json.NewDecoder(w.Body)
171+
172+
err = decoder.Decode(&result)
173+
assert.NilError(t, err)
174+
assert.Equal(t, expectedPort, result.Data)
175+
176+
// emulate error
177+
_state.OnGatewayPortChange(func(_ string) error {
178+
return errors.New("error")
179+
})
180+
181+
// set
182+
request.Port = "456"
183+
184+
body, err = json.Marshal(request)
185+
assert.NilError(t, err)
186+
187+
req, _ = http.NewRequest(http.MethodPut, "/v1/gateway/port", bytes.NewReader(body))
188+
req.RemoteAddr = "127.0.0.1:0"
189+
190+
w = httptest.NewRecorder()
191+
_router.ServeHTTP(w, req)
192+
193+
assert.Equal(t, http.StatusInternalServerError, w.Code)
194+
assert.Equal(t, expectedPort, "123")
195+
196+
// get
197+
req, _ = http.NewRequest(http.MethodGet, "/v1/gateway/port", nil)
198+
199+
w = httptest.NewRecorder()
200+
_router.ServeHTTP(w, req)
201+
202+
assert.Equal(t, http.StatusOK, w.Code)
203+
204+
decoder = json.NewDecoder(w.Body)
205+
206+
err = decoder.Decode(&result)
207+
assert.NilError(t, err)
208+
assert.Equal(t, expectedPort, result.Data)
209+
}

service/state.go

+9-5
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,13 @@ func NewState() *State {
1818
}
1919
}
2020

21-
func (c *State) SetGatewayPort(port string) error {
22-
c.gatewayPort = port
23-
return c.notifyOnGatewayPortChange()
21+
func (c *State) SetGatewayPort(port string) (err error) {
22+
defer func() {
23+
if err == nil {
24+
c.gatewayPort = port
25+
}
26+
}()
27+
return c.notifyOnGatewayPortChange(port)
2428
}
2529

2630
func (c *State) GetGatewayPort() string {
@@ -32,9 +36,9 @@ func (c *State) OnGatewayPortChange(f func(string) error) {
3236
c.onGatewayPortChange = append(c.onGatewayPortChange, f)
3337
}
3438

35-
func (c *State) notifyOnGatewayPortChange() error {
39+
func (c *State) notifyOnGatewayPortChange(port string) error {
3640
for i := len(c.onGatewayPortChange) - 1; i >= 0; i-- {
37-
if err := c.onGatewayPortChange[i](c.gatewayPort); err != nil {
41+
if err := c.onGatewayPortChange[i](port); err != nil {
3842
return err
3943
}
4044
}

0 commit comments

Comments
 (0)