/*
* Copyright Terracotta, Inc.
*
* 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.ehcache.impl.persistence;
import org.ehcache.impl.serialization.TransientStateHolder;
import org.ehcache.spi.persistence.StateHolder;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.*;
/**
* FileBasedStateRepositoryTest
*/
public class FileBasedStateRepositoryTest {
private static String HOLDER_FILE_NAME = "holder-0-myHolder.bin";
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Test
public void testHolderSave() throws Exception {
File directory = folder.newFolder("testSave");
FileBasedStateRepository stateRepository = new FileBasedStateRepository(directory);
String holderName = "myHolder";
StateHolder<Long, String> myHolder = stateRepository.getPersistentStateHolder(holderName, Long.class, String.class);
myHolder.putIfAbsent(42L, "TheAnswer!");
stateRepository.close();
FileInputStream fis = new FileInputStream(new File(directory, HOLDER_FILE_NAME));
try {
ObjectInputStream ois = new ObjectInputStream(fis);
try {
String name = (String) ois.readObject();
assertThat(name, is(holderName));
FileBasedStateRepository.Tuple loadedTuple = (FileBasedStateRepository.Tuple) ois.readObject();
assertThat(loadedTuple.index, is(0));
@SuppressWarnings("unchecked")
StateHolder<Long, String> stateHolder = (StateHolder<Long, String>) loadedTuple.holder;
assertThat(stateHolder, is(myHolder));
} finally {
ois.close();
}
} finally {
fis.close();
}
}
@Test
public void testHolderLoad() throws Exception {
File directory = folder.newFolder("testLoad");
String holderName = "myHolder";
StateHolder<Long, String> map = new TransientStateHolder<Long, String>();
map.putIfAbsent(42L, "Again? That's not even funny anymore!!");
FileOutputStream fos = new FileOutputStream(new File(directory, HOLDER_FILE_NAME));
try {
ObjectOutputStream oos = new ObjectOutputStream(fos);
try {
oos.writeObject(holderName);
oos.writeObject(new FileBasedStateRepository.Tuple(0, map));
} finally {
oos.close();
}
} finally {
fos.close();
}
FileBasedStateRepository stateRepository = new FileBasedStateRepository(directory);
StateHolder<Long, String> myHolder = stateRepository.getPersistentStateHolder(holderName, Long.class, String.class);
assertThat(myHolder, is(map));
}
@Test
public void testIndexProperlySetAfterLoad() throws Exception {
File directory = folder.newFolder("testIndexAfterLoad");
String holderName = "myHolder";
FileOutputStream fos = new FileOutputStream(new File(directory, HOLDER_FILE_NAME));
try {
ObjectOutputStream oos = new ObjectOutputStream(fos);
try {
oos.writeObject(holderName);
oos.writeObject(new FileBasedStateRepository.Tuple(0, new TransientStateHolder<Long, String>()));
} finally {
oos.close();
}
} finally {
fos.close();
}
FileBasedStateRepository stateRepository = new FileBasedStateRepository(directory);
stateRepository.getPersistentStateHolder("otherHolder", Long.class, Long.class);
stateRepository.close();
File[] files = directory.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.contains("otherHolder") && name.contains("-1-");
}
});
assertThat(files.length, is(1));
}
}