package com.lambdaworks.redis; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; import static org.junit.Assume.assumeTrue; import java.io.File; import java.io.IOException; import java.util.Locale; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import com.lambdaworks.redis.api.StatefulRedisConnection; import com.lambdaworks.redis.sentinel.SentinelRule; import io.netty.util.internal.SystemPropertyUtil; /** * @author Mark Paluch */ public class UnixDomainSocketTest { public static final String MASTER_ID = "mymaster"; private static RedisClient sentinelClient; @Rule public SentinelRule sentinelRule = new SentinelRule(sentinelClient, false, 26379, 26380); protected Logger log = LogManager.getLogger(getClass()); protected String key = "key"; protected String value = "value"; @BeforeClass public static void setupClient() { sentinelClient = getRedisSentinelClient(); } @AfterClass public static void shutdownClient() { FastShutdown.shutdown(sentinelClient); } @Test public void standalone_Linux_x86_64_RedisClientWithSocket() throws Exception { linuxOnly(); RedisURI redisURI = getSocketRedisUri(); RedisClient redisClient = RedisClient.create(redisURI); StatefulRedisConnection<String, String> connection = redisClient.connect(); someRedisAction(connection.sync()); connection.close(); FastShutdown.shutdown(redisClient); } @Test public void standalone_Linux_x86_64_ConnectToSocket() throws Exception { linuxOnly(); RedisURI redisURI = getSocketRedisUri(); RedisClient redisClient = RedisClient.create(); StatefulRedisConnection<String, String> connection = redisClient.connect(redisURI); someRedisAction(connection.sync()); connection.close(); FastShutdown.shutdown(redisClient); } private void linuxOnly() { String osName = SystemPropertyUtil.get("os.name").toLowerCase(Locale.UK).trim(); assumeTrue("Only supported on Linux, your os is " + osName, osName.startsWith("linux")); } private RedisURI getSocketRedisUri() throws IOException { File file = new File(TestSettings.socket()).getCanonicalFile(); return RedisURI.create(RedisURI.URI_SCHEME_REDIS_SOCKET + "://" + file.getCanonicalPath()); } private RedisURI getSentinelSocketRedisUri() throws IOException { File file = new File(TestSettings.sentinelSocket()).getCanonicalFile(); return RedisURI.create(RedisURI.URI_SCHEME_REDIS_SOCKET + "://" + file.getCanonicalPath()); } @Test public void sentinel_Linux_x86_64_RedisClientWithSocket() throws Exception { linuxOnly(); RedisURI uri = new RedisURI(); uri.getSentinels().add(getSentinelSocketRedisUri()); uri.setSentinelMasterId("mymaster"); RedisClient redisClient = RedisClient.create(uri); StatefulRedisConnection<String, String> connection = redisClient.connect(); someRedisAction(connection.sync()); connection.close(); RedisSentinelAsyncConnection<String, String> sentinelConnection = redisClient.connectSentinelAsync(); assertThat(sentinelConnection.ping().get()).isEqualTo("PONG"); sentinelConnection.close(); FastShutdown.shutdown(redisClient); } @Test public void sentinel_Linux_x86_64_ConnectToSocket() throws Exception { linuxOnly(); RedisURI uri = new RedisURI(); uri.getSentinels().add(getSentinelSocketRedisUri()); uri.setSentinelMasterId("mymaster"); RedisClient redisClient = RedisClient.create(); StatefulRedisConnection<String, String> connection = redisClient.connect(uri); someRedisAction(connection.sync()); connection.close(); RedisSentinelAsyncConnection<String, String> sentinelConnection = redisClient.connectSentinelAsync(uri); assertThat(sentinelConnection.ping().get()).isEqualTo("PONG"); sentinelConnection.close(); FastShutdown.shutdown(redisClient); } @Test public void sentinel_Linux_x86_64_socket_and_inet() throws Exception { sentinelRule.waitForMaster(MASTER_ID); linuxOnly(); RedisURI uri = new RedisURI(); uri.getSentinels().add(getSentinelSocketRedisUri()); uri.getSentinels().add(RedisURI.create(RedisURI.URI_SCHEME_REDIS + "://" + TestSettings.host() + ":26379")); uri.setSentinelMasterId(MASTER_ID); RedisClient redisClient = new RedisClient(uri); RedisSentinelAsyncConnection<String, String> sentinelConnection = redisClient .connectSentinelAsync(getSentinelSocketRedisUri()); log.info("Masters: " + sentinelConnection.masters().get()); try { redisClient.connect(); fail("Missing validation exception"); } catch (RedisConnectionException e) { assertThat(e).hasMessageContaining("You cannot mix unix domain socket and IP socket URI's"); } finally { FastShutdown.shutdown(redisClient); } } private void someRedisAction(RedisConnection<String, String> connection) { connection.set(key, value); String result = connection.get(key); assertThat(result).isEqualTo(value); } protected static RedisClient getRedisSentinelClient() { return new RedisClient(RedisURI.Builder.sentinel(TestSettings.host(), MASTER_ID).build()); } }