Test suite results
FrogDB maintains a port of the Redis 8.6.0 regression test suite. The target version is single-sourced from the generated summary below, not hardcoded on this page. Every ported test runs on every commit, and every intentional exclusion is documented in the test source and surfaced here — so this page cannot drift from the code.
The ported tests are Rust #[tokio::test] functions that mirror the upstream Redis TCL tests one file at a time. They are Rust-native ports, not a live TCL runner: the upstream TCL harness was removed and no .tcl files execute against FrogDB. For the per-command support view these tests back up, see the Command matrix; for the full testing strategy, see Testing methodology.
Summary
Section titled “Summary”Ported tests are the #[tokio::test] functions across the regression suites. Intentional exclusions are upstream tests deliberately not ported, each with a documented reason. Broken tests (#[ignore]) mark known regressions that still need fixing.
Exclusion Categories
Section titled “Exclusion Categories”Each excluded test is tagged with a category explaining why it was not ported.
| Category | Description | Count |
|---|---|---|
| Redis-Specific Internals | Tests that exercise Redis-internal implementation details (allocator, object encoding, event loop) that don't apply to FrogDB's architecture. | 218 |
| Encoding Differences | Tests that assert specific internal encoding types (ziplist, listpack, intset) which FrogDB does not use. | 101 |
| Observability Differences | Tests for Redis-specific INFO fields, stats, or monitoring behavior that FrogDB reports differently or doesn't expose. | 67 |
| Configuration Differences | Tests relying on Redis-specific configuration mechanisms (redis.conf, ACL files, CONFIG REWRITE) that FrogDB replaces with TOML config. | 40 |
| Tested Elsewhere | Functionality covered by other FrogDB tests (fuzz tests, integration tests, or different regression suites). | 37 |
| Replication Differences | Tests for Redis replication internals (SLAVEOF, replica propagation) that differ in FrogDB's Raft-based replication. | 23 |
| Persistence Differences | Tests for RDB/AOF persistence mechanisms that FrogDB replaces with RocksDB-backed storage. | 12 |
| Cluster Differences | Tests for Redis Cluster gossip-protocol internals that differ in FrogDB's Raft-based clustering. | 11 |
| Single Database | Tests requiring SELECT/multi-DB support, which FrogDB intentionally limits to a single database. | 10 |
| DEBUG Command | Tests requiring the Redis DEBUG command, which is not exposed in FrogDB. | 9 |
| Protocol Differences | Tests for RESP3/HELLO protocol negotiation or protocol-level behaviors that FrogDB handles differently. | 9 |
| Requires Replication | Tests that need a primary+replica pair to assert propagation or replica-visible state, which the regression harness runs single-node. | 8 |
| Scripting Differences | Tests for Redis Lua 5.1 scripting quirks or redis.* API details that differ in FrogDB's Lua 5.4 environment. | 7 |
| CLI Differences | Tests requiring the redis-cli binary or CLI-specific features. | 5 |
| Scripting + Pub/Sub Interaction | Tests that publish from inside a Lua script, which FrogDB's sharded scripting execution context does not support. | 1 |
Command Impact
Section titled “Command Impact”Commands touched by at least one excluded test, with the suites that exercise them and the number of intentional exclusions in those suites.
Exclusions are documented per suite in each port file’s ## Intentional exclusions doc-comment, not tagged to an individual command within a multi-command suite. This table therefore reports which suites exercise a command and how many exclusions those suites carry — it does not claim a per-command “N of M tests excluded” ratio, which the source metadata cannot support.
| Command | Test Suites | Excluded Tests |
|---|---|---|
ACL | acl_regression.rs, acl_tcl.rs, acl_v2_regression.rs, violations_tcl.rs | 14 |
BITCOUNT | bitops_regression.rs, bitops_tcl.rs | 8 |
BITOP | bitops_regression.rs, bitops_tcl.rs | 8 |
BITPOS | bitops_regression.rs, bitops_tcl.rs | 8 |
CLIENT | client_eviction_tcl.rs, introspection2_tcl.rs, introspection_tcl.rs, networking_regression.rs, networking_tcl.rs, querybuf_tcl.rs, replybufsize_tcl.rs | 35 |
CONFIG | introspection2_tcl.rs, introspection_tcl.rs | 18 |
DBSIZE | keyspace_tcl.rs | 4 |
DEBUG | introspection_tcl.rs | 18 |
DECR | incr_regression.rs, incr_tcl.rs | 3 |
DECRBY | incr_regression.rs, incr_tcl.rs | 3 |
DISCARD | multi_regression.rs, multi_tcl.rs | 14 |
DUMP | dump_regression.rs, dump_tcl.rs | 15 |
ECHO | protocol_tcl.rs | 6 |
EVAL | cluster_scripting_regression.rs, cluster_scripting_tcl.rs, scripting_tcl.rs | 24 |
EVALSHA | cluster_scripting_regression.rs, cluster_scripting_tcl.rs, scripting_tcl.rs | 24 |
EXEC | multi_regression.rs, multi_tcl.rs | 14 |
EXPIRE | expire_regression.rs, expire_tcl.rs, keyspace_regression.rs | 6 |
FLUSHDB | lazyfree_tcl.rs | 1 |
FUNCTION | functions_regression.rs, functions_tcl.rs | 3 |
GEOADD | geo_regression.rs, geo_tcl.rs | 2 |
GEODIST | geo_tcl.rs | 2 |
GEOSEARCH | geo_regression.rs, geo_tcl.rs | 2 |
GET | limits_regression.rs, string_regression.rs, string_tcl.rs | 16 |
HDEL | hash_regression.rs, hash_tcl.rs | 23 |
HGET | hash_regression.rs, hash_tcl.rs | 23 |
HGETALL | hash_regression.rs, hash_tcl.rs | 23 |
HOTKEYS | hotkeys_tcl.rs | 6 |
HSCAN | scan_regression.rs, scan_tcl.rs | 3 |
HSET | hash_regression.rs, hash_tcl.rs | 23 |
INCR | incr_regression.rs, incr_tcl.rs | 3 |
INCRBY | incr_regression.rs, incr_tcl.rs | 3 |
INFO | info_command_regression.rs, info_keysizes_tcl.rs, info_regression.rs, info_tcl.rs | 49 |
KEYS | keyspace_regression.rs, keyspace_tcl.rs | 4 |
LATENCY | latency_monitor_tcl.rs | 15 |
LLEN | list2_regression.rs, list_tcl.rs | 36 |
LPOP | list_regression.rs, list_tcl.rs | 36 |
LPUSH | list3_regression.rs, list_tcl.rs | 36 |
LRANGE | list3_regression.rs, list_tcl.rs | 36 |
MAXMEMORY | maxmemory_regression.rs, maxmemory_tcl.rs | 10 |
MEMORY | memefficiency_tcl.rs | 12 |
MGET | limits_regression.rs, string_tcl.rs | 16 |
MSET | limits_regression.rs, string_tcl.rs | 16 |
MULTI | multi_regression.rs, multi_tcl.rs | 14 |
OBJECT | other_tcl.rs | 33 |
PERSIST | expire_tcl.rs | 6 |
PEXPIRE | expire_tcl.rs | 6 |
PFADD | hyperloglog_regression.rs, hyperloglog_tcl.rs | 16 |
PFCOUNT | hyperloglog_regression.rs, hyperloglog_tcl.rs | 16 |
PFMERGE | hyperloglog_regression.rs, hyperloglog_tcl.rs | 16 |
PING | protocol_regression.rs, protocol_tcl.rs | 6 |
PUBLISH | pubsub_regression.rs, pubsub_tcl.rs | 26 |
RESTORE | dump_regression.rs, dump_tcl.rs | 15 |
RPOP | list_regression.rs, list_tcl.rs | 36 |
RPUSH | list3_regression.rs, list_tcl.rs | 36 |
SADD | set_regression.rs, set_tcl.rs | 13 |
SCAN | scan_regression.rs, scan_tcl.rs | 3 |
SCARD | set_regression.rs, set_tcl.rs | 13 |
SCRIPT | scripting_tcl.rs | 24 |
SELECT | keyspace_tcl.rs | 4 |
SET | limits_regression.rs, string_regression.rs, string_tcl.rs | 16 |
SETEX | string_tcl.rs | 16 |
SETNX | string_tcl.rs | 16 |
SLOWLOG | slowlog_tcl.rs | 5 |
SMEMBERS | set_regression.rs, set_tcl.rs | 13 |
SORT | sort_regression.rs, sort_tcl.rs | 3 |
SREM | set_regression.rs, set_tcl.rs | 13 |
SSCAN | scan_regression.rs, scan_tcl.rs | 3 |
SUBSCRIBE | pubsub_regression.rs, pubsub_tcl.rs | 26 |
TTL | expire_regression.rs, expire_tcl.rs, keyspace_regression.rs | 6 |
TYPE | other_tcl.rs | 33 |
UNLINK | lazyfree_tcl.rs | 1 |
WATCH | multi_regression.rs, multi_tcl.rs | 14 |
XACK | stream_cgroups_regression.rs, stream_cgroups_tcl.rs | 37 |
XADD | event_sourcing_regression.rs, stream_regression.rs, stream_tcl.rs | 81 |
XCLAIM | stream_cgroups_regression.rs, stream_cgroups_tcl.rs | 37 |
XGROUP | stream_cgroups_regression.rs, stream_cgroups_tcl.rs | 37 |
XLEN | stream_regression.rs, stream_tcl.rs | 81 |
XRANGE | stream_regression.rs, stream_tcl.rs | 81 |
XREAD | event_sourcing_regression.rs, stream_tcl.rs | 81 |
XREADGROUP | stream_cgroups_regression.rs, stream_cgroups_tcl.rs | 37 |
XTRIM | stream_tcl.rs | 81 |
ZADD | zset_regression.rs, zset_tcl.rs | 39 |
ZRANGE | zset_regression.rs, zset_tcl.rs | 39 |
ZRANK | zset_tcl.rs | 39 |
ZREM | zset_tcl.rs | 39 |
ZSCAN | scan_regression.rs, scan_tcl.rs | 3 |
ZSCORE | zset_tcl.rs | 39 |
Suite Details
Section titled “Suite Details”Expand a suite to see the full list of excluded tests with reasons.
acl_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
ACL LOAD only disconnects affected clients | Configuration Differences | Redis-internal feature (ACL file) |
ACL LOAD disconnects affected subscriber | Configuration Differences | Redis-internal feature (ACL file) |
ACL load and save | Configuration Differences | Redis-internal feature (ACL file) |
ACL load on replica when connected to replica | Configuration Differences | Redis-internal feature (ACL file) |
Test loading duplicate users in config on startup | Configuration Differences | Redis-internal feature (ACL file) |
First server should have role slave after SLAVEOF | Replication Differences | needs:repl |
Alice: can execute all command | Redis-Specific Internals | Redis-internal session-state ordering |
Test behavior of loading ACLs | Configuration Differences | ACL v2 selectors removed (8121bfee) |
bitops_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
BITOP $op fuzzing | Tested Elsewhere | fuzzing/stress |
BITOP NOT fuzzing | Tested Elsewhere | fuzzing/stress |
BITPOS bit=1 fuzzy testing using SETBIT | Tested Elsewhere | fuzzing/stress |
BITPOS bit=0 fuzzy testing using SETBIT | Tested Elsewhere | fuzzing/stress |
BITPOS/BITCOUNT fuzzy testing using SETBIT | Tested Elsewhere | fuzzing/stress |
SETBIT/BITFIELD only increase dirty when the value changed | Redis-Specific Internals | Redis-internal stat (dirty counter) |
BIT pos larger than UINT_MAX | Tested Elsewhere | large-memory |
SETBIT values larger than UINT32_MAX and lzf_compress/lzf_decompress correctly | Tested Elsewhere | large-memory + needs:debug |
dump_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
MIGRATE is caching connections | Redis-Specific Internals | Redis-internal feature |
MIGRATE cached connections are released after some time | Redis-Specific Internals | Redis-internal feature |
MIGRATE is able to migrate a key between two instances | Redis-Specific Internals | Redis-internal feature |
MIGRATE is able to copy a key between two instances | Redis-Specific Internals | Redis-internal feature |
MIGRATE will not overwrite existing keys, unless REPLACE is used | Redis-Specific Internals | Redis-internal feature |
MIGRATE propagates TTL correctly | Redis-Specific Internals | Redis-internal feature |
MIGRATE can correctly transfer large values | Redis-Specific Internals | Redis-internal feature |
MIGRATE can correctly transfer hashes | Redis-Specific Internals | Redis-internal feature |
MIGRATE timeout actually works | Redis-Specific Internals | Redis-internal feature |
MIGRATE can migrate multiple keys at once | Redis-Specific Internals | Redis-internal feature |
MIGRATE with multiple keys must have empty key arg | Redis-Specific Internals | Redis-internal feature |
MIGRATE with multiple keys migrate just existing ones | Redis-Specific Internals | Redis-internal feature |
MIGRATE with multiple keys: stress command rewriting | Redis-Specific Internals | Redis-internal feature |
MIGRATE with multiple keys: delete just ack keys | Redis-Specific Internals | Redis-internal feature |
MIGRATE AUTH: correct and wrong password cases | Redis-Specific Internals | Redis-internal feature |
expire_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
All TTL in commands are propagated as absolute timestamp in replication stream | Replication Differences | replication-internal |
GETEX propagate as to replica as PERSIST, DEL, or nothing | Replication Differences | replication-internal |
Redis should not propagate the read command on lazy expire | Replication Differences | replication-internal |
SCAN: Lazy-expire should not be wrapped in MULTI/EXEC | Replication Differences | replication-internal |
RANDOMKEY: Lazy-expire should not be wrapped in MULTI/EXEC | Replication Differences | replication-internal |
expire scan should skip dictionaries with lot's of empty buckets | Redis-Specific Internals | Redis-internal expire scan |
functions_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
FUNCTION - test debug reload different options | DEBUG Command | needs:debug |
FUNCTION - test debug reload with nosave and noflush | DEBUG Command | needs:debug |
FUNCTION - allow stale | Replication Differences | needs:repl |
geo_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
GEOSEARCH fuzzy test - $type | Tested Elsewhere | fuzzing/stress |
GEOSEARCH box edges fuzzy test | Tested Elsewhere | fuzzing/stress |
hash_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
Is the small hash encoded with a listpack? | Encoding Differences | internal-encoding |
Is the big hash encoded with an hash table? | Encoding Differences | internal-encoding |
Is a ziplist encoded Hash promoted on big payload? | Encoding Differences | internal-encoding |
HGET against the small hash | Encoding Differences | internal-encoding |
HGET against the big hash | Encoding Differences | internal-encoding |
HMSET - small hash | Encoding Differences | internal-encoding |
HMSET - big hash | Encoding Differences | internal-encoding |
HMGET - small hash | Encoding Differences | internal-encoding |
HMGET - big hash | Encoding Differences | internal-encoding |
HKEYS - small hash | Encoding Differences | internal-encoding |
HKEYS - big hash | Encoding Differences | internal-encoding |
HVALS - small hash | Encoding Differences | internal-encoding |
HVALS - big hash | Encoding Differences | internal-encoding |
HGETALL - small hash | Encoding Differences | internal-encoding |
HGETALL - big hash | Encoding Differences | internal-encoding |
HSTRLEN against the small hash | Encoding Differences | internal-encoding |
HSTRLEN against the big hash | Encoding Differences | internal-encoding |
HRANDFIELD - $type | Encoding Differences | internal-encoding |
Stress test the hash ziplist -> hashtable encoding conversion | Encoding Differences | internal-encoding |
Hash ziplist of various encodings | Encoding Differences | internal-encoding |
Hash ziplist of various encodings - sanitize dump | Encoding Differences | internal-encoding |
HRANDFIELD with RESP3 | Protocol Differences | RESP3-only |
KEYS command return expired keys when allow_access_expired is 1 | Configuration Differences | Redis-internal config flag |
hotkeys_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
HOTKEYS START - with SLOTS parameter in cluster mode | Observability Differences | requires multi-node cluster |
HOTKEYS GET - selected-slots returns node's slot ranges when no SLOTS specified in cluster mode | Observability Differences | requires multi-node cluster |
HOTKEYS START - Error: slot not handled by this node | Observability Differences | requires multi-node cluster |
HOTKEYS GET - selected-slots returns each node's slot ranges in multi-node cluster | Observability Differences | requires multi-node cluster |
HOTKEYS - tracks only keys in selected slots | Observability Differences | requires cluster mode SLOTS parameter |
HOTKEYS - multiple selected slots | Observability Differences | requires cluster mode SLOTS parameter |
hyperloglog_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
HyperLogLog self test passes | Redis-Specific Internals | Redis-internal HLL self-test |
HyperLogLogs are promote from sparse to dense | Encoding Differences | internal-encoding (HLL) |
Change hll-sparse-max-bytes | Encoding Differences | internal-encoding (HLL) |
Hyperloglog promote to dense well in different hll-sparse-max-bytes | Encoding Differences | internal-encoding (HLL) |
HyperLogLog sparse encoding stress test | Tested Elsewhere | internal-encoding (HLL) + stress |
PFMERGE results with simd | Redis-Specific Internals | Redis-internal SIMD path |
PFDEBUG GETREG returns the HyperLogLog raw registers | DEBUG Command | needs:debug (PFDEBUG) |
PFADD / PFCOUNT cache invalidation works | Encoding Differences | internal-encoding (HLL) |
Corrupted sparse HyperLogLogs are detected: Additional at tail | Encoding Differences | internal-encoding (HLL) |
Corrupted sparse HyperLogLogs are detected: Broken magic | Encoding Differences | internal-encoding (HLL) |
Corrupted sparse HyperLogLogs are detected: Invalid encoding | Encoding Differences | internal-encoding (HLL) |
Corrupted dense HyperLogLogs are detected: Wrong length | Encoding Differences | internal-encoding (HLL) |
Corrupted sparse HyperLogLogs doesn't cause overflow and out-of-bounds with XZERO opcode | Encoding Differences | internal-encoding (HLL) |
Corrupted sparse HyperLogLogs doesn't cause overflow and out-of-bounds with ZERO opcode | Encoding Differences | internal-encoding (HLL) |
Fuzzing dense/sparse encoding: Redis should always detect errors | Tested Elsewhere | internal-encoding (HLL) + fuzzing |
PFADD with 2GB entry should not crash server due to overflow in MurmurHash64A | Tested Elsewhere | large-memory |
incr_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
INCR does not use shared objects | Redis-Specific Internals | Redis-internal object model |
INCR can modify objects in-place | Redis-Specific Internals | Redis-internal object model |
$cmd operation should update encoding from raw to int | Encoding Differences | internal-encoding |
info_keysizes_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
KEYSIZES - Test i'th bin counts keysizes between (2^i) and (2^(i+1)-1) as expected $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEYSIZES - Histogram values of Bytes, Kilo and Mega $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEYSIZES - Test hyperloglog $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEYSIZES - Test List $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEYSIZES - Test SET $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEYSIZES - Test ZSET $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEYSIZES - Test STRING $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEYSIZES - Test complex dataset $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEYSIZES - Test HASH ($type) $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEYSIZES - Test Hash field lazy expiration ($type) $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEYSIZES - Test STRING BITS $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEYSIZES - Test RESTORE $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEYSIZES - Test RENAME $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEYSIZES - Test MOVE $suffixRepl | Observability Differences | MOVE (singledb) not implemented in FrogDB |
KEYSIZES - Test SWAPDB $suffixRepl | Observability Differences | SWAPDB (singledb) not implemented in FrogDB |
KEYSIZES - DEBUG RELOAD reset keysizes $suffixRepl | Persistence Differences | DEBUG RELOAD not implemented in FrogDB |
KEYSIZES - Test RDB $suffixRepl | Observability Differences | needs:repl — replication keysizes not yet implemented |
KEY-MEMORY-STATS - Replication updates key memory stats on replica | Observability Differences | needs:repl — replication + key-memory-histograms not implemented in FrogDB |
KEY-MEMORY-STATS - DEL on primary updates key memory stats on replica | Observability Differences | needs:repl — replication + key-memory-histograms not implemented in FrogDB |
KEY-MEMORY-STATS - DEBUG RELOAD preserves key memory histogram | Observability Differences | DEBUG RELOAD not implemented in FrogDB |
KEY-MEMORY-STATS - RDB save and restart preserves key memory histogram | Observability Differences | RDB save/restart not yet implemented |
info_regression.rs
| Excluded Test | Category | Reason |
|---|---|---|
Verify that LUT overhead is properly updated when dicts are emptied or reused (issue #13973) | Redis-Specific Internals | Redis-internal dict/LUT overhead accounting |
info_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
stats: eventloop metrics | Redis-Specific Internals | Redis single-threaded event loop cycle tracking |
stats: instantaneous metrics | Redis-Specific Internals | Redis event loop instantaneous sampling |
stats: debug metrics | Redis-Specific Internals | Redis DEBUG info section (AOF/cron duration sums) |
stats: client input and output buffer limit disconnections | Redis-Specific Internals | Redis buffer limit stats; also needs DEBUG |
memory: database and pubsub overhead and rehashing dict count | Redis-Specific Internals | Redis dict/rehashing internals (MEMORY STATS) |
memory: used_memory_peak_time is updated when used_memory_peak is updated | Redis-Specific Internals | Redis-specific peak timestamp tracking |
Verify that LUT overhead is properly updated when dicts are emptied or reused | Cluster Differences | cluster-specific Redis dict internals |
errorstats: limit errors will not increase indefinitely | Observability Differences | Redis-internal 128-error-type cap behavior |
errorstats: blocking commands | Observability Differences | CLIENT UNBLOCK error type tracking (UNBLOCKED error prefix) |
latencystats: disable/enable | Observability Differences | CONFIG SET latency-tracking yes/no, p50/p99/p99.9 output |
latencystats: configure percentiles | Observability Differences | CONFIG SET latency-tracking-info-percentiles |
latencystats: bad configure percentiles | Observability Differences | config validation (non-numeric, >100) |
latencystats: blocking commands | Observability Differences | latency tracking for BLPOP and similar |
latencystats: subcommands | Observability Differences | per-subcommand latency (CLIENT|ID, CONFIG|SET) |
latencystats: measure latency | Observability Differences | verify latency magnitude (also needs:debug) |
errorstats: failed call authentication error | Observability Differences | AUTH failure → errorstat ERR count=1 |
errorstats: failed call within MULTI/EXEC | Observability Differences | error tracking across transactions |
errorstats: failed call within LUA | Observability Differences | error tracking in EVAL/pcall |
errorstats: failed call NOSCRIPT error | Observability Differences | EVALSHA → errorstat NOSCRIPT |
errorstats: failed call NOGROUP error | Observability Differences | XGROUP CREATECONSUMER → errorstat NOGROUP |
errorstats: rejected call unknown command | Observability Differences | unknown command → errorstat ERR |
errorstats: rejected call within MULTI/EXEC | Observability Differences | arity error in MULTI queuing |
errorstats: rejected call due to wrong arity | Observability Differences | wrong arg count → rejected_calls=1 |
errorstats: rejected call by OOM error | Observability Differences | maxmemory → errorstat OOM, rejected_calls=1 |
errorstats: rejected call by authorization error | Observability Differences | ACL → errorstat NOPERM, rejected_calls=1 |
clients: pubsub clients | Observability Differences | pubsub_clients count in INFO clients section |
clients: watching clients | Observability Differences | watching_clients, total_watched_keys in INFO clients; watch=N in CLIENT INFO |
introspection_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
MONITOR can log executed commands | Redis-Specific Internals | Redis-internal feature |
MONITOR can log commands issued by the scripting engine | Redis-Specific Internals | Redis-internal feature |
MONITOR can log commands issued by functions | Redis-Specific Internals | Redis-internal feature |
MONITOR supports redacting command arguments | Redis-Specific Internals | Redis-internal feature |
MONITOR correctly handles multi-exec cases | Redis-Specific Internals | Redis-internal feature |
MONITOR log blocked command only once | Redis-Specific Internals | Redis-internal feature |
CONFIG save params special case handled properly | Redis-Specific Internals | Redis-internal feature |
CONFIG REWRITE sanity | Redis-Specific Internals | Redis-internal feature |
CONFIG REWRITE handles save and shutdown properly | Redis-Specific Internals | Redis-internal feature |
CONFIG REWRITE handles rename-command properly | Redis-Specific Internals | Redis-internal feature |
CONFIG REWRITE handles alias config properly | Redis-Specific Internals | Redis-internal feature |
redis-server command line arguments - error cases | CLI Differences | Redis-internal CLI |
redis-server command line arguments - allow passing option name and option value in the same arg | CLI Differences | Redis-internal CLI |
redis-server command line arguments - wrong usage that we support anyway | CLI Differences | Redis-internal CLI |
redis-server command line arguments - save with empty input | CLI Differences | Redis-internal CLI |
redis-server command line arguments - take one bulk string with spaces for MULTI_ARG configs parsing | CLI Differences | Redis-internal CLI |
IO threads client number | Redis-Specific Internals | Redis-internal feature |
Clients are evenly distributed among io threads | Redis-Specific Internals | Redis-internal feature |
keyspace_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
SET/GET keys in different DBs | Single Database | single-DB |
Coverage: basic SWAPDB test and unhappy path | Single Database | single-DB |
Coverage: SWAPDB and FLUSHDB | Single Database | single-DB |
Commands pipelining | Redis-Specific Internals | Redis-internal channel-level pipeline test |
latency_monitor_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
LATENCY HISTOGRAM with empty histogram | Observability Differences | histogram always empty (FrogDB doesn't record CONFIG|RESETSTAT) |
LATENCY HISTOGRAM all commands | Observability Differences | FrogDB doesn't populate per-command histograms |
LATENCY HISTOGRAM sub commands | Observability Differences | FrogDB doesn't populate per-command histograms |
LATENCY HISTOGRAM with a subset of commands | Observability Differences | FrogDB doesn't populate per-command histograms |
LATENCY HISTOGRAM command | Observability Differences | FrogDB doesn't populate per-command histograms |
LATENCY HISTOGRAM with wrong command name skips the invalid one | Observability Differences | FrogDB doesn't populate per-command histograms |
Test latency events logging | Observability Differences | latency event collection not implemented (also `needs:debug`) |
LATENCY HISTORY output is ok | Observability Differences | latency event collection not implemented (also `needs:debug`) |
LATENCY LATEST output is ok | Observability Differences | latency event collection not implemented (also `needs:debug`) |
LATENCY GRAPH can output the event graph | Observability Differences | latency event collection not implemented (also `needs:debug`) |
LATENCY of expire events are correctly collected | Observability Differences | expire-cycle timing events not recorded |
LATENCY GRAPH can output the expire event graph | Observability Differences | expire-cycle timing events not recorded |
LATENCY HISTORY / RESET with wrong event name is fine | Observability Differences | FrogDB strictly validates event names and errors on unknown events |
LATENCY HELP should not have unexpected options | Observability Differences | FrogDB's LATENCY HELP accepts extra arguments without erroring |
LATENCY RESET is able to reset events | Observability Differences | upstream asserts `reset > 0` and empty `LATEST` after; FrogDB always returns 0 from RESET because no events are tracked, so the `> 0` assertion can't hold |
lazyfree_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
Unblocks client blocked on lazyfree via REPLICAOF command | Redis-Specific Internals | external:skip and lazyfree_pending_objects counter |
list_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
$container node check compression with insert and pop | Encoding Differences | internal-encoding (quicklist) |
$container node check compression combined with trim | Encoding Differences | internal-encoding (quicklist) |
Test LPUSH and LPOP on plain nodes | Encoding Differences | internal-encoding (quicklist plain nodes) |
Test LTRIM on plain nodes | Encoding Differences | internal-encoding (quicklist plain nodes) |
Test LREM on plain nodes | Encoding Differences | internal-encoding (quicklist plain nodes) |
Test LPOS on plain nodes | Encoding Differences | internal-encoding (quicklist plain nodes) |
Test LMOVE on plain nodes | Encoding Differences | internal-encoding (quicklist plain nodes) |
Crash due to delete entry from a compress quicklist node | Encoding Differences | internal-encoding (quicklist) |
Crash due to split quicklist node wrongly | Encoding Differences | internal-encoding (quicklist) |
Check compression with recompress | Encoding Differences | internal-encoding (quicklist) |
Crash due to wrongly recompress after lrem | Encoding Differences | internal-encoding (quicklist) |
Stress tester for #3343-alike bugs comp: $comp | Tested Elsewhere | internal-encoding (quicklist) + stress |
List listpack -> quicklist encoding conversion | Encoding Differences | internal-encoding |
List quicklist -> listpack encoding conversion | Encoding Differences | internal-encoding |
List encoding conversion when RDB loading | Encoding Differences | internal-encoding |
List invalid list-max-listpack-size config | Encoding Differences | internal-encoding |
List of various encodings | Encoding Differences | internal-encoding |
List of various encodings - sanitize dump | Encoding Differences | internal-encoding |
Test LPUSH and LPOP on plain nodes over 4GB | Tested Elsewhere | large-memory |
Test LTRIM on plain nodes over 4GB | Tested Elsewhere | large-memory |
Test LREM on plain nodes over 4GB | Tested Elsewhere | large-memory |
Test LMOVE on plain nodes over 4GB | Tested Elsewhere | large-memory |
BRPOPLPUSH - $type | Encoding Differences | internal-encoding |
BLMOVE $wherefrom $whereto - $type | Encoding Differences | internal-encoding |
LINDEX consistency test - $type | Encoding Differences | internal-encoding |
LINDEX random access - $type | Encoding Differences | internal-encoding |
RPOPLPUSH with $type source and existing target $othertype | Encoding Differences | internal-encoding |
LMOVE $wherefrom $whereto with $type source and existing target $othertype | Encoding Differences | internal-encoding |
Mass RPOP/LPOP - $type | Encoding Differences | internal-encoding |
SWAPDB awakes blocked client | Single Database | single-DB |
SWAPDB wants to wake blocked client, but the key already expired | Single Database | single-DB |
BLMPOP propagate as pop with count command to replica | Replication Differences | replication-internal |
LMPOP propagate as pop with count command to replica | Replication Differences | replication-internal |
BLPOP/BLMOVE should increase dirty | Redis-Specific Internals | Redis-internal stat (CONFIG/dirty counter) |
$pop: timeout | Tested Elsewhere | covered by `tcl_brpop_timeout` + `tcl_blpop_timeout_1s` |
$pop: arguments are empty | Tested Elsewhere | covered by `tcl_brpop_arguments_are_empty_push_unblocks` + `tcl_blpop_arguments_are_empty_push_unblocks` |
maxmemory_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
SET and RESTORE key nearly as large as the memory limit | Persistence Differences | DUMP/RESTORE not implemented |
slave buffer are counted correctly | Replication Differences | replication-internal |
replica buffer don't induce eviction | Replication Differences | replication-internal |
propagation with eviction | Replication Differences | replication-internal |
propagation with eviction in MULTI | Replication Differences | replication-internal |
Don't rehash if used memory exceeds maxmemory after rehash | DEBUG Command | uses populate (DEBUG), dict rehashing internals |
LRM: Basic write updates idle time | Redis-Specific Internals | LRM not implemented |
LRM: RENAME updates destination key LRM | Redis-Specific Internals | LRM not implemented |
LRM: XREADGROUP updates stream LRM | Redis-Specific Internals | LRM not implemented |
LRM: Keys with only read operations should be removed first | Redis-Specific Internals | LRM not implemented |
memefficiency_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
Memory efficiency with values in range $size_range | Redis-Specific Internals | allocator-calibrated ratio assertion, `external:skip` |
Active defrag main dictionary: $type | Redis-Specific Internals | jemalloc defrag not exposed in FrogDB |
Active defrag - AOF loading | Redis-Specific Internals | jemalloc defrag not exposed in FrogDB |
Active defrag eval scripts: $type | Redis-Specific Internals | jemalloc defrag not exposed in FrogDB |
Active defrag big keys: $type | Redis-Specific Internals | jemalloc defrag not exposed in FrogDB |
Active defrag pubsub: $type | Redis-Specific Internals | jemalloc defrag not exposed in FrogDB |
Active defrag IDMP streams: $type | Redis-Specific Internals | jemalloc defrag not exposed in FrogDB |
Active Defrag HFE with $eb_container: $type | Redis-Specific Internals | jemalloc defrag not exposed in FrogDB |
Active defrag for argv retained by the main thread from IO thread: $type | Redis-Specific Internals | jemalloc defrag not exposed in FrogDB |
Active defrag big list: $type | Redis-Specific Internals | jemalloc defrag not exposed in FrogDB |
Active defrag edge case: $type | Redis-Specific Internals | jemalloc defrag not exposed in FrogDB |
Active defrag can't be triggered during replicaof database flush. See issue #14267 | Redis-Specific Internals | jemalloc defrag not exposed in FrogDB |
multi_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
SWAPDB does not touch non-existing key replaced with stale key | Single Database | single-DB |
SWAPDB does not touch stale key replaced with another stale key | Single Database | single-DB |
WATCH is able to remember the DB a key belongs to | Single Database | single-DB |
SWAPDB does not touch watched stale keys | Single Database | single-DB + needs:debug |
MULTI propagation of PUBLISH | Requires Replication | requires primary+replica pair |
MULTI propagation of SCRIPT LOAD | Requires Replication | requires primary+replica pair |
MULTI propagation of EVAL | Requires Replication | requires primary+replica pair |
MULTI propagation of SCRIPT FLUSH | Requires Replication | requires primary+replica pair |
MULTI propagation of XREADGROUP | Requires Replication | requires primary+replica pair |
MULTI with $cmd | Requires Replication | requires primary+replica pair (inner-command propagation matrix) |
exec with write commands and state change | Requires Replication | requires min-replicas-to-write |
exec with read commands and stale replica state change | Requires Replication | requires replica state tracking |
MULTI with BGREWRITEAOF | Persistence Differences | aof |
MULTI with config set appendonly | Persistence Differences | aof |
networking_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
CONFIG SET port number | Configuration Differences | external:skip; FrogDB port is immutable |
CONFIG SET bind address | Configuration Differences | external:skip; FrogDB bind is immutable |
CONFIG SET bind-source-addr | Configuration Differences | external:skip; FrogDB does not implement bind-source-addr |
Default bind address configuration handling | Configuration Differences | external:skip; depends on CONFIG REWRITE and runtime bind mutation |
Protected mode works as expected | Configuration Differences | FrogDB does not implement protected mode; no DENIED response for non-loopback clients |
prefetch works as expected when killing a client from the middle of prefetch commands batch | Redis-Specific Internals | Redis-internal io-threads prefetch feature |
prefetch works as expected when changing the batch size while executing the commands batch | Redis-Specific Internals | Redis-internal io-threads prefetch feature |
no prefetch when the batch size is set to 0 | Redis-Specific Internals | Redis-internal io-threads prefetch feature |
Prefetch can resume working when the configuration option is set to a non-zero value | Redis-Specific Internals | Redis-internal io-threads prefetch feature |
Prefetch works with batch size greater than 16 (buffer overflow regression test) | Redis-Specific Internals | Redis-internal io-threads prefetch feature |
Prefetch works with maximum batch size of 128 and client number larger than batch size | Redis-Specific Internals | Redis-internal io-threads prefetch feature |
Multiple clients idle timeout test | Configuration Differences | FrogDB does not implement client-idle `timeout` config |
Pending command pool expansion and shrinking | Redis-Specific Internals | Redis-internal pending command pool; FrogDB uses Tokio channels with different sizing semantics |
other_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
Failing test | Redis-Specific Internals | `$::force_failure` helper, not a real test |
Coverage: MEMORY MALLOC-STATS | Redis-Specific Internals | jemalloc-only subcommand |
SAVE - make sure there are all the types as values | Persistence Differences | needs:save — requires RDB |
FLUSHALL should not reset the dirty counter if we disable save | Persistence Differences | needs:save — RDB dirty counter |
FLUSHALL should reset the dirty counter to 0 if we enable save | Persistence Differences | needs:save — RDB dirty counter |
FLUSHALL and bgsave | Persistence Differences | needs:save — requires BGSAVE+DEBUG SLEEP |
BGSAVE | Persistence Differences | needs:debug needs:save — DEBUG RELOAD required |
Perform a final SAVE to leave a clean DB on disk | Persistence Differences | needs:save — RDB save |
Check consistency of different data types after a reload | Persistence Differences | needs:debug — DEBUG RELOAD |
Same dataset digest if saving/reloading as AOF? | DEBUG Command | needs:debug — DEBUG DIGEST + AOF |
EXPIRES after a reload (snapshot + append only file rewrite) | Persistence Differences | needs:debug needs:save — DEBUG RELOAD + LOADAOF |
EXPIRES after AOF reload (without rewrite) | DEBUG Command | needs:debug — DEBUG LOADAOF |
FUZZ stresser with data model $fuzztype | Tested Elsewhere | slow — fuzz stresser |
SELECT an out of range DB | Single Database | singledb — SELECT non-zero rejected outright |
RESET clears client state | Protocol Differences | needs:reset — RESET not implemented |
RESET clears MONITOR state | Protocol Differences | needs:reset — RESET not implemented |
RESET clears and discards MULTI state | Protocol Differences | needs:reset — RESET not implemented |
RESET clears Pub/Sub state | Protocol Differences | needs:reset — RESET not implemented |
RESET clears authenticated state | Protocol Differences | needs:reset — RESET not implemented |
Don't rehash if redis has child process | DEBUG Command | needs:debug — DEBUG HTSTATS + fork |
Redis can trigger resizing | DEBUG Command | needs:debug — DEBUG HTSTATS + dict-resizing |
Redis can rewind and trigger smaller slot resizing | DEBUG Command | needs:debug — DEBUG HTSTATS |
Redis can resize empty dict | Redis-Specific Internals | MEMORY STATS `db.9 overhead.hashtable.main` Redis-internal |
Process title set as expected | Redis-Specific Internals | platform-specific — /proc/self/cmdline |
Cross DB command is incompatible with cluster mode | Cluster Differences | cluster:skip — multi-DB cluster metric |
Function no-cluster flag is incompatible with cluster mode | Cluster Differences | cluster:skip — no-cluster flag metric |
Script no-cluster flag is incompatible with cluster mode | Cluster Differences | cluster:skip — no-cluster flag metric |
SORT command incompatible operations with cluster mode | Cluster Differences | cluster:skip — SORT BY cluster metric |
Normal cross slot commands are incompatible with cluster mode | Cluster Differences | cluster:skip — cross-slot metric |
Transaction is incompatible with cluster mode | Cluster Differences | cluster:skip — transaction cluster metric |
Lua scripts are incompatible with cluster mode | Cluster Differences | cluster:skip — Lua cluster metric |
Shard subscribe commands are incompatible with cluster mode | Cluster Differences | cluster:skip — SSUBSCRIBE cluster metric |
cluster-compatibility-sample-ratio configuration can work | Cluster Differences | cluster:skip — sample-ratio config |
protocol_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
Protocol desync regression test #$c | Redis-Specific Internals | Redis-internal desync simulation |
Regression for a crash with blocking ops and pipelining | Replication Differences | needs:repl |
Regression for a crash with cron release of client arguments | Redis-Specific Internals | Redis-internal cron path |
RESP3 attributes | Protocol Differences | RESP3-only (requires attribute-mode invalidation delivery) |
RESP3 attributes readraw | Protocol Differences | RESP3-only (requires attribute-mode invalidation delivery) |
RESP3 attributes on RESP2 | Protocol Differences | RESP3-only (requires attribute-mode invalidation delivery) |
pubsub_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
Keyspace notifications: we receive keyspace notifications | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: we receive keyevent notifications | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: we can receive both kind of events | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: we are able to mask events | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: general events test | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: list events test | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: set events test | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: zset events test | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: hash events test ($type) | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: stream events test | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications:FXX/FNX with HSETEX cmd | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: expired events (triggered expire) | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: expired events (background expire) | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: evicted events | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: test CONFIG GET/SET of event flags | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: new key test | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: overwritten events - string to string | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: type_changed events - hash to string | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: both overwritten and type_changed events | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: configuration flags work correctly | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: RESTORE REPLACE different type - restore, overwritten and type_changed events | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: SET on existing string key - overwritten event | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: setKey on existing different type key - overwritten and type_changed events | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: overwritten and type_changed events for RENAME and COPY commands | Configuration Differences | needs:config (notify-keyspace-events) |
Keyspace notifications: overwritten and type_changed for *STORE* commands | Configuration Differences | needs:config (notify-keyspace-events) |
publish to self inside script | Scripting + Pub/Sub Interaction | PUBLISH not available in shard scripting context |
querybuf_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
query buffer resized correctly | Observability Differences | introspection field not implemented (requires observable `qbuf=` growth/shrink via `DEBUG PAUSE-CRON`) |
query buffer resized correctly when not idle | Observability Differences | introspection field not implemented (requires observable `qbuf=` growth/shrink; also tagged `needs:debug`) |
query buffer resized correctly with fat argv | Observability Differences | introspection field not implemented (requires observable `qbuf=` growth for a 1MB partial argv; needs `DEBUG PAUSE-CRON`) |
replybufsize_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
verify reply buffer limits | Redis-Specific Internals | Redis-internal reply buffer sizing (requires DEBUG REPLYBUFFER and `rbs=` in CLIENT LIST) |
scan_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
{$type} SSCAN with encoding $enc | Encoding Differences | internal-encoding |
{$type} HSCAN with encoding $enc | Encoding Differences | internal-encoding |
{$type} ZSCAN with encoding $enc | Encoding Differences | internal-encoding |
scripting_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
SORT BY <constant> output gets ordered for scripting | Scripting Differences | intentional behavioral diff (strict key validation) |
SORT BY <constant> with GET gets ordered for scripting | Scripting Differences | intentional behavioral diff (strict key validation) |
SPOP: We can call scripts rewriting client->argv from Lua | Scripting Differences | intentional behavioral diff (strict key validation) |
EXPIRE: We can call scripts rewriting client->argv from Lua | Scripting Differences | intentional behavioral diff (strict key validation) |
INCRBYFLOAT: We can call scripts expanding client->argv from Lua | Scripting Differences | intentional behavioral diff (strict key validation) |
Timedout read-only scripts can be killed by SCRIPT KILL | Redis-Specific Internals | Redis-internal feature |
Timedout read-only scripts can be killed by SCRIPT KILL even when use pcall | Redis-Specific Internals | Redis-internal feature |
Timedout script does not cause a false dead client | Redis-Specific Internals | Redis-internal feature |
Timedout script link is still usable after Lua returns | Redis-Specific Internals | Redis-internal feature |
Timedout scripts and unblocked command | Redis-Specific Internals | Redis-internal feature |
Timedout scripts that modified data can't be killed by SCRIPT KILL | Redis-Specific Internals | Redis-internal feature |
SHUTDOWN NOSAVE can kill a timedout script anyway | Redis-Specific Internals | Redis-internal feature |
Test setfenv availability lua-enable-deprecated-api=$enabled | Redis-Specific Internals | Redis-internal feature |
Test getfenv availability lua-enable-deprecated-api=$enabled | Redis-Specific Internals | Redis-internal feature |
Test newproxy availability lua-enable-deprecated-api=$enabled | Redis-Specific Internals | Redis-internal feature |
Verify Lua performs GC correctly after script loading | Redis-Specific Internals | Redis-internal Lua runtime |
reject script do not cause a Lua stack leak | Redis-Specific Internals | Redis-internal Lua runtime |
LUA test trim string as expected | Redis-Specific Internals | Redis-internal Lua runtime |
Functions in the Redis namespace are able to report errors | Redis-Specific Internals | Redis-internal Lua runtime |
MGET: mget shouldn't be propagated in Lua | Replication Differences | replication-internal |
not enough good replicas | Replication Differences | needs:repl (min-slaves-to-write) |
not enough good replicas state change during long script | Replication Differences | needs:repl |
Script - disallow write on OOM | Configuration Differences | needs:config-maxmemory |
Script ACL check | Scripting Differences | needs:ACL (script-level ACL filtering) |
set_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
SADD overflows the maximum allowed elements in a listpack - $type | Encoding Differences | internal-encoding (listpack) |
Set encoding after DEBUG RELOAD | Encoding Differences | internal-encoding + needs:debug |
Generated sets must be encoded correctly - $type | Encoding Differences | internal-encoding |
SDIFFSTORE with three sets - $type | Encoding Differences | internal-encoding |
SUNION hashtable and listpack | Encoding Differences | internal-encoding |
SRANDMEMBER - $type | Encoding Differences | internal-encoding |
SPOP integer from listpack set | Encoding Differences | internal-encoding (listpack) |
SPOP new implementation: code path #1 $type | Encoding Differences | internal-encoding |
SPOP new implementation: code path #2 $type | Encoding Differences | internal-encoding |
SPOP new implementation: code path #3 $type | Encoding Differences | internal-encoding |
SRANDMEMBER histogram distribution - $type | Encoding Differences | internal-encoding (chi-square) |
SRANDMEMBER with a dict containing long chain | Encoding Differences | internal-encoding (hash collision) |
SMOVE only notify dstset when the addition is successful | Configuration Differences | needs:config (notify-keyspace-events) |
slowlog_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
SLOWLOG - Certain commands are omitted that contain sensitive information | Replication Differences | needs:repl tag (config set masterauth/masteruser/tls-key-file-pass); FrogDB does not redact ACL SETUSER / CONFIG SET sensitive arguments in slowlog |
SLOWLOG - Some commands can redact sensitive fields | Replication Differences | needs:repl tag (MIGRATE AUTH/AUTH2 redaction) |
SLOWLOG - Rewritten commands are logged as their original command | Observability Differences | tests Redis-internal command rewriting (SPOP->DEL, GEOADD->ZADD, GETSET->SET, INCRBYFLOAT->SET, blocked BLPOP->LPOP) for replication purposes; FrogDB does not implement replication command rewriting |
SLOWLOG - EXEC is not logged, just executed commands | Observability Differences | FrogDB logs each command inside a MULTI/EXEC block individually but does not skip the enclosing EXEC |
SLOWLOG - blocking command is reported only after unblocked | Observability Differences | FrogDB logs blocking commands at submit time, not after unblock |
sort_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
$command GET <const> | Encoding Differences | internal-encoding (encoding-loop variant) |
SETRANGE with huge offset | Tested Elsewhere | large-memory |
sort by in cluster mode | Cluster Differences | cluster-only (different cluster command path) |
stream_cgroups_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
XREADGROUP CLAIM field types are correct | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM respects min-idle-time threshold | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM without messages | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM without pending messages | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM message response format | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM idle time | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM with NOACK | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM with NOACK and pending messages | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM with min-idle-time equal to zero | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM with large min-idle-time | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM with not integer for min-idle-time | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM with negative integer for min-idle-time | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM with different position | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM verify forced entries are claimable | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM with two blocked clients | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM claims all pending immediately | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM verify claiming order | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM when pending messages get trimmed | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM state persists across RDB save/load | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM idle time resets after RDB reload | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM multiple groups persist correctly | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM NOACK state not persisted | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM high delivery counts persist in RDB | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM usage stability with repeated claims | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM with large number of PEL messages | Redis-Specific Internals | Redis-internal feature |
XREADGROUP CLAIM within MULTI/EXEC transaction | Redis-Specific Internals | Redis-internal feature |
XREAD with CLAIM option | Redis-Specific Internals | Redis-internal feature |
XACKDEL wrong number of args | Redis-Specific Internals | Redis-internal feature |
XACKDEL with DELREF option acknowledges will remove entry from all PELs | Redis-Specific Internals | Redis-internal feature |
XACKDEL with ACKED option only deletes messages acknowledged by all groups | Redis-Specific Internals | Redis-internal feature |
XACKDEL with KEEPREF | Redis-Specific Internals | Redis-internal feature |
XACKDEL with IDs exceeding STREAMID_STATIC_VECTOR_LEN for heap allocation | Redis-Specific Internals | Redis-internal feature |
XGROUP SETID with ENTRIESREAD larger than stream entries should cap the value | Redis-Specific Internals | Redis-internal feature |
XREADGROUP of multiple entries changes dirty by one | Redis-Specific Internals | Redis-internal stat (dirty counter) |
XREADGROUP from PEL does not change dirty | Redis-Specific Internals | Redis-internal stat (dirty counter) |
Loading from legacy (Redis <= v6.2.x, rdb_ver < 10) persistence | Encoding Differences | internal-encoding (RDB) |
Loading from legacy (Redis <= v7.0.x, rdb_ver < 11) persistence | Encoding Differences | internal-encoding (RDB) |
stream_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
XADD IDMP with invalid syntax | Redis-Specific Internals | Redis-internal feature |
XADD IDMP basic addition | Redis-Specific Internals | Redis-internal feature |
XADD IDMP with binary-safe iid | Redis-Specific Internals | Redis-internal feature |
XADD IDMP with maximum length iid | Redis-Specific Internals | Redis-internal feature |
XADD IDMP with combined options | Redis-Specific Internals | Redis-internal feature |
XADD IDMP argument order variations | Redis-Specific Internals | Redis-internal feature |
XADD IDMP concurrent duplicate requests | Redis-Specific Internals | Redis-internal feature |
XADD IDMP pipelined requests | Redis-Specific Internals | Redis-internal feature |
XADD IDMP with consumer groups | Redis-Specific Internals | Redis-internal feature |
XADD IDMP persists in RDB | Redis-Specific Internals | Redis-internal feature |
XADD IDMP set in AOF | Redis-Specific Internals | Redis-internal feature |
XADD IDMP multiple producers have isolated namespaces | Redis-Specific Internals | Redis-internal feature |
XADD IDMP multiple producers each have their own MAXSIZE limit | Redis-Specific Internals | Redis-internal feature |
XADD IDMP multiple producers persistence in RDB | Redis-Specific Internals | Redis-internal feature |
XADD IDMP multiple producers concurrent access | Redis-Specific Internals | Redis-internal feature |
XADD IDMP multiple producers pipelined requests | Redis-Specific Internals | Redis-internal feature |
XADD IDMP multiple producers with mixed IDMP and IDMPAUTO | Redis-Specific Internals | Redis-internal feature |
XADD IDMP multiple producers stress test | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO with invalid syntax | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO basic deduplication based on field-value pairs | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO deduplicates regardless of field order | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO with single field-value pair | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO with many field-value pairs | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO with binary-safe values | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO with unicode values | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO with long values | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO argument order variations | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO persists in RDB | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO with consumer groups | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO field names matter | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO with numeric field names and values | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO multiple producers have isolated namespaces | Redis-Specific Internals | Redis-internal feature |
XADD IDMPAUTO multiple producers | Redis-Specific Internals | Redis-internal feature |
XIDMP entries expire after DURATION seconds | Redis-Specific Internals | Redis-internal feature |
XIDMP set evicts entries when MAXSIZE is reached | Redis-Specific Internals | Redis-internal feature |
XCFGSET set IDMP-DURATION successfully | Redis-Specific Internals | Redis-internal feature |
XCFGSET set IDMP-MAXSIZE successfully | Redis-Specific Internals | Redis-internal feature |
XCFGSET set both IDMP-DURATION and IDMP-MAXSIZE | Redis-Specific Internals | Redis-internal feature |
XCFGSET IDMP-DURATION maximum value validation | Redis-Specific Internals | Redis-internal feature |
XCFGSET IDMP-DURATION minimum value validation | Redis-Specific Internals | Redis-internal feature |
XCFGSET IDMP-MAXSIZE maximum value validation | Redis-Specific Internals | Redis-internal feature |
XCFGSET IDMP-MAXSIZE minimum value validation | Redis-Specific Internals | Redis-internal feature |
XCFGSET invalid syntax | Redis-Specific Internals | Redis-internal feature |
XCFGSET multiple configuration changes | Redis-Specific Internals | Redis-internal feature |
XCFGSET configuration persists in RDB | Redis-Specific Internals | Redis-internal feature |
XCFGSET configuration in AOF | Redis-Specific Internals | Redis-internal feature |
XCFGSET changing IDMP-DURATION clears all iids history | Redis-Specific Internals | Redis-internal feature |
XCFGSET changing IDMP-MAXSIZE clears all iids history | Redis-Specific Internals | Redis-internal feature |
XCFGSET history cleared then new deduplication works | Redis-Specific Internals | Redis-internal feature |
XCFGSET history cleared preserves stream entries | Redis-Specific Internals | Redis-internal feature |
XCFGSET setting same IDMP-DURATION does not clear iids history | Redis-Specific Internals | Redis-internal feature |
XCFGSET setting same IDMP-MAXSIZE does not clear iids history | Redis-Specific Internals | Redis-internal feature |
XCFGSET repeated same-value calls preserve IDMP history | Redis-Specific Internals | Redis-internal feature |
XCFGSET changing value after same-value sets still clears history | Redis-Specific Internals | Redis-internal feature |
XCFGSET setting same value preserves iids-tracked count | Redis-Specific Internals | Redis-internal feature |
XCFGSET IDMP-MAXSIZE wraparound keeps last 8 entries | Redis-Specific Internals | Redis-internal feature |
XCFGSET clears all producer histories | Redis-Specific Internals | Redis-internal feature |
XINFO STREAM shows IDMP configuration parameters | Redis-Specific Internals | Redis-internal feature |
XINFO STREAM shows default IDMP parameters | Redis-Specific Internals | Redis-internal feature |
XINFO STREAM returns iids-tracked and iids-added fields | Redis-Specific Internals | Redis-internal feature |
XINFO STREAM iids-added is lifetime counter even after eviction | Redis-Specific Internals | Redis-internal feature |
XINFO STREAM iids-duplicates is lifetime counter | Redis-Specific Internals | Redis-internal feature |
XINFO STREAM iids-duplicates persists after eviction | Redis-Specific Internals | Redis-internal feature |
XINFO STREAM iids-duplicates with multiple producers | Redis-Specific Internals | Redis-internal feature |
XINFO STREAM iids counters after CFGSET clears history | Redis-Specific Internals | Redis-internal feature |
XINFO STREAM iids-added persists in RDB | Redis-Specific Internals | Redis-internal feature |
XINFO STREAM returns pids-tracked field | Redis-Specific Internals | Redis-internal feature |
XINFO STREAM FULL returns pids-tracked field | Redis-Specific Internals | Redis-internal feature |
XINFO STREAM iids-tracked counts across all producers | Redis-Specific Internals | Redis-internal feature |
XINFO STREAM returns idmp-duration and idmp-maxsize fields | Redis-Specific Internals | Redis-internal feature |
CONFIG SET stream-idmp-duration and stream-idmp-maxsize validation | Redis-Specific Internals | Redis-internal feature |
XDELEX should return empty array when key doesn't exist | Redis-Specific Internals | Redis-internal feature |
XDELEX IDS parameter validation | Redis-Specific Internals | Redis-internal feature |
XDELEX KEEPREF/DELREF/ACKED parameter validation | Redis-Specific Internals | Redis-internal feature |
XDELEX with DELREF option acknowledges will remove entry from all PELs | Redis-Specific Internals | Redis-internal feature |
XDELEX with ACKED option only deletes messages acknowledged by all groups | Redis-Specific Internals | Redis-internal feature |
XDELEX with ACKED option won't delete messages when new consumer groups are created | Redis-Specific Internals | Redis-internal feature |
XDELEX with KEEPREF | Redis-Specific Internals | Redis-internal feature |
XADD with LIMIT consecutive calls | Encoding Differences | internal-encoding (uses stream-node-max-entries) |
XDEL fuzz test | Tested Elsewhere | fuzzing/stress |
XRANGE fuzzing | Tested Elsewhere | fuzzing/stress |
string_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
GETEX without argument does not propagate to replica | Replication Differences | replication-internal |
DELEX propagate as DEL command to replica | Replication Differences | replication-internal |
SETBIT fuzzing | Tested Elsewhere | fuzzing/stress |
GETRANGE fuzzing | Tested Elsewhere | fuzzing/stress |
MEMORY USAGE - STRINGS | Redis-Specific Internals | Redis-internal allocator |
Check MEMORY USAGE for embedded key strings with jemalloc | Redis-Specific Internals | Redis-internal allocator |
DELEX with binary data | Redis-Specific Internals | Redis-internal feature |
DELEX with unicode characters | Redis-Specific Internals | Redis-internal feature |
DELEX with special characters and whitespace | Redis-Specific Internals | Redis-internal feature |
DELEX digest consistency with same content | Redis-Specific Internals | Redis-internal feature |
DELEX digest with different content | Redis-Specific Internals | Redis-internal feature |
DIGEST with binary data | Redis-Specific Internals | Redis-internal feature |
DIGEST with unicode characters | Redis-Specific Internals | Redis-internal feature |
DIGEST with special characters and whitespace | Redis-Specific Internals | Redis-internal feature |
MSETEX - flexible argument parsing | Redis-Specific Internals | Redis-internal feature |
MSETEX - overflow protection in numkeys | Redis-Specific Internals | Redis-internal feature |
violations_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
XADD one huge field | Tested Elsewhere | large-memory tag — out of scope for unit tests |
XADD one huge field - 1 | Tested Elsewhere | large-memory tag — out of scope for unit tests |
several XADD big fields | Tested Elsewhere | large-memory tag — out of scope for unit tests |
single XADD big fields | Tested Elsewhere | large-memory tag — out of scope for unit tests |
hash with many big fields | Tested Elsewhere | large-memory tag — out of scope for unit tests |
hash with one huge field | Tested Elsewhere | large-memory tag — out of scope for unit tests |
zset_tcl.rs
| Excluded Test | Category | Reason |
|---|---|---|
Check encoding - $encoding | Encoding Differences | internal-encoding |
ZADD with options syntax error with incomplete pair - $encoding | Encoding Differences | internal-encoding |
ZINCRBY accepts hexadecimal inputs - $encoding | Encoding Differences | internal-encoding |
ZINCRBY against invalid incr value - $encoding | Encoding Differences | internal-encoding |
ZRANGEBYLEX with LIMIT - $encoding | Encoding Differences | internal-encoding |
ZUNIONSTORE with AGGREGATE MIN - $encoding | Encoding Differences | internal-encoding |
ZUNIONSTORE with AGGREGATE MAX - $encoding | Encoding Differences | internal-encoding |
ZINTERSTORE with weights - $encoding | Encoding Differences | internal-encoding |
ZINTERSTORE with a regular set and weights - $encoding | Encoding Differences | internal-encoding |
ZINTERSTORE with AGGREGATE MIN - $encoding | Encoding Differences | internal-encoding |
ZINTERSTORE with AGGREGATE MAX - $encoding | Encoding Differences | internal-encoding |
$cmd with +inf/-inf scores - $encoding | Encoding Differences | internal-encoding |
$cmd with NaN weights - $encoding | Encoding Differences | internal-encoding |
ZDIFFSTORE with a regular set - $encoding | Encoding Differences | internal-encoding |
ZSCORE - $encoding | Encoding Differences | internal-encoding |
ZMSCORE - $encoding | Encoding Differences | internal-encoding |
Basic $popmin/$popmax with a single key - $encoding | Encoding Differences | internal-encoding |
$popmin/$popmax with count - $encoding | Encoding Differences | internal-encoding |
$popmin/$popmax with a single existing sorted set - $encoding | Encoding Differences | internal-encoding |
$popmin/$popmax with multiple existing sorted sets - $encoding | Encoding Differences | internal-encoding |
$popmin/$popmax second sorted set has members - $encoding | Encoding Differences | internal-encoding |
ZRANDMEMBER - $type | Encoding Differences | internal-encoding |
ZADD overflows the maximum allowed elements in a listpack - $type | Encoding Differences | internal-encoding (listpack) |
ZRANGESTORE with zset-max-listpack-entries 0 #10767 case | Encoding Differences | internal-encoding (listpack) |
ZMPOP propagate as pop with count command to replica | Replication Differences | replication-internal |
BZMPOP propagate as pop with count command to replica | Replication Differences | replication-internal |
ZSETs skiplist implementation backlink consistency test - $encoding | Encoding Differences | internal-encoding |
ZSETs ZRANK augmented skip list stress testing - $encoding | Tested Elsewhere | internal-encoding (stress) |
ZSET skiplist order consistency when elements are moved | Encoding Differences | internal-encoding |
ZSET sorting stresser - $encoding | Tested Elsewhere | fuzzing/stress |
ZRANGEBYSCORE fuzzy test, 100 ranges in $elements element sorted set - $encoding | Tested Elsewhere | fuzzing/stress |
ZRANGEBYLEX fuzzy test, 100 ranges in $elements element sorted set - $encoding | Tested Elsewhere | fuzzing/stress |
ZREMRANGEBYLEX fuzzy test, 100 ranges in $elements element sorted set - $encoding | Tested Elsewhere | fuzzing/stress |
ZDIFF fuzzing - $encoding | Tested Elsewhere | fuzzing/stress |
ZUNIONSTORE result is sorted | Redis-Specific Internals | Redis-internal ordering invariant |
zunionInterDiffGenericCommand acts on SET and ZSET | Redis-Specific Internals | Redis-internal command name |
ZRANGESTORE invalid syntax | Redis-Specific Internals | Redis-internal syntax-error format |
ZRANGE invalid syntax | Redis-Specific Internals | Redis-internal syntax-error format |
$pop with the count 0 returns an empty array | Scripting Differences | intentional behavioral diff (count=0 edge) |