/* * Licensed to the Apache Software Foundation (ASF) under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional information regarding * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the License. You may obtain a * copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package org.apache.geode.redis; import org.apache.geode.cache.CacheFactory; import org.apache.geode.cache.GemFireCache; import org.apache.geode.internal.AvailablePortHelper; import org.apache.geode.test.junit.categories.IntegrationTest; import org.apache.geode.redis.GeodeRedisServer; import org.junit.After; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.experimental.categories.Category; import redis.clients.jedis.Jedis; import java.io.IOException; import java.util.*; import static org.apache.geode.distributed.ConfigurationProperties.*; import static org.junit.Assert.*; @Category(IntegrationTest.class) public class StringsJunitTest { private static Jedis jedis; private static GeodeRedisServer server; private static GemFireCache cache; private static Random rand; private static int port = 6379; @BeforeClass public static void setUp() throws IOException { rand = new Random(); CacheFactory cf = new CacheFactory(); // cf.set("log-file", "redis.log"); cf.set(LOG_LEVEL, "error"); cf.set(MCAST_PORT, "0"); cf.set(LOCATORS, ""); cache = cf.create(); port = AvailablePortHelper.getRandomAvailableTCPPort(); server = new GeodeRedisServer("localhost", port); server.start(); jedis = new Jedis("localhost", port, 10000000); } @Test public void testAppendAndStrlen() { String key = randString(); int len = key.length(); String full = key; jedis.set(key, key); for (int i = 0; i < 15; i++) { String rand = randString(); jedis.append(key, rand); len += rand.length(); full += rand; } String ret = jedis.get(key); assertTrue(ret.length() == len); assertTrue(full.equals(ret)); assertTrue(full.length() == jedis.strlen(key)); } @Test public void testDecr() { String key1 = randString(); String key2 = randString(); String key3 = randString(); int num1 = 100; int num2 = -100; jedis.set(key1, "" + num1); // jedis.set(key3, "-100"); jedis.set(key2, "" + num2); jedis.decr(key1); jedis.decr(key3); jedis.decr(key2); assertTrue(jedis.get(key1).equals("" + (num1 - 1))); assertTrue(jedis.get(key2).equals("" + (num2 - 1))); assertTrue(jedis.get(key3).equals("" + (-1))); } @Test public void testIncr() { String key1 = randString(); String key2 = randString(); String key3 = randString(); int num1 = 100; int num2 = -100; jedis.set(key1, "" + num1); // jedis.set(key3, "-100"); jedis.set(key2, "" + num2); jedis.incr(key1); jedis.incr(key3); jedis.incr(key2); assertTrue(jedis.get(key1).equals("" + (num1 + 1))); assertTrue(jedis.get(key2).equals("" + (num2 + 1))); assertTrue(jedis.get(key3).equals("" + (+1))); } @Test public void testDecrBy() { String key1 = randString(); String key2 = randString(); String key3 = randString(); int decr1 = rand.nextInt(100); int decr2 = rand.nextInt(100); Long decr3 = Long.MAX_VALUE / 2; int num1 = 100; int num2 = -100; jedis.set(key1, "" + num1); jedis.set(key2, "" + num2); jedis.set(key3, "" + Long.MIN_VALUE); jedis.decrBy(key1, decr1); jedis.decrBy(key2, decr2); assertTrue(jedis.get(key1).equals("" + (num1 - decr1 * 1))); assertTrue(jedis.get(key2).equals("" + (num2 - decr2 * 1))); Exception ex = null; try { jedis.decrBy(key3, decr3); } catch (Exception e) { ex = e; } assertNotNull(ex); } @Test public void testIncrBy() { String key1 = randString(); String key2 = randString(); String key3 = randString(); int incr1 = rand.nextInt(100); int incr2 = rand.nextInt(100); Long incr3 = Long.MAX_VALUE / 2; int num1 = 100; int num2 = -100; jedis.set(key1, "" + num1); jedis.set(key2, "" + num2); jedis.set(key3, "" + Long.MAX_VALUE); jedis.incrBy(key1, incr1); jedis.incrBy(key2, incr2); assertTrue(jedis.get(key1).equals("" + (num1 + incr1 * 1))); assertTrue(jedis.get(key2).equals("" + (num2 + incr2 * 1))); Exception ex = null; try { jedis.incrBy(key3, incr3); } catch (Exception e) { ex = e; } assertNotNull(ex); } @Test public void testGetRange() { String sent = randString(); String contents = randString(); jedis.set(sent, contents); for (int i = 0; i < sent.length(); i++) { String range = jedis.getrange(sent, i, -1); assertTrue(contents.substring(i).equals(range)); } assertNull(jedis.getrange(sent, 2, 0)); } @Test public void testGetSet() { String key = randString(); String contents = randString(); jedis.set(key, contents); String newContents = randString(); String oldContents = jedis.getSet(key, newContents); assertTrue(oldContents.equals(contents)); contents = newContents; } @Test public void testMSetAndGet() { int r = 5; String[] keyvals = new String[(r * 2)]; String[] keys = new String[r]; String[] vals = new String[r]; for (int i = 0; i < r; i++) { String key = randString(); String val = randString(); keyvals[2 * i] = key; keyvals[2 * i + 1] = val; keys[i] = key; vals[i] = val; } jedis.mset(keyvals); List<String> ret = jedis.mget(keys); Object[] retArray = ret.toArray(); assertTrue(Arrays.equals(vals, retArray)); } @Test public void testMSetNX() { Set<String> strings = new HashSet<String>(); for (int i = 0; i < 2 * 5; i++) strings.add(randString()); String[] array = strings.toArray(new String[0]); long response = jedis.msetnx(array); assertTrue(response == 1); long response2 = jedis.msetnx(array[0], randString()); assertTrue(response2 == 0); assertEquals(array[1], jedis.get(array[0])); } @Test public void testSetNX() { String key1 = randString(); String key2; do { key2 = randString(); } while (key2.equals(key1)); long response1 = jedis.setnx(key1, key1); long response2 = jedis.setnx(key2, key2); long response3 = jedis.setnx(key1, key2); assertTrue(response1 == 1); assertTrue(response2 == 1); assertTrue(response3 == 0); } @Test public void testPAndSetex() { Random r = new Random(); int setex = r.nextInt(5); if (setex == 0) setex = 1; String key = randString(); jedis.setex(key, setex, randString()); try { Thread.sleep((setex + 5) * 1000); } catch (InterruptedException e) { return; } String result = jedis.get(key); // System.out.println(result); assertNull(result); int psetex = r.nextInt(5000); if (psetex == 0) psetex = 1; key = randString(); jedis.psetex(key, psetex, randString()); long start = System.currentTimeMillis(); try { Thread.sleep(psetex + 5000); } catch (InterruptedException e) { return; } long stop = System.currentTimeMillis(); result = jedis.get(key); assertTrue(stop - start >= psetex); assertNull(result); } private String randString() { return Long.toHexString(Double.doubleToLongBits(Math.random())); } @After public void flushAll() { jedis.flushAll(); } @AfterClass public static void tearDown() { jedis.close(); cache.close(); server.shutdown(); } }