File: RedisCacheSetAndRemoveTests.cs
Web Access
Project: src\src\Caching\StackExchangeRedis\test\Microsoft.Extensions.Caching.StackExchangeRedis.Tests.csproj (Microsoft.Extensions.Caching.StackExchangeRedis.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Caching.Distributed;
using Xunit;
 
namespace Microsoft.Extensions.Caching.StackExchangeRedis;
 
public class RedisCacheSetAndRemoveTests
{
    private const string SkipReason = "TODO: Disabled due to CI failure. " +
        "These tests require Redis server to be started on the machine. Make sure to change the value of" +
        "\"RedisTestConfig.RedisPort\" accordingly.";
 
    [Fact(Skip = SkipReason)]
    public void GetMissingKeyReturnsNull()
    {
        var cache = RedisTestConfig.CreateCacheInstance(GetType().Name);
        string key = "non-existent-key";
 
        var result = cache.Get(key);
        Assert.Null(result);
    }
 
    [Fact(Skip = SkipReason)]
    public void SetAndGetReturnsObject()
    {
        var cache = RedisTestConfig.CreateCacheInstance(GetType().Name);
        var value = new byte[1];
        string key = "myKey";
 
        cache.Set(key, value);
 
        var result = cache.Get(key);
        Assert.Equal(value, result);
    }
 
    [Fact(Skip = SkipReason)]
    public void SetAndGetWorksWithCaseSensitiveKeys()
    {
        var cache = RedisTestConfig.CreateCacheInstance(GetType().Name);
        var value = new byte[1];
        string key1 = "myKey";
        string key2 = "Mykey";
 
        cache.Set(key1, value);
 
        var result = cache.Get(key1);
        Assert.Equal(value, result);
 
        result = cache.Get(key2);
        Assert.Null(result);
    }
 
    [Fact(Skip = SkipReason)]
    public void SetAlwaysOverwrites()
    {
        var cache = RedisTestConfig.CreateCacheInstance(GetType().Name);
        var value1 = new byte[1] { 1 };
        string key = "myKey";
 
        cache.Set(key, value1);
        var result = cache.Get(key);
        Assert.Equal(value1, result);
 
        var value2 = new byte[1] { 2 };
        cache.Set(key, value2);
        result = cache.Get(key);
        Assert.Equal(value2, result);
    }
 
    [Fact(Skip = SkipReason)]
    public void RemoveRemoves()
    {
        var cache = RedisTestConfig.CreateCacheInstance(GetType().Name);
        var value = new byte[1];
        string key = "myKey";
 
        cache.Set(key, value);
        var result = cache.Get(key);
        Assert.Equal(value, result);
 
        cache.Remove(key);
        result = cache.Get(key);
        Assert.Null(result);
    }
 
    [Fact(Skip = SkipReason)]
    public void SetNullValueThrows()
    {
        var cache = RedisTestConfig.CreateCacheInstance(GetType().Name);
        byte[] value = null;
        string key = "myKey";
 
        Assert.Throws<ArgumentNullException>(() => cache.Set(key, value));
    }
 
    [Fact(Skip = SkipReason)]
    public void SetGetEmptyNonNullBuffer()
    {
        var cache = RedisTestConfig.CreateCacheInstance(GetType().Name);
        var key = Me();
        cache.Remove(key); // known state
        Assert.Null(cache.Get(key)); // expect null
 
        cache.Set(key, Array.Empty<byte>());
        var arr = cache.Get(key);
        Assert.NotNull(arr);
        Assert.Empty(arr);
    }
 
    [Fact(Skip = SkipReason)]
    public async Task SetGetEmptyNonNullBufferAsync()
    {
        var cache = RedisTestConfig.CreateCacheInstance(GetType().Name);
        var key = Me();
        await cache.RemoveAsync(key); // known state
        Assert.Null(await cache.GetAsync(key)); // expect null
 
        await cache.SetAsync(key, Array.Empty<byte>());
        var arr = await cache.GetAsync(key);
        Assert.NotNull(arr);
        Assert.Empty(arr);
    }
 
    [Theory(Skip = SkipReason)]
    [InlineData("")]
    [InlineData(" ")]
    [InlineData("abc")]
    public void SetGetNonNullString(string payload)
    {
        var cache = RedisTestConfig.CreateCacheInstance(GetType().Name);
        var key = Me();
        cache.Remove(key); // known state
        Assert.Null(cache.Get(key)); // expect null
        cache.SetString(key, payload);
 
        // check raw bytes
        var raw = cache.Get(key);
        Assert.Equal(Hex(payload), Hex(raw));
 
        // check via string API
        var value = cache.GetString(key);
        Assert.NotNull(value);
        Assert.Equal(payload, value);
    }
 
    [Theory(Skip = SkipReason)]
    [InlineData("")]
    [InlineData(" ")]
    [InlineData("abc")]
    [InlineData("abc def ghi jkl mno pqr stu vwx yz!")]
    public async Task SetGetNonNullStringAsync(string payload)
    {
        var cache = RedisTestConfig.CreateCacheInstance(GetType().Name);
        var key = Me();
        await cache.RemoveAsync(key); // known state
        Assert.Null(await cache.GetAsync(key)); // expect null
        await cache.SetStringAsync(key, payload);
 
        // check raw bytes
        var raw = await cache.GetAsync(key);
        Assert.Equal(Hex(payload), Hex(raw));
 
        // check via string API
        var value = await cache.GetStringAsync(key);
        Assert.NotNull(value);
        Assert.Equal(payload, value);
    }
 
    static string Hex(byte[] value) => BitConverter.ToString(value);
    static string Hex(string value) => Hex(Encoding.UTF8.GetBytes(value));
 
    private static string Me([CallerMemberName] string caller = "") => caller;
}