/* * ModeShape (http://www.modeshape.org) * * Licensed 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.modeshape.jcr.value.binary; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashSet; import java.util.Set; import java.util.concurrent.TimeUnit; import org.apache.cassandra.service.EmbeddedCassandraService; import org.apache.commons.io.IOUtils; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.modeshape.common.util.FileUtil; import org.modeshape.jcr.ClusteringHelper; import org.modeshape.jcr.value.BinaryKey; import org.modeshape.jcr.value.BinaryValue; /** * Test class for binary store using cassandra as backend. Before running this test start cassandra instance and uncomment test * cases. * * @author kulikov */ public class CassandraBinaryStoreTest { private static Exception exceptionDuringCassandraStart; private CassandraBinaryStore store; private BinaryValue aliveValue, unusedValue; @BeforeClass public static void setUpClass() throws Exception { FileUtil.delete("target/cassandra"); try { System.setProperty("cassandra.config", "cassandra/cassandra.yaml"); EmbeddedCassandraService cassandra = new EmbeddedCassandraService(); cassandra.start(); } catch (Exception e) { // catch any exception here, because otherwise the test rule would not get a chance to execute exceptionDuringCassandraStart = e; } } @Before public void setUp() throws Exception { if (exceptionDuringCassandraStart != null) { throw exceptionDuringCassandraStart; } store = new CassandraBinaryStore(ClusteringHelper.getLocalHost().getHostAddress()); store.start(); ByteArrayInputStream stream = new ByteArrayInputStream("Binary value".getBytes()); aliveValue = store.storeValue(stream, false); ByteArrayInputStream stream2 = new ByteArrayInputStream("Binary value".getBytes()); unusedValue = store.storeValue(stream2, false); } @Test public void shouldReadWriteMimeType() throws BinaryStoreException { store.storeMimeType(aliveValue, "text/plain"); assertEquals("text/plain", store.getStoredMimeType(aliveValue)); } @Test public void shouldReadWriteExtractedText() throws BinaryStoreException { store.storeExtractedText(aliveValue, "extracted text"); assertEquals("extracted text", store.getExtractedText(aliveValue)); } @Test public void shouldMarkUnused() throws Exception { Set<BinaryKey> unused = new HashSet<BinaryKey>(); unused.add(unusedValue.getKey()); store.markAsUnused(unused); Thread.sleep(1300); store.removeValuesUnusedLongerThan(1, TimeUnit.SECONDS); try { store.getInputStream(unusedValue.getKey()); fail("Unused binary not removed"); } catch (BinaryStoreException e) { //expected } } @Test public void shouldAccessStream() throws BinaryStoreException, IOException { InputStream stream = store.getInputStream(aliveValue.getKey()); assertTrue(stream != null); ByteArrayOutputStream bout = new ByteArrayOutputStream(); IOUtils.copy(stream, bout); String s = new String(bout.toByteArray()); assertEquals("Binary value", s); } @Test public void shoudlRemoveExpiredContent() throws Exception { Set<BinaryKey> unused = new HashSet<BinaryKey>(); unused.add(unusedValue.getKey()); store.markAsUnused(unused); Thread.sleep(500); store.removeValuesUnusedLongerThan(100, TimeUnit.MILLISECONDS); boolean res = true; try { store.getInputStream(unusedValue.getKey()); res = false; } catch (BinaryStoreException e) { } assertTrue(res); } }