Skip to content

Commit

Permalink
Clear FakeRedis state directly to avoid leaky state.
Browse files Browse the repository at this point in the history
GitOrigin-RevId: d72fc5f3faff2c06f764fcef112cfa11513810e2
  • Loading branch information
krispenney authored and svc-squareup-copybara committed Nov 5, 2024
1 parent caab393 commit 43a9c2a
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 11 deletions.
3 changes: 2 additions & 1 deletion misk-redis/api/misk-redis.api
Original file line number Diff line number Diff line change
Expand Up @@ -540,7 +540,7 @@ public final class misk/redis/testing/DockerRedisKt {
public static synthetic fun main ([Ljava/lang/String;)V
}

public final class misk/redis/testing/FakeRedis : misk/testing/FakeFixture, misk/redis/Redis {
public final class misk/redis/testing/FakeRedis : misk/redis/Redis, misk/testing/TestFixture {
public fun <init> (Ljava/time/Clock;Lkotlin/random/Random;)V
public fun blmove (Ljava/lang/String;Ljava/lang/String;Lredis/clients/jedis/args/ListDirection;Lredis/clients/jedis/args/ListDirection;D)Lokio/ByteString;
public fun brpoplpush (Ljava/lang/String;Ljava/lang/String;I)Lokio/ByteString;
Expand Down Expand Up @@ -580,6 +580,7 @@ public final class misk/redis/testing/FakeRedis : misk/testing/FakeFixture, misk
public fun pipelined ()Lredis/clients/jedis/Pipeline;
public fun pipelining (Lkotlin/jvm/functions/Function1;)V
public fun publish (Ljava/lang/String;Ljava/lang/String;)V
public fun reset ()V
public fun rpop (Ljava/lang/String;)Lokio/ByteString;
public fun rpop (Ljava/lang/String;I)Ljava/util/List;
public fun rpoplpush (Ljava/lang/String;Ljava/lang/String;)Lokio/ByteString;
Expand Down
23 changes: 13 additions & 10 deletions misk-redis/src/testFixtures/kotlin/misk/redis/testing/FakeRedis.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import misk.redis.Redis.ZRangeMarker
import misk.redis.Redis.ZRangeRankMarker
import misk.redis.Redis.ZRangeScoreMarker
import misk.redis.Redis.ZRangeType
import misk.testing.FakeFixture
import misk.testing.TestFixture
import okio.ByteString.Companion.encodeUtf8
import org.apache.commons.io.FilenameUtils
import java.util.SortedMap
Expand All @@ -48,30 +48,33 @@ import kotlin.random.Random
class FakeRedis @Inject constructor(
private val clock: Clock,
@ForFakeRedis private val random: Random,
) : Redis, FakeFixture() {
) : Redis, TestFixture {
/** The value type stored in our key-value store. */
private data class Value<T>(val data: T, var expiryInstant: Instant)

/** Acts as the Redis key-value store. */
private val keyValueStore by resettable { ConcurrentHashMap<String, Value<ByteString>>() }
private val keyValueStore = ConcurrentHashMap<String, Value<ByteString>>()

/** A nested hash map for hash operations. */
private val hKeyValueStore by resettable {
ConcurrentHashMap<String, Value<ConcurrentHashMap<String, ByteString>>>()
}
private val hKeyValueStore = ConcurrentHashMap<String, Value<ConcurrentHashMap<String, ByteString>>>()

/**
* Note: Redis sorted set actually orders by value. It is quite complex to implement it here.
* In this Fake Redis implementation which is generally used for testing, we have simply used a
* HashMap to key score->members. So any sorting based on values will have to be handled in the
* implementation of the functions for this sorted set.
*/
private val sortedSetKeyValueStore by resettable {
ConcurrentHashMap<String, Value<SortedMap<Double, HashSet<String>>>>()
}
private val sortedSetKeyValueStore = ConcurrentHashMap<String, Value<SortedMap<Double, HashSet<String>>>>()

/** A hash map for list operations. */
private val lKeyValueStore by resettable { ConcurrentHashMap<String, Value<List<ByteString>>>() }
private val lKeyValueStore = ConcurrentHashMap<String, Value<List<ByteString>>>()

override fun reset() {
keyValueStore.clear()
hKeyValueStore.clear()
sortedSetKeyValueStore.clear()
lKeyValueStore.clear()
}

@Synchronized
override fun del(key: String): Boolean {
Expand Down

0 comments on commit 43a9c2a

Please sign in to comment.