/*
* $Id$
*
* Copyright 2009 Glencoe Software, Inc. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.services.repo.test;
import java.io.File;
import java.io.RandomAccessFile;
import java.util.UUID;
import ome.model.core.OriginalFile;
import ome.model.internal.Permissions;
import ome.services.blitz.fire.Registry;
import ome.services.blitz.repo.LegacyRepositoryI;
import ome.services.blitz.repo.PublicRepositoryI;
import ome.services.blitz.repo.RepositoryDaoImpl;
import ome.services.blitz.repo.path.FilePathRestrictionInstance;
import ome.services.util.Executor;
import ome.system.OmeroContext;
import ome.system.Principal;
import ome.system.ServiceFactory;
import ome.testing.MockServiceFactory;
import ome.util.checksum.ChecksumProviderFactory;
import omero.grid.InternalRepositoryPrx;
import omero.model.enums.ChecksumAlgorithmAdler32;
import org.jmock.Mock;
import org.jmock.core.Invocation;
import org.jmock.core.Stub;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
*
*/
@Test(groups = { "repo" })
public class LegacyRepositoryUnitTest extends AbstractRepoUnitTest {
Mock exMock;
Executor ex;
Mock oaMock;
Ice.ObjectAdapter oa;
Mock regMock;
Registry reg;
Mock mockCpf;
ChecksumProviderFactory cpf;
MockServiceFactory sf;
@BeforeMethod
protected void beforeMethod() throws Exception {
newTmpDir();
exMock = mock(Executor.class);
ex = (Executor) exMock.proxy();
oaMock = mock(Ice.ObjectAdapter.class);
oa = (Ice.ObjectAdapter) oaMock.proxy();
regMock = mock(Registry.class);
reg = (Registry) regMock.proxy();
mockCpf = mock(ChecksumProviderFactory.class);
cpf = (ChecksumProviderFactory) mockCpf.proxy();
sf = new MockServiceFactory();
sf.mockConfig.expects(atLeastOnce()).method("getDatabaseUuid").will(
returnValue("mockuuid"));
sf.mockQuery.expects(atLeastOnce()).method("findByString").will(
returnValue(file()));
sf.mockQuery.expects(atLeastOnce()).method("findByQuery");
sf.mockAdmin.expects(atLeastOnce()).method("moveToCommonSpace");
exMock.expects(atLeastOnce()).method("execute").will(
new ExecutorStub(sf));
exMock.expects(atLeastOnce()).method("getContext")
.will(returnValue(OmeroContext.getManagedServerContext()));
oaMock.expects(atLeastOnce()).method("find");
oaMock.expects(atLeastOnce()).method("createDirectProxy");
}
private LegacyRepositoryI mk() throws Exception {
return mk(reg);
}
private LegacyRepositoryI mk(Registry registry) throws Exception {
Principal p = new Principal("sessionUuid", "system", "Internal");
return new LegacyRepositoryI(oa, registry, ex, p, tmpRepo.getAbsolutePath(),
new PublicRepositoryI(new RepositoryDaoImpl(p, ex), cpf,
ChecksumAlgorithmAdler32.value,
FilePathRestrictionInstance.UNIX_REQUIRED.name));
}
private OriginalFile file() {
OriginalFile f = new OriginalFile(1L, true);
f.getDetails().setPermissions(Permissions.WORLD_IMMUTABLE);
f.setPath("foo");
f.setName("bar");
return f;
}
private void newRepoObject() {
sf.mockUpdate.expects(once()).method("saveAndReturnObject").will(
returnValue(file()));
}
private void addsRepoServices() {
oaMock.expects(atLeastOnce()).method("add").will(returnValue(null));
regMock.expects(atLeastOnce()).method("addObject");
oaMock.expects(once()).method("activate");
}
public void testRepoAlredyInitialized() throws Exception {
newRepoObject();
addsRepoServices();
final LegacyRepositoryI r1 = mk();
assertTrue(r1.takeover());
r1.close();
addsRepoServices();
final LegacyRepositoryI r2 = mk();
assertTrue(r2.takeover());
r2.close();
}
public void testNoTakeoverAfterClose() throws Exception {
newRepoObject();
addsRepoServices();
final LegacyRepositoryI r1 = mk();
assertTrue(r1.takeover());
r1.close();
assertFalse(r1.takeover());
assertFalse(r1.takeover());
assertFalse(r1.takeover());
}
public void testTakeoverOnlyOnce() throws Exception {
newRepoObject();
addsRepoServices();
LegacyRepositoryI r1 = mk();
assertTrue(r1.takeover());
assertFalse(r1.takeover());
}
public void testLocking() throws Exception {
newRepoObject();
addsRepoServices();
final LegacyRepositoryI r1 = mk();
final LegacyRepositoryI r2 = mk();
assertTrue(r1.takeover());
class ShouldHang extends Thread {
boolean tookOver = false;
@Override
public void run() {
r2.takeover();
tookOver = true;
}
}
ShouldHang t = new ShouldHang();
t.join(2000);
assertFalse(t.tookOver);
}
public void testRaf() throws Exception {
RandomAccessFile raf;
String test;
String uuid = UUID.randomUUID().toString();
File blank = new File(tmpRepo, "blank.raf");
File existing = new File(tmpRepo, "existing.raf");
// Test blank RAF
raf = new RandomAccessFile(blank, "rw");
try {
test = raf.readUTF();
fail("EOF");
} catch (java.io.EOFException eof) {
// ok
}
// Test existing RAF
raf = new RandomAccessFile(existing, "rw");
raf.writeUTF(uuid);
raf.close();
raf = new RandomAccessFile(existing, "rw");
test = raf.readUTF();
assertEquals(uuid, test);
}
public void testTakeoverNoRepositoryPrx() throws Exception {
newRepoObject();
addsRepoServices();
InternalRepositoryPrx[] repos = {};
regMock.expects(atLeastOnce()).method("lookupRepositories")
.will(returnValue(repos));
final LegacyRepositoryI r1 = mk(reg);
assertTrue(r1.takeover());
}
class ExecutorStub implements Stub {
ServiceFactory sf;
public ExecutorStub(ServiceFactory sf) {
this.sf = sf;
}
public Object invoke(Invocation arg0) throws Throwable {
Principal p = (Principal) arg0.parameterValues.get(0);
Executor.SimpleWork work = (Executor.SimpleWork) arg0.parameterValues
.get(1);
return work.doWork(null, this.sf);
}
public StringBuffer describeTo(StringBuffer arg0) {
arg0.append("calls execute");
return arg0;
}
}
}