package org.swisspush.reststorage.lua; import org.junit.Test; import java.util.List; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.assertThat; public class RedisGetLuaScriptTests extends AbstractLuaScriptTest { private final static String TYPE_COLLECTION = "TYPE_COLLECTION"; private final static String TYPE_RESOURCE = "TYPE_RESOURCE"; @Test public void getCompressedResource() { // ARRANGE evalScriptPut(":project:server:test:resource1", "{\"content\": \"originalContent\"}", AbstractLuaScriptTest.MAX_EXPIRE, "etag1", true); evalScriptPut(":project:server:test:resource2", "{\"content\": \"originalContent2\"}", AbstractLuaScriptTest.MAX_EXPIRE, "etag2", false); // ACT List<String> valuesResource1 = (List<String>) evalScriptGet(":project:server:test:resource1"); List<String> valuesResource2 = (List<String>) evalScriptGet(":project:server:test:resource2"); // ASSERT assertThat(valuesResource1.get(0), equalTo(TYPE_RESOURCE)); assertThat(valuesResource1.get(1), equalTo("{\"content\": \"originalContent\"}")); assertThat(valuesResource1.get(2), equalTo("etag1")); assertThat(valuesResource1.get(3), notNullValue()); assertThat(valuesResource2.get(0), equalTo(TYPE_RESOURCE)); assertThat(valuesResource2.get(1), equalTo("{\"content\": \"originalContent2\"}")); assertThat(valuesResource2.get(2), equalTo("etag2")); assertThat(valuesResource2.get(3), nullValue()); } @Test public void getResourcePathDepthIs3() { // ARRANGE evalScriptPut(":project:server:test:test1:test2", "{\"content\": \"test/test1/test2\"}"); // ACT List<String> value = (List<String>) evalScriptGet(":project:server:test:test1:test2"); // ASSERT assertThat(TYPE_RESOURCE, equalTo(value.get(0))); assertThat("{\"content\": \"test/test1/test2\"}", equalTo(value.get(1))); } @Test public void getResourceWithEtag() { // ARRANGE evalScriptPut(":project:server:test:test1:test2", "{\"content\": \"test/test1/test2\"}"); // ACT @SuppressWarnings("unchecked") List<String> values = (List<String>) evalScriptGet(":project:server:test:test1:test2"); // ASSERT assertThat(values.get(0), equalTo(TYPE_RESOURCE)); assertThat(values.get(1), equalTo("{\"content\": \"test/test1/test2\"}")); assertThat(values.get(2), notNullValue()); String etag = values.get(2); // ACT @SuppressWarnings("unchecked") List<String> values2 = (List<String>) evalScriptGet(":project:server:test:test1:test2"); // ASSERT assertThat(values2.get(2), equalTo(etag)); // ARRANGE evalScriptPut(":project:server:test:test1:test2", "{\"content\": \"test/test1/test2x\"}"); // ACT @SuppressWarnings("unchecked") List<String> values3 = (List<String>) evalScriptGet(":project:server:test:test1:test2"); // ASSERT assertThat(values3.get(2), not(equalTo(etag))); } @Test public void getCollectionPathDepthIs3ChildIsResource() { // ARRANGE evalScriptPut(":project:server:test:test1:test2", "{\"content\": \"test/test1/test2\"}"); // ACT @SuppressWarnings("unchecked") List<String> values = (List<String>) evalScriptGet(":project:server:test:test1"); // ASSERT assertThat(values.get(0), equalTo(TYPE_COLLECTION)); assertThat(values.get(1), equalTo("test2")); } @Test public void getCollectionPathDepthIs3HasOtherCollection() { // ARRANGE evalScriptPut(":project:server:test:test1:test2", "{\"content\": \"test/test1/test2\"}"); // ACT @SuppressWarnings("unchecked") List<String> values = (List<String>) evalScriptGet(":project:server:test"); // ASSERT assertThat(values.get(0), equalTo(TYPE_COLLECTION)); assertThat(values.get(1), equalTo("test1:")); } // EXPIRATION @Test public void getResourcePathDepthIs3ParentOfResourceIsExpired() throws InterruptedException { // ARRANGE String now = String.valueOf(System.currentTimeMillis()); evalScriptPut(":project:server:test:test1:test2", "{\"content\": \"test/test1/test2\"}", now); Thread.sleep(10); // ACT List<String> values = (List<String>) evalScriptGet(":project:server:test:test1"); // ASSERT assertThat(values.size(), equalTo(1)); assertThat(values.get(0), equalTo(TYPE_COLLECTION)); } @Test public void getResourcePathDepthIs3ResourceIsExpired() throws InterruptedException { // ARRANGE String now = String.valueOf(System.currentTimeMillis()); evalScriptPut(":project:server:test:test1:test2", "{\"content\": \"test/test1/test2\"}", now); Thread.sleep(10); // ACT String timestamp = String.valueOf(System.currentTimeMillis()); String value = (String) evalScriptGet(":project:server:test:test1:test2", timestamp); // ASSERT assertThat(value, equalTo("notFound")); } @Test public void getResourcePathDepthIs3ParentOfResourceHasUpdatedExpiration() throws InterruptedException { // ARRANGE String now = String.valueOf(System.currentTimeMillis()); String in1min = String.valueOf(System.currentTimeMillis() + (1000 * 60)); evalScriptPut(":project:server:test:test1:test2", "{\"content\": \"test/test1/test2\"}", now); evalScriptPut(":project:server:test:test1:test22", "{\"content\": \"test/test1/test22\"}", in1min); Thread.sleep(10); // ACT List<String> valuesTest1 = (List<String>) evalScriptGet(":project:server:test:test1"); String valueTest2 = (String) evalScriptGet(":project:server:test:test1:test2"); List<String> valueTest22 = (List<String>) evalScriptGet(":project:server:test:test1:test22"); // ASSERT assertThat(valuesTest1.size(), equalTo(2)); assertThat(valuesTest1.get(0), equalTo(TYPE_COLLECTION)); assertThat(valuesTest1.get(1), equalTo("test22")); assertThat(valueTest2, equalTo("notFound")); assertThat(valueTest22.get(0), equalTo(TYPE_RESOURCE)); assertThat(valueTest22.get(1), equalTo("{\"content\": \"test/test1/test22\"}")); } @Test public void getCollectionInvalidOffsetCount() throws InterruptedException { // ARRANGE evalScriptPut(":project:server:test:test1:test2", "{\"content\": \"test/test1/test2\"}"); evalScriptPut(":project:server:test:test1:test3", "{\"content\": \"test/test1/test3\"}"); evalScriptPut(":project:server:test:test1:test4", "{\"content\": \"test/test1/test4\"}"); evalScriptPut(":project:server:test:test1:test5", "{\"content\": \"test/test1/test5\"}"); // ACT List<String> valuesTest1 = (List<String>) evalScriptGetOffsetCount(":project:server:test:test1", "bla", "blo"); // ASSERT assertThat(valuesTest1.size(), equalTo(5)); assertThat(valuesTest1.get(0), equalTo(TYPE_COLLECTION)); } @Test public void getCollectionOffsetCountInsideBoundaries() throws InterruptedException { // ARRANGE evalScriptPut(":project:server:test:test1:test2", "{\"content\": \"test/test1/test2\"}"); evalScriptPut(":project:server:test:test1:test3", "{\"content\": \"test/test1/test3\"}"); evalScriptPut(":project:server:test:test1:test4", "{\"content\": \"test/test1/test4\"}"); evalScriptPut(":project:server:test:test1:test5", "{\"content\": \"test/test1/test5\"}"); // ACT List<String> valuesTest1 = (List<String>) evalScriptGetOffsetCount(":project:server:test:test1", "1", "2"); // ASSERT assertThat(valuesTest1.size(), equalTo(3)); assertThat(valuesTest1.get(0), equalTo(TYPE_COLLECTION)); assertThat(valuesTest1.get(1), equalTo("test3")); assertThat(valuesTest1.get(2), equalTo("test4")); // ACT List<String> valuesTest2 = (List<String>) evalScriptGetOffsetCount(":project:server:test:test1", "0", "4"); // ASSERT assertThat(valuesTest2.size(), equalTo(5)); assertThat(valuesTest2.get(0), equalTo(TYPE_COLLECTION)); assertThat(valuesTest2.get(1), equalTo("test2")); assertThat(valuesTest2.get(2), equalTo("test3")); assertThat(valuesTest2.get(3), equalTo("test4")); assertThat(valuesTest2.get(4), equalTo("test5")); // ACT List<String> valuesTest3 = (List<String>) evalScriptGetOffsetCount(":project:server:test:test1", "0", "-1"); // ASSERT assertThat(valuesTest3.size(), equalTo(5)); assertThat(valuesTest3.get(0), equalTo(TYPE_COLLECTION)); assertThat(valuesTest3.get(1), equalTo("test2")); assertThat(valuesTest3.get(2), equalTo("test3")); assertThat(valuesTest3.get(3), equalTo("test4")); assertThat(valuesTest3.get(4), equalTo("test5")); } @Test public void getCollectionOffsetCountOutsideBoundaries() throws InterruptedException { // ARRANGE evalScriptPut(":project:server:test:test1:test2", "{\"content\": \"test/test1/test2\"}"); evalScriptPut(":project:server:test:test1:test3", "{\"content\": \"test/test1/test3\"}"); evalScriptPut(":project:server:test:test1:test4", "{\"content\": \"test/test1/test4\"}"); evalScriptPut(":project:server:test:test1:test5", "{\"content\": \"test/test1/test5\"}"); // ACT List<String> valuesTest1 = (List<String>) evalScriptGetOffsetCount(":project:server:test:test1", "-1", "2"); // ASSERT assertThat(valuesTest1.size(), equalTo(5)); assertThat(valuesTest1.get(0), equalTo(TYPE_COLLECTION)); assertThat(valuesTest1.get(1), equalTo("test2")); assertThat(valuesTest1.get(2), equalTo("test3")); assertThat(valuesTest1.get(3), equalTo("test4")); assertThat(valuesTest1.get(4), equalTo("test5")); // ACT List<String> valuesTest2 = (List<String>) evalScriptGetOffsetCount(":project:server:test:test1", "0", "9"); // ASSERT assertThat(valuesTest2.size(), equalTo(5)); assertThat(valuesTest2.get(0), equalTo(TYPE_COLLECTION)); assertThat(valuesTest2.get(1), equalTo("test2")); assertThat(valuesTest2.get(2), equalTo("test3")); assertThat(valuesTest2.get(3), equalTo("test4")); assertThat(valuesTest2.get(4), equalTo("test5")); // ACT List<String> valuesTest3 = (List<String>) evalScriptGetOffsetCount(":project:server:test:test1", "9", "4"); // ASSERT assertThat(valuesTest3.size(), equalTo(1)); assertThat(valuesTest3.get(0), equalTo(TYPE_COLLECTION)); } }