Skip to content

Commit 42d1cb2

Browse files
committed
More stringent tests
1 parent 4840272 commit 42d1cb2

5 files changed

Lines changed: 89 additions & 52 deletions

File tree

main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"io"
88
"os"
9+
"strings"
910

1011
"github.com/gorcon/rcon-cli/internal/config"
1112
"github.com/gorcon/rcon-cli/internal/logger"
@@ -21,7 +22,7 @@ const CommandQuit = ":q"
2122

2223
// Version displays service version in semantic versioning (http://semver.org/).
2324
// Can be replaced while compiling with flag `-ldflags "-X main.Version=${VERSION}"`.
24-
var Version = "develop"
25+
var Version = "0.0.0-develop"
2526

2627
func main() {
2728
app := NewApp(os.Stdin, os.Stdout)
@@ -118,6 +119,10 @@ func Execute(w io.Writer, ses session.Session, command string) error {
118119
}
119120

120121
if result != "" {
122+
result = strings.TrimSuffix(result, "\r\n")
123+
result = strings.TrimSuffix(result, "\r")
124+
result = strings.TrimSuffix(result, "\n")
125+
121126
fmt.Fprintln(w, result)
122127
}
123128

main_test.go

Lines changed: 70 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package main
22

33
import (
44
"bytes"
5-
"encoding/json"
65
"fmt"
6+
"net/http/httptest"
77
"os"
88
"strings"
99
"testing"
@@ -164,53 +164,89 @@ func TestExecute(t *testing.T) {
164164
}
165165
}()
166166

167-
w := &bytes.Buffer{}
167+
serverWebRCON := httptest.NewServer(MockHandlersWebRCON())
168+
defer serverWebRCON.Close()
168169

169170
// Test empty address.
170171
t.Run("empty address", func(t *testing.T) {
172+
w := &bytes.Buffer{}
173+
171174
err := Execute(w, session.Session{Address: "", Password: MockPasswordRCON}, MockCommandHelpRCON)
172175
assert.Error(t, err)
173176
})
174177

175178
// Test empty password.
176179
t.Run("empty password", func(t *testing.T) {
180+
w := &bytes.Buffer{}
181+
177182
err := Execute(w, session.Session{Address: serverRCON.Addr(), Password: ""}, MockCommandHelpRCON)
178183
assert.Error(t, err)
179184
})
180185

181186
// Test wrong password.
182187
t.Run("wrong password", func(t *testing.T) {
188+
w := &bytes.Buffer{}
189+
183190
err := Execute(w, session.Session{Address: serverRCON.Addr(), Password: "wrong"}, MockCommandHelpRCON)
184191
assert.Error(t, err)
185192
})
186193

187194
// Test empty command.
188195
t.Run("empty command", func(t *testing.T) {
196+
w := &bytes.Buffer{}
197+
189198
err := Execute(w, session.Session{Address: serverRCON.Addr(), Password: MockPasswordRCON}, "")
190199
assert.Error(t, err)
191200
})
192201

193202
// Test long command.
194203
t.Run("long command", func(t *testing.T) {
204+
w := &bytes.Buffer{}
205+
195206
bigCommand := make([]byte, 1001)
196207
err := Execute(w, session.Session{Address: serverRCON.Addr(), Password: MockPasswordRCON}, string(bigCommand))
197208
assert.Error(t, err)
198209
})
199210

200211
// Positive RCON test Execute func.
201212
t.Run("no error rcon", func(t *testing.T) {
213+
w := &bytes.Buffer{}
214+
202215
err := Execute(w, session.Session{Address: serverRCON.Addr(), Password: MockPasswordRCON}, MockCommandHelpRCON)
203216
assert.NoError(t, err)
217+
218+
result := strings.TrimSuffix(w.String(), "\n")
219+
assert.Equal(t, MockCommandHelpResponseTextRCON, result)
204220
})
205221

206222
// Positive TELNET test Execute func.
207223
t.Run("no error telnet", func(t *testing.T) {
224+
w := &bytes.Buffer{}
225+
208226
err := Execute(w, session.Session{Address: serverTELNET.Addr(), Password: MockPasswordTELNET, Type: session.ProtocolTELNET}, MockCommandHelpTELNET)
209227
assert.NoError(t, err)
228+
229+
result := strings.TrimSuffix(w.String(), "\n")
230+
if !strings.Contains(result, MockCommandHelpResponseTextTELNET) {
231+
assert.Equal(t, MockCommandHelpResponseTextTELNET, result)
232+
}
233+
})
234+
235+
// Positive WEB RCON test Execute func.
236+
t.Run("no error web", func(t *testing.T) {
237+
w := &bytes.Buffer{}
238+
239+
err := Execute(w, session.Session{Address: serverWebRCON.Listener.Addr().String(), Password: MockPasswordWebRCON, Type: session.ProtocolWebRCON}, "status")
240+
assert.NoError(t, err)
241+
242+
result := strings.TrimSuffix(w.String(), "\n")
243+
assert.Equal(t, MockCommandStatusResponseTextWebRCON, result)
210244
})
211245

212246
// Positive test Execute func with log.
213247
t.Run("no error with log", func(t *testing.T) {
248+
w := &bytes.Buffer{}
249+
214250
logFileName := "tmpfile.log"
215251
defer func() {
216252
err := os.Remove(logFileName)
@@ -226,7 +262,8 @@ func TestExecute(t *testing.T) {
226262
password := getVar("TEST_PZ_SERVER_PASSWORD", "docker")
227263

228264
t.Run("pz server", func(t *testing.T) {
229-
needle := `List of server commands :
265+
needle := func() string {
266+
n := `List of server commands :
230267
* addalltowhitelist : Add all the current users connected with a password in the whitelist, so their account is protected.
231268
* additem : Add an item to a player, if no username is given the item will be added to you, count is optional, use /additem \"username\" \"module.item\" count, ex : /additem \"rj\" \"Base.Axe\" count
232269
* adduser : Use this command to add a new user in a whitelisted server, use : /adduser \"username\" \"pwd\"
@@ -264,23 +301,18 @@ func TestExecute(t *testing.T) {
264301
* unbanuser : Unban a player, use : /unbanuser \"username\"
265302
* voiceban : Block voice from user \"username\", use : /voiceban \"username\" -value, ex /voiceban \"rj\" -true (could be -false)`
266303

267-
needle = strings.Replace(needle, "List of server commands :", "List of server commands : ", -1)
304+
n = strings.Replace(n, "List of server commands :", "List of server commands : ", -1)
268305

269-
err := Execute(w, session.Session{Address: addr, Password: password}, "help")
270-
assert.NoError(t, err)
271-
assert.NotEmpty(t, w.String())
306+
return n
307+
}()
272308

273-
if !strings.Contains(w.String(), needle) {
274-
diff := struct {
275-
R string
276-
N string
277-
}{R: w.String(), N: needle}
309+
w := &bytes.Buffer{}
278310

279-
js, _ := json.Marshal(diff)
280-
fmt.Println(string(js))
311+
err := Execute(w, session.Session{Address: addr, Password: password}, "help")
312+
assert.NoError(t, err)
281313

282-
t.Error("response is not contain needle string")
283-
}
314+
result := strings.TrimSuffix(w.String(), "\n")
315+
assert.Equal(t, needle, result)
284316
})
285317
}
286318

@@ -289,7 +321,8 @@ func TestExecute(t *testing.T) {
289321
password := getVar("TEST_7DTD_SERVER_PASSWORD", "banana")
290322

291323
t.Run("7dtd server", func(t *testing.T) {
292-
needle := `*** List of Commands ***
324+
needle := func() string {
325+
n := `*** List of Commands ***
293326
admin => Manage user permission levels
294327
aiddebug => Toggles AIDirector debug output.
295328
audio => Watch audio stats
@@ -405,24 +438,21 @@ of your current perk levels in a CSV file next to it.
405438
xuireload => Access xui related functions such as reinitializing a window group, opening a window group
406439
zip => Control zipline settings`
407440

408-
needle = strings.Replace(needle, "\n", "\r\n", -1)
409-
needle = strings.Replace(needle, "some generic info\r\n", "some generic info\n", -1)
410-
needle = strings.Replace(needle, "Also stores a list\r\n", "Also stores a list\n", -1)
441+
n = strings.Replace(n, "\n", "\r\n", -1)
442+
n = strings.Replace(n, "some generic info\r\n", "some generic info\n", -1)
443+
n = strings.Replace(n, "Also stores a list\r\n", "Also stores a list\n", -1)
444+
445+
return n
446+
}()
447+
448+
w := &bytes.Buffer{}
411449

412450
err := Execute(w, session.Session{Address: addr, Password: password, Type: session.ProtocolTELNET}, "help")
413451
assert.NoError(t, err)
414-
assert.NotEmpty(t, w.String())
415452

453+
result := strings.TrimSuffix(w.String(), "\n")
416454
if !strings.Contains(w.String(), needle) {
417-
diff := struct {
418-
R string
419-
N string
420-
}{R: w.String(), N: needle}
421-
422-
js, _ := json.Marshal(diff)
423-
fmt.Println(string(js))
424-
425-
t.Error("response is not contain needle string")
455+
assert.Equal(t, needle, result)
426456
}
427457
})
428458
}
@@ -432,6 +462,8 @@ of your current perk levels in a CSV file next to it.
432462
password := getVar("TEST_RUST_SERVER_RCON_PASSWORD", "docker")
433463

434464
t.Run("rust server rcon", func(t *testing.T) {
465+
w := &bytes.Buffer{}
466+
435467
err := Execute(w, session.Session{Address: addr, Password: password}, "status")
436468
assert.NoError(t, err)
437469
assert.NotEmpty(t, w.String())
@@ -445,6 +477,8 @@ of your current perk levels in a CSV file next to it.
445477
password := getVar("TEST_RUST_SERVER_WEB_PASSWORD", "docker")
446478

447479
t.Run("rust server web", func(t *testing.T) {
480+
w := &bytes.Buffer{}
481+
448482
err := Execute(w, session.Session{Address: addr, Password: password, Type: session.ProtocolWebRCON}, "status")
449483
assert.NoError(t, err)
450484
assert.NotEmpty(t, w.String())
@@ -552,7 +586,7 @@ func TestNewApp(t *testing.T) {
552586
// Test getting address and password from config. Log is not used.
553587
t.Run("getting address and password from args with log", func(t *testing.T) {
554588
var configFileName = "rcon-temp.yaml"
555-
err := CreateConfigFile(configFileName, server.Addr(), MockPasswordRCON)
589+
err := createConfigFile(configFileName, server.Addr(), MockPasswordRCON)
556590
assert.NoError(t, err)
557591
defer func() {
558592
err := os.Remove(configFileName)
@@ -590,7 +624,7 @@ func TestNewApp(t *testing.T) {
590624
// Test default config file is incorrect. Log is not used.
591625
t.Run("default config file is incorrect", func(t *testing.T) {
592626
var configFileName = "rcon-temp.yaml"
593-
err := CreateInvalidConfigFile(configFileName, server.Addr(), MockPasswordRCON)
627+
err := createInvalidConfigFile(configFileName, server.Addr(), MockPasswordRCON)
594628
assert.NoError(t, err)
595629
defer func() {
596630
err := os.Remove(configFileName)
@@ -661,8 +695,8 @@ func TestNewApp(t *testing.T) {
661695
// DefaultTestLogName sets the default log file name.
662696
const DefaultTestLogName = "rcon-default.log"
663697

664-
// CreateConfigFile creates config file with default section.
665-
func CreateConfigFile(name string, address string, password string) error {
698+
// createConfigFile creates config file with default section.
699+
func createConfigFile(name string, address string, password string) error {
666700
var stringBody = fmt.Sprintf(
667701
"%s:\n address: \"%s\"\n password: \"%s\"\n log: \"%s\"",
668702
config.DefaultConfigEnv, address, password, DefaultTestLogName,
@@ -676,8 +710,8 @@ func CreateConfigFile(name string, address string, password string) error {
676710
return err
677711
}
678712

679-
// CreateIncorrectConfigFile creates incorrect yaml config file.
680-
func CreateInvalidConfigFile(name string, address string, password string) error {
713+
// createIncorrectConfigFile creates incorrect yaml config file.
714+
func createInvalidConfigFile(name string, address string, password string) error {
681715
var stringBody = fmt.Sprintf(
682716
"address: \"%s\"\n password: \"%s\"\n log: \"%s\"",
683717
address, password, DefaultTestLogName,

mockserver_rcon_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ const (
1313
MockAddressRCON = "127.0.0.1:0"
1414
MockPasswordRCON = "password"
1515

16-
MockCommandHelpRCON = "help"
17-
MockCommandHelpResponseRCON = "lorem ipsum dolor sit amet"
16+
MockCommandHelpRCON = "help"
17+
MockCommandHelpResponseTextRCON = "lorem ipsum dolor sit amet"
1818
)
1919

2020
// MockServerRCON is a mock Source RCON Protocol server.
@@ -136,7 +136,7 @@ func (s *MockServerRCON) handle(conn net.Conn) {
136136
case rcon.SERVERDATA_EXECCOMMAND:
137137
switch request.Body() {
138138
case MockCommandHelpRCON:
139-
responseBody = MockCommandHelpResponseRCON
139+
responseBody = MockCommandHelpResponseTextRCON
140140
default:
141141
responseBody = "unknown command"
142142
}

mockserver_telnet_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ const (
1414
MockAddressTELNET = "127.0.0.1:0"
1515
MockPasswordTELNET = "password"
1616

17-
MockCommandHelpTELNET = "help"
18-
MockCommandHelpResponseTELNET = "lorem ipsum dolor sit amet"
17+
MockCommandHelpTELNET = "help"
18+
MockCommandHelpResponseTextTELNET = "lorem ipsum dolor sit amet"
1919
)
2020

2121
// MockServerTELNET is a mock Source TELNET protocol server.
@@ -140,7 +140,7 @@ func (s *MockServerTELNET) handle(conn net.Conn) {
140140
switch request {
141141
case "":
142142
case MockCommandHelpTELNET:
143-
w.WriteString(MockCommandHelpResponseTELNET + telnet.CRLF)
143+
w.WriteString(MockCommandHelpResponseTextTELNET + telnet.CRLF)
144144
case "exit":
145145
default:
146146
w.WriteString(fmt.Sprintf("*** ERROR: unknown command '%s'", request) + telnet.CRLF)

mockserver_web_rcon_test.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,25 @@ import (
88
"strings"
99
"time"
1010

11-
gorilla "github.com/gorilla/websocket"
1211
"github.com/gorcon/websocket"
12+
gorilla "github.com/gorilla/websocket"
1313
)
1414

15-
const MockPasswordWebsocket = "password"
15+
const MockPasswordWebRCON = "password"
1616

17-
const MockCommandStatusResponseTextWebsocket = `status
18-
hostname: Rust Server [DOCKER]
17+
const MockCommandStatusResponseTextWebRCON = `hostname: Rust Server [DOCKER]
1918
version : 2260 secure (secure mode enabled, connected to Steam3)
2019
map : Procedural Map
2120
players : 0 (500 max) (0 queued) (0 joining)
22-
id name ping connected addr owner violation kicks
23-
`
21+
id name ping connected addr owner violation kicks`
2422

25-
func MockServerWebsocketHandlers() http.Handler {
23+
func MockHandlersWebRCON() http.Handler {
2624
server := http.NewServeMux()
2725

2826
var upgrader = gorilla.Upgrader{}
2927
upgrader.CheckOrigin = func(r *http.Request) bool { return true }
3028

31-
server.HandleFunc("/"+MockPasswordWebsocket, func(w http.ResponseWriter, r *http.Request) {
29+
server.HandleFunc("/"+MockPasswordWebRCON, func(w http.ResponseWriter, r *http.Request) {
3230
ws, err := upgrader.Upgrade(w, r, nil)
3331
if err != nil {
3432
log.Printf("upgrade error: %v\n", err)
@@ -59,7 +57,7 @@ func MockServerWebsocketHandlers() http.Handler {
5957
switch message.Message {
6058
case "status":
6159
response = websocket.Message{
62-
Message: MockCommandStatusResponseTextWebsocket,
60+
Message: MockCommandStatusResponseTextWebRCON,
6361
Identifier: message.Identifier,
6462
Type: "Generic",
6563
}

0 commit comments

Comments
 (0)