Skip to content

Commit 024884c

Browse files
authored
Merge pull request #171 from codecrafters-io/add-logging
Add HexDump logging for RDB files
2 parents d016ede + f3eef20 commit 024884c

File tree

12 files changed

+615
-287
lines changed

12 files changed

+615
-287
lines changed

Diff for: internal/rdb_file_creator.go

+18
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os"
66
"path/filepath"
77

8+
"github.com/codecrafters-io/tester-utils/logger"
89
testerutils_random "github.com/codecrafters-io/tester-utils/random"
910
"github.com/codecrafters-io/tester-utils/test_case_harness"
1011

@@ -100,3 +101,20 @@ func (r *RDBFileCreator) Write(keyValuePairs []KeyValuePair) error {
100101

101102
return nil
102103
}
104+
105+
func (r *RDBFileCreator) Contents() ([]byte, error) {
106+
contents, err := os.ReadFile(filepath.Join(r.Dir, r.Filename))
107+
if err != nil {
108+
return nil, err
109+
}
110+
return contents, nil
111+
}
112+
113+
func (r *RDBFileCreator) PrintContentHexdump(logger *logger.Logger) error {
114+
contents, err := r.Contents()
115+
if err != nil {
116+
return err
117+
}
118+
logger.Debugf("Hexdump of RDB file contents: \n%v\n", GetFormattedHexdump(contents))
119+
return nil
120+
}

Diff for: internal/stages_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ func normalizeTesterOutput(testerOutput []byte) []byte {
115115
"rdb_bytes": {regexp.MustCompile(`"\$[0-9]+\\r\\nREDIS.*"`)},
116116
"info_replication_bytes": {regexp.MustCompile(`"\$[0-9]+\\r\\n# Replication\\r\\n[^"]+"`)},
117117
"rdb_keys": {regexp.MustCompile(`\[stage-11\] .*Received .*`)},
118+
"hexdump": {regexp.MustCompile(`[0-9a-fA-F]{4} \| [0-9a-fA-F ]{47} \| .{0,16}`)},
118119
}
119120

120121
for replacement, regexes := range replacements {

Diff for: internal/test_helpers/fixtures/rdb-read-value-with-expiry/pass

+75-19
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,21 @@
11
Debug = true
22

33
[stage-13] Running tests for Stage #13: sm4
4-
[stage-13] $ ./spawn_redis_server.sh --dir /private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles2910760570 --dbfilename pear.rdb
4+
[stage-13] Created RDB file with 3 key-value pairs: {"orange": "strawberry", "mango": "apple", "pineapple": "blueberry"}
5+
[stage-13] Hexdump of RDB file contents: 
6+
[stage-13] Idx | Hex | ASCII
7+
[stage-13] -----+-------------------------------------------------+-----------------
8+
[stage-13] 0000 | 52 45 44 49 53 30 30 31 31 fa 09 72 65 64 69 73 | REDIS0011..redis
9+
[stage-13] 0010 | 2d 76 65 72 05 37 2e 32 2e 30 fa 0a 72 65 64 69 | -ver.7.2.0..redi
10+
[stage-13] 0020 | 73 2d 62 69 74 73 c0 40 fe 00 fb 03 03 fc 00 0c | s-bits.@........
11+
[stage-13] 0030 | 28 8a c7 01 00 00 00 06 6f 72 61 6e 67 65 0a 73 | (.......orange.s
12+
[stage-13] 0040 | 74 72 61 77 62 65 72 72 79 fc 00 9c ef 12 7e 01 | trawberry.....~.
13+
[stage-13] 0050 | 00 00 00 05 6d 61 6e 67 6f 05 61 70 70 6c 65 fc | ....mango.apple.
14+
[stage-13] 0060 | 00 0c 28 8a c7 01 00 00 00 09 70 69 6e 65 61 70 | ..(.......pineap
15+
[stage-13] 0070 | 70 6c 65 09 62 6c 75 65 62 65 72 72 79 ff 34 d0 | ple.blueberry.4.
16+
[stage-13] 0080 | 8c 58 51 4a 5d 62 0a | .XQJ]b.
17+
[stage-13] 
18+
[stage-13] $ ./spawn_redis_server.sh --dir /private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles444689312 --dbfilename pear.rdb
519
[stage-13] client: $ redis-cli GET orange
620
[stage-13] client: Sent bytes: "*2\r\n$3\r\nGET\r\n$6\r\norange\r\n"
721
[stage-13] client: Received bytes: "$10\r\nstrawberry\r\n"
@@ -22,8 +36,21 @@ Debug = true
2236
[stage-13] Program terminated successfully
2337

2438
[stage-12] Running tests for Stage #12: dq3
25-
[stage-12] Created RDB file with key-value pairs: "grape"="pineapple", "apple"="raspberry", "banana"="apple", "mango"="orange", "orange"="pear"
26-
[stage-12] $ ./spawn_redis_server.sh --dir /private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles2724103995 --dbfilename raspberry.rdb
39+
[stage-12] Created RDB file with 5 key-value pairs: {"grape": "pineapple", "apple": "raspberry", "banana": "apple", "mango": "orange", "orange": "pear"}
40+
[stage-12] Hexdump of RDB file contents: 
41+
[stage-12] Idx | Hex | ASCII
42+
[stage-12] -----+-------------------------------------------------+-----------------
43+
[stage-12] 0000 | 52 45 44 49 53 30 30 31 31 fa 09 72 65 64 69 73 | REDIS0011..redis
44+
[stage-12] 0010 | 2d 76 65 72 05 37 2e 32 2e 30 fa 0a 72 65 64 69 | -ver.7.2.0..redi
45+
[stage-12] 0020 | 73 2d 62 69 74 73 c0 40 fe 00 fb 05 00 00 05 67 | [email protected]
46+
[stage-12] 0030 | 72 61 70 65 09 70 69 6e 65 61 70 70 6c 65 00 05 | rape.pineapple..
47+
[stage-12] 0040 | 61 70 70 6c 65 09 72 61 73 70 62 65 72 72 79 00 | apple.raspberry.
48+
[stage-12] 0050 | 06 62 61 6e 61 6e 61 05 61 70 70 6c 65 00 05 6d | .banana.apple..m
49+
[stage-12] 0060 | 61 6e 67 6f 06 6f 72 61 6e 67 65 00 06 6f 72 61 | ango.orange..ora
50+
[stage-12] 0070 | 6e 67 65 04 70 65 61 72 ff 33 20 d4 0d 23 b2 9b | nge.pear.3 ..#..
51+
[stage-12] 0080 | af 0a | ..
52+
[stage-12] 
53+
[stage-12] $ ./spawn_redis_server.sh --dir /private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles3255364286 --dbfilename raspberry.rdb
2754
[stage-12] client: $ redis-cli GET grape
2855
[stage-12] client: Sent bytes: "*2\r\n$3\r\nGET\r\n$5\r\ngrape\r\n"
2956
[stage-12] client: Received bytes: "$9\r\npineapple\r\n"
@@ -54,20 +81,40 @@ Debug = true
5481
[stage-12] Program terminated successfully
5582

5683
[stage-11] Running tests for Stage #11: jw4
57-
[stage-11] Created RDB file with 3 keys: ["banana" "apple" "blueberry"]
58-
[stage-11] $ ./spawn_redis_server.sh --dir /private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles2441645913 --dbfilename blueberry.rdb
84+
[stage-11] Created RDB file with 3 keys: ["banana", "apple", "blueberry"]
85+
[stage-11] Hexdump of RDB file contents: 
86+
[stage-11] Idx | Hex | ASCII
87+
[stage-11] -----+-------------------------------------------------+-----------------
88+
[stage-11] 0000 | 52 45 44 49 53 30 30 31 31 fa 09 72 65 64 69 73 | REDIS0011..redis
89+
[stage-11] 0010 | 2d 76 65 72 05 37 2e 32 2e 30 fa 0a 72 65 64 69 | -ver.7.2.0..redi
90+
[stage-11] 0020 | 73 2d 62 69 74 73 c0 40 fe 00 fb 03 00 00 06 62 | [email protected]
91+
[stage-11] 0030 | 61 6e 61 6e 61 09 70 69 6e 65 61 70 70 6c 65 00 | anana.pineapple.
92+
[stage-11] 0040 | 05 61 70 70 6c 65 09 72 61 73 70 62 65 72 72 79 | .apple.raspberry
93+
[stage-11] 0050 | 00 09 62 6c 75 65 62 65 72 72 79 04 70 65 61 72 | ..blueberry.pear
94+
[stage-11] 0060 | ff 5c f3 42 ee 46 08 a6 3f 0a | .\.B.F..?.
95+
[stage-11] 
96+
[stage-11] $ ./spawn_redis_server.sh --dir /private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles2441884045 --dbfilename blueberry.rdb
5997
[stage-11] client: $ redis-cli KEYS *
6098
[stage-11] client: Sent bytes: "*2\r\n$4\r\nKEYS\r\n$1\r\n*\r\n"
61-
[stage-11] client: Received bytes: "*3\r\n$6\r\nbanana\r\n$9\r\nblueberry\r\n$5\r\napple\r\n"
62-
[stage-11] client: Received RESP array: ["banana", "blueberry", "apple"]
63-
[stage-11] Received ["banana", "blueberry", "apple"]
99+
[stage-11] client: Received bytes: "*3\r\n$6\r\nbanana\r\n$5\r\napple\r\n$9\r\nblueberry\r\n"
100+
[stage-11] client: Received RESP array: ["banana", "apple", "blueberry"]
101+
[stage-11] Received ["banana", "apple", "blueberry"]
64102
[stage-11] Test passed.
65103
[stage-11] Terminating program
66104
[stage-11] Program terminated successfully
67105

68106
[stage-10] Running tests for Stage #10: gc6
69-
[stage-10] Created RDB file with single key-value pair: grape="pineapple"
70-
[stage-10] $ ./spawn_redis_server.sh --dir /private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles3729886679 --dbfilename orange.rdb
107+
[stage-10] Created RDB file with a single key-value pair: {"grape": "pineapple"}
108+
[stage-10] Hexdump of RDB file contents: 
109+
[stage-10] Idx | Hex | ASCII
110+
[stage-10] -----+-------------------------------------------------+-----------------
111+
[stage-10] 0000 | 52 45 44 49 53 30 30 31 31 fa 09 72 65 64 69 73 | REDIS0011..redis
112+
[stage-10] 0010 | 2d 76 65 72 05 37 2e 32 2e 30 fa 0a 72 65 64 69 | -ver.7.2.0..redi
113+
[stage-10] 0020 | 73 2d 62 69 74 73 c0 40 fe 00 fb 01 00 00 05 67 | [email protected]
114+
[stage-10] 0030 | 72 61 70 65 09 70 69 6e 65 61 70 70 6c 65 ff 12 | rape.pineapple..
115+
[stage-10] 0040 | 7d 54 51 cd 7a 5c 8d 0a | }TQ.z\..
116+
[stage-10] 
117+
[stage-10] $ ./spawn_redis_server.sh --dir /private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles3226033919 --dbfilename orange.rdb
71118
[stage-10] client: $ redis-cli GET grape
72119
[stage-10] client: Sent bytes: "*2\r\n$3\r\nGET\r\n$5\r\ngrape\r\n"
73120
[stage-10] client: Received bytes: "$9\r\npineapple\r\n"
@@ -78,8 +125,17 @@ Debug = true
78125
[stage-10] Program terminated successfully
79126

80127
[stage-9] Running tests for Stage #9: jz6
81-
[stage-9] Created RDB file with single key: "mango"
82-
[stage-9] $ ./spawn_redis_server.sh --dir /private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles3049301350 --dbfilename pear.rdb
128+
[stage-9] Created RDB file with a single key: ["mango"]
129+
[stage-9] Hexdump of RDB file contents: 
130+
[stage-9] Idx | Hex | ASCII
131+
[stage-9] -----+-------------------------------------------------+-----------------
132+
[stage-9] 0000 | 52 45 44 49 53 30 30 31 31 fa 09 72 65 64 69 73 | REDIS0011..redis
133+
[stage-9] 0010 | 2d 76 65 72 05 37 2e 32 2e 30 fa 0a 72 65 64 69 | -ver.7.2.0..redi
134+
[stage-9] 0020 | 73 2d 62 69 74 73 c0 40 fe 00 fb 01 00 00 05 6d | [email protected]
135+
[stage-9] 0030 | 61 6e 67 6f 09 70 69 6e 65 61 70 70 6c 65 ff 0c | ango.pineapple..
136+
[stage-9] 0040 | 1b cb 91 b2 ed f6 19 0a | ........
137+
[stage-9] 
138+
[stage-9] $ ./spawn_redis_server.sh --dir /private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles1527538990 --dbfilename pear.rdb
83139
[stage-9] client: $ redis-cli KEYS *
84140
[stage-9] client: Sent bytes: "*2\r\n$4\r\nKEYS\r\n$1\r\n*\r\n"
85141
[stage-9] client: Received bytes: "*1\r\n$5\r\nmango\r\n"
@@ -90,12 +146,12 @@ Debug = true
90146
[stage-9] Program terminated successfully
91147

92148
[stage-8] Running tests for Stage #8: zg5
93-
[stage-8] $ ./spawn_redis_server.sh --dir /private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles778895138 --dbfilename blueberry.rdb
149+
[stage-8] $ ./spawn_redis_server.sh --dir /private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles2714192117 --dbfilename blueberry.rdb
94150
[stage-8] client: $ redis-cli CONFIG GET dir
95151
[stage-8] client: Sent bytes: "*3\r\n$6\r\nCONFIG\r\n$3\r\nGET\r\n$3\r\ndir\r\n"
96-
[stage-8] client: Received bytes: "*2\r\n$3\r\ndir\r\n$74\r\n/private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles778895138\r\n"
97-
[stage-8] client: Received RESP array: ["dir", "/private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles778895138"]
98-
[stage-8] Received ["dir", "/private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles778895138"]
152+
[stage-8] client: Received bytes: "*2\r\n$3\r\ndir\r\n$75\r\n/private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles2714192117\r\n"
153+
[stage-8] client: Received RESP array: ["dir", "/private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles2714192117"]
154+
[stage-8] Received ["dir", "/private/var/folders/5l/z5y3dkwn68sgb6htzc5w7vnm0000gn/T/rdbfiles2714192117"]
99155
[stage-8] Test passed.
100156
[stage-8] Terminating program
101157
[stage-8] Program terminated successfully
@@ -107,15 +163,15 @@ Debug = true
107163
[stage-7] Received bytes: "+OK\r\n"
108164
[stage-7] Received RESP simple string: "OK"
109165
[stage-7] Received "OK"
110-
[stage-7] Received OK at 16:13:08.183
111-
[stage-7] Fetching key "strawberry" at 16:13:08.183 (should not be expired)
166+
[stage-7] Received OK at 16:31:40.207
167+
[stage-7] Fetching key "strawberry" at 16:31:40.207 (should not be expired)
112168
[stage-7] > GET strawberry
113169
[stage-7] Sent bytes: "*2\r\n$3\r\nGET\r\n$10\r\nstrawberry\r\n"
114170
[stage-7] Received bytes: "$4\r\npear\r\n"
115171
[stage-7] Received RESP bulk string: "pear"
116172
[stage-7] Received "pear"
117173
[stage-7] Sleeping for 101ms
118-
[stage-7] Fetching key "strawberry" at 16:13:08.286 (should be expired)
174+
[stage-7] Fetching key "strawberry" at 16:31:40.311 (should be expired)
119175
[stage-7] > GET strawberry
120176
[stage-7] Sent bytes: "*2\r\n$3\r\nGET\r\n$10\r\nstrawberry\r\n"
121177
[stage-7] Received bytes: "$-1\r\n"

0 commit comments

Comments
 (0)