Skip to content

Commit

Permalink
Fixed bugs in Websocket Integration Tests (DiceDB#1142)
Browse files Browse the repository at this point in the history
  • Loading branch information
psrvere authored Oct 18, 2024
1 parent ae941a6 commit 43392c1
Show file tree
Hide file tree
Showing 10 changed files with 167 additions and 80 deletions.
9 changes: 5 additions & 4 deletions integration_tests/commands/websocket/get_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"testing"
"time"

"gotest.tools/v3/assert"
"github.com/stretchr/testify/assert"
)

func TestGet(t *testing.T) {
Expand All @@ -19,9 +19,9 @@ func TestGet(t *testing.T) {
}{
{
name: "Get with expiration",
cmds: []string{"SET k v EX 4", "GET k", "GET k"},
cmds: []string{"SET k v EX 1", "GET k", "GET k"},
expect: []interface{}{"OK", "v", "(nil)"},
delays: []time.Duration{0, 0, 5 * time.Second},
delays: []time.Duration{0, 0, 2 * time.Second},
},
}

Expand All @@ -31,7 +31,8 @@ func TestGet(t *testing.T) {
if tc.delays[i] > 0 {
time.Sleep(tc.delays[i])
}
result := exec.FireCommand(conn, cmd)
result, err := exec.FireCommandAndReadResponse(conn, cmd)
assert.Nil(t, err)
assert.Equal(t, tc.expect[i], result, "Value mismatch for cmd %s", cmd)
}
})
Expand Down
17 changes: 17 additions & 0 deletions integration_tests/commands/websocket/helper.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package websocket

import (
"testing"

"github.com/gorilla/websocket"
"github.com/stretchr/testify/assert"
)

func DeleteKey(t *testing.T, conn *websocket.Conn, exec *WebsocketCommandExecutor, key string) {
cmd := "DEL " + key
resp, err := exec.FireCommandAndReadResponse(conn, cmd)
assert.Nil(t, err)
respFloat, ok := resp.(float64)
assert.True(t, ok, "error converting response to float64")
assert.True(t, respFloat == 1 || respFloat == 0, "unexpected response in %v: %v", cmd, resp)
}
9 changes: 5 additions & 4 deletions integration_tests/commands/websocket/hyperloglog_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package websocket
import (
"testing"

"gotest.tools/v3/assert"
"github.com/stretchr/testify/assert"
)

func TestHyperLogLogCommands(t *testing.T) {
Expand Down Expand Up @@ -82,11 +82,12 @@ func TestHyperLogLogCommands(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
conn := exec.ConnectToServer()
exec.FireCommand(conn, "del k")
DeleteKey(t, conn, exec, "k")

for i, cmd := range tc.commands {
result := exec.FireCommand(conn, cmd)
assert.DeepEqual(t, tc.expected[i], result)
result, err := exec.FireCommandAndReadResponse(conn, cmd)
assert.Nil(t, err)
assert.Equal(t, tc.expected[i], result)
}
})
}
Expand Down
33 changes: 20 additions & 13 deletions integration_tests/commands/websocket/json_test.go
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
package websocket

import (
"gotest.tools/v3/assert"
"testing"

"github.com/stretchr/testify/assert"
)

func TestJSONClearOperations(t *testing.T) {
exec := NewWebsocketCommandExecutor()
conn := exec.ConnectToServer()
defer conn.Close()

exec.FireCommand(conn, "DEL user")
DeleteKey(t, conn, exec, "user")

defer func() {
resp := exec.FireCommand(conn, "DEL user")
resp, err := exec.FireCommandAndReadResponse(conn, "DEL user")
assert.Nil(t, err)
assert.Equal(t, float64(1), resp)
}()

Expand Down Expand Up @@ -86,7 +88,8 @@ func TestJSONClearOperations(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
for i, cmd := range tc.commands {
result := exec.FireCommand(conn, cmd)
result, err := exec.FireCommandAndReadResponse(conn, cmd)
assert.Nil(t, err)
assert.Equal(t, tc.expected[i], result)
}
})
Expand All @@ -99,10 +102,11 @@ func TestJsonStrlen(t *testing.T) {

defer conn.Close()

exec.FireCommand(conn, "DEL doc")
DeleteKey(t, conn, exec, "doc")

defer func() {
resp := exec.FireCommand(conn, "DEL doc")
resp, err := exec.FireCommandAndReadResponse(conn, "DEL doc")
assert.Nil(t, err)
assert.Equal(t, float64(1), resp)
}()

Expand Down Expand Up @@ -172,12 +176,13 @@ func TestJsonStrlen(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
for i, cmd := range tc.commands {
result := exec.FireCommand(conn, cmd)
result, err := exec.FireCommandAndReadResponse(conn, cmd)
assert.Nil(t, err, "error: %v", err)
stringResult, ok := result.(string)
if ok {
assert.Equal(t, tc.expected[i], stringResult)
} else {
assert.Assert(t, arraysArePermutations(tc.expected[i].([]interface{}), result.([]interface{})))
assert.True(t, arraysArePermutations(tc.expected[i].([]interface{}), result.([]interface{})))
}
}
})
Expand All @@ -189,15 +194,16 @@ func TestJsonObjLen(t *testing.T) {
conn := exec.ConnectToServer()
defer conn.Close()

exec.FireCommand(conn, "DEL obj")
DeleteKey(t, conn, exec, "obj")

a := `{"name":"jerry","partner":{"name":"tom","language":["rust"]}}`
b := `{"name":"jerry","partner":{"name":"tom","language":["rust"]},"partner2":{"name":"spike","language":["go","rust"]}}`
c := `{"name":"jerry","partner":{"name":"tom","language":["rust"]},"partner2":{"name":12,"language":["rust"]}}`
d := `["this","is","an","array"]`

defer func() {
resp := exec.FireCommand(conn, "DEL obj")
resp, err := exec.FireCommandAndReadResponse(conn, "DEL obj")
assert.Nil(t, err)
assert.Equal(t, float64(1), resp)
}()

Expand Down Expand Up @@ -259,13 +265,14 @@ func TestJsonObjLen(t *testing.T) {
}

for _, tcase := range testCases {
exec.FireCommand(conn, "DEL obj")
DeleteKey(t, conn, exec, "obj")
t.Run(tcase.name, func(t *testing.T) {
for i := 0; i < len(tcase.commands); i++ {
cmd := tcase.commands[i]
out := tcase.expected[i]
result := exec.FireCommand(conn, cmd)
assert.DeepEqual(t, out, result)
result, err := exec.FireCommandAndReadResponse(conn, cmd)
assert.Nil(t, err)
assert.Equal(t, out, result)
}
})
}
Expand Down
7 changes: 4 additions & 3 deletions integration_tests/commands/websocket/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@ func TestMain(m *testing.M) {
// checks for available port and then forks a goroutine
// to start the server
opts := TestServerOptions{
Port: 8380,
Port: testPort1,
Logger: l,
}
RunWebsocketServer(context.Background(), &wg, opts)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
RunWebsocketServer(ctx, &wg, opts)

// Wait for the server to start
time.Sleep(2 * time.Second)
Expand All @@ -37,7 +39,6 @@ func TestMain(m *testing.M) {
// abort
conn := executor.ConnectToServer()
executor.FireCommand(conn, "abort")
executor.DisconnectServer(conn)

wg.Wait()
os.Exit(exitCode)
Expand Down
104 changes: 78 additions & 26 deletions integration_tests/commands/websocket/set_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"testing"
"time"

"gotest.tools/v3/assert"
"github.com/stretchr/testify/assert"
)

type TestCase struct {
Expand Down Expand Up @@ -39,11 +39,13 @@ func TestSet(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
conn := exec.ConnectToServer()
exec.FireCommand(conn, "del k")

DeleteKey(t, conn, exec, "k")

for i, cmd := range tc.commands {
result := exec.FireCommand(conn, cmd)
assert.DeepEqual(t, tc.expected[i], result)
result, err := exec.FireCommandAndReadResponse(conn, cmd)
assert.Nil(t, err)
assert.Equal(t, tc.expected[i], result)
}
})
}
Expand Down Expand Up @@ -124,11 +126,14 @@ func TestSetWithOptions(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
conn := exec.ConnectToServer()
exec.FireCommand(conn, "del k")
exec.FireCommand(conn, "del k1")
exec.FireCommand(conn, "del k2")

DeleteKey(t, conn, exec, "k")
DeleteKey(t, conn, exec, "k1")
DeleteKey(t, conn, exec, "k2")

for i, cmd := range tc.commands {
result := exec.FireCommand(conn, cmd)
result, err := exec.FireCommandAndReadResponse(conn, cmd)
assert.Nil(t, err)
assert.Equal(t, tc.expected[i], result)
}
})
Expand All @@ -143,32 +148,76 @@ func TestSetWithExat(t *testing.T) {
t.Run("SET with EXAT",
func(t *testing.T) {
conn := exec.ConnectToServer()
exec.FireCommand(conn, "DEL k")
assert.Equal(t, "OK", exec.FireCommand(conn, fmt.Sprintf("SET k v EXAT %v", Etime)), "Value mismatch for cmd SET k v EXAT "+Etime)
assert.Equal(t, "v", exec.FireCommand(conn, "GET k"), "Value mismatch for cmd GET k")
assert.Assert(t, exec.FireCommand(conn, "TTL k").(float64) <= 5, "Value mismatch for cmd TTL k")

DeleteKey(t, conn, exec, "k")

resp, err := exec.FireCommandAndReadResponse(conn, fmt.Sprintf("SET k v EXAT %v", Etime))
assert.Nil(t, err)
assert.Equal(t, "OK", resp, "Value mismatch for cmd SET k v EXAT "+Etime)

resp, err = exec.FireCommandAndReadResponse(conn, "GET k")
assert.Nil(t, err)
assert.Equal(t, "v", resp, "Value mismatch for cmd GET k")

resp, err = exec.FireCommandAndReadResponse(conn, "TTL k")
assert.Nil(t, err)
respFloat, ok := resp.(float64)
assert.True(t, ok)
assert.True(t, respFloat <= 5, "Value mismatch for cmd TTL k")

time.Sleep(3 * time.Second)
assert.Assert(t, exec.FireCommand(conn, "TTL k").(float64) <= 3, "Value mismatch for cmd TTL k")
resp, err = exec.FireCommandAndReadResponse(conn, "TTL k")
assert.Nil(t, err)
respFloat, ok = resp.(float64)
assert.True(t, ok)
assert.True(t, respFloat <= 3, "Value mismatch for cmd TTL k")

time.Sleep(3 * time.Second)
assert.Equal(t, "(nil)", exec.FireCommand(conn, "GET k"), "Value mismatch for cmd GET k")
assert.Equal(t, float64(-2), exec.FireCommand(conn, "TTL k"), "Value mismatch for cmd TTL k")
resp, err = exec.FireCommandAndReadResponse(conn, "GET k")
assert.Nil(t, err)
assert.Equal(t, "(nil)", resp, "Value mismatch for cmd GET k")

resp, err = exec.FireCommandAndReadResponse(conn, "TTL k")
assert.Nil(t, err)
respFloat, ok = resp.(float64)
assert.True(t, ok)
assert.Equal(t, float64(-2), respFloat, "Value mismatch for cmd TTL k")
})

t.Run("SET with invalid EXAT expires key immediately",
func(t *testing.T) {
conn := exec.ConnectToServer()
exec.FireCommand(conn, "DEL k")
assert.Equal(t, "OK", exec.FireCommand(conn, "SET k v EXAT "+BadTime), "Value mismatch for cmd SET k v EXAT "+BadTime)
assert.Equal(t, "(nil)", exec.FireCommand(conn, "GET k"), "Value mismatch for cmd GET k")
assert.Equal(t, float64(-2), exec.FireCommand(conn, "TTL k"), "Value mismatch for cmd TTL k")

DeleteKey(t, conn, exec, "k")

resp, err := exec.FireCommandAndReadResponse(conn, "SET k v EXAT "+BadTime)
assert.Nil(t, err)
assert.Equal(t, "OK", resp, "Value mismatch for cmd SET k v EXAT "+BadTime)

resp, err = exec.FireCommandAndReadResponse(conn, "GET k")
assert.Nil(t, err)
assert.Equal(t, "(nil)", resp, "Value mismatch for cmd GET k")

resp, err = exec.FireCommandAndReadResponse(conn, "TTL k")
assert.Nil(t, err)
respFloat, ok := resp.(float64)
assert.True(t, ok)
assert.Equal(t, float64(-2), respFloat, "Value mismatch for cmd TTL k")
})

t.Run("SET with EXAT and PXAT returns syntax error",
func(t *testing.T) {
conn := exec.ConnectToServer()
exec.FireCommand(conn, "DEL k")
assert.Equal(t, "ERR syntax error", exec.FireCommand(conn, "SET k v PXAT "+Etime+" EXAT "+Etime), "Value mismatch for cmd SET k v PXAT "+Etime+" EXAT "+Etime)
assert.Equal(t, "(nil)", exec.FireCommand(conn, "GET k"), "Value mismatch for cmd GET k")

DeleteKey(t, conn, exec, "k")

resp, err := exec.FireCommandAndReadResponse(conn, "SET k v PXAT "+Etime+" EXAT "+Etime)
assert.Nil(t, err)
assert.Equal(t, "ERR syntax error", resp, "Value mismatch for cmd SET k v PXAT "+Etime+" EXAT "+Etime)

resp, err = exec.FireCommandAndReadResponse(conn, "GET k")
assert.Nil(t, err)
assert.Equal(t, "(nil)", resp, "Value mismatch for cmd GET k")
})
}

Expand All @@ -185,14 +234,17 @@ func TestWithKeepTTLFlag(t *testing.T) {
for i := 0; i < len(tcase.commands); i++ {
cmd := tcase.commands[i]
out := tcase.expected[i]
assert.Equal(t, out, exec.FireCommand(conn, cmd), "Value mismatch for cmd %s\n.", cmd)

resp, err := exec.FireCommandAndReadResponse(conn, cmd)
assert.Nil(t, err)
assert.Equal(t, out, resp, "Value mismatch for cmd %s\n.", cmd)
}
}

time.Sleep(2 * time.Second)

cmd := "GET k"
out := "(nil)"

assert.Equal(t, out, exec.FireCommand(conn, cmd), "Value mismatch for cmd %s\n.", cmd)
resp, err := exec.FireCommandAndReadResponse(conn, cmd)
assert.Nil(t, err)
assert.Equal(t, out, resp, "Value mismatch for cmd %s\n.", cmd)
}
Loading

0 comments on commit 43392c1

Please sign in to comment.