blob: 97e663c35e0eb97ff7fe63e43c19505d8eb72de8 [file] [log] [blame]
/*
* Copyright (c) 2012, 2013 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.tests.bugzilla;
import org.eclipse.emf.cdo.admin.CDOAdminClient;
import org.eclipse.emf.cdo.admin.CDOAdminClientUtil;
import org.eclipse.emf.cdo.common.CDOCommonRepository.State;
import org.eclipse.emf.cdo.common.CDOCommonRepository.Type;
import org.eclipse.emf.cdo.common.admin.CDOAdmin;
import org.eclipse.emf.cdo.common.admin.CDOAdminRepository;
import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.common.util.RepositoryStateChangedEvent;
import org.eclipse.emf.cdo.common.util.RepositoryTypeChangedEvent;
import org.eclipse.emf.cdo.server.IRepository;
import org.eclipse.emf.cdo.server.spi.admin.CDOAdminHandler;
import org.eclipse.emf.cdo.spi.server.InternalRepository;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.config.IRepositoryConfig.CallAddRepository;
import org.eclipse.emf.cdo.tests.config.ISessionConfig;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.CleanRepositoriesAfter;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.CleanRepositoriesBefore;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires;
import org.eclipse.emf.cdo.tests.config.impl.SessionConfig;
import org.eclipse.emf.cdo.tests.util.TestListener;
import org.eclipse.emf.cdo.tests.util.TestListener.EventAssertion;
import org.eclipse.net4j.connector.IConnector;
import org.eclipse.net4j.util.container.IContainerDelta;
import org.eclipse.net4j.util.container.IContainerEvent;
import org.eclipse.net4j.util.container.IManagedContainer;
import org.eclipse.net4j.util.factory.ProductCreationException;
import org.eclipse.net4j.util.io.IOUtil;
import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* Design a repository administration API
* <p>
* See bug 381472
*
* @author Eike Stepper
*/
@Requires(ISessionConfig.CAPABILITY_NET4J)
@CleanRepositoriesBefore(reason = "Repository and property counting")
@CleanRepositoriesAfter(reason = "Repository and property counting")
@CallAddRepository
public class Bugzilla_381472_Test extends AbstractCDOTest
{
private static final String ADMIN_HANDLER_TYPE = "test";
private CDOAdmin openAdmin(final Map<String, Object> expectedProperties) throws InterruptedException
{
getRepository();
IManagedContainer serverContainer = getServerContainer();
serverContainer.registerFactory(new CDOAdminHandler.Factory(ADMIN_HANDLER_TYPE)
{
@Override
public CDOAdminHandler create(String description) throws ProductCreationException
{
return new CDOAdminHandler()
{
public String getType()
{
return ADMIN_HANDLER_TYPE;
}
public IRepository createRepository(String name, Map<String, Object> properties)
{
assertEquals(expectedProperties, properties);
return getRepository(name);
}
public void deleteRepository(IRepository delegate)
{
// Do nothing
}
};
}
});
IManagedContainer clientContainer = getClientContainer();
SessionConfig.Net4j sessionConfig = (SessionConfig.Net4j)getSessionConfig();
IConnector connector = sessionConfig.getConnector();
String url = connector.getURL();
final CDOAdminClient admin = CDOAdminClientUtil.openAdmin(url, DEFAULT_TIMEOUT, clientContainer);
new PollingTimeOuter()
{
@Override
protected boolean successful()
{
return admin.isConnected();
}
}.assertNoTimeOut();
return admin;
}
private void cleanup(CDOAdmin admin)
{
IOUtil.closeSilent(admin);
}
public void testInitial() throws Exception
{
CDOAdmin admin = openAdmin(null);
try
{
CDOAdminRepository[] repositories = admin.getRepositories();
assertEquals(1, repositories.length);
assertEquals(getRepository().getName(), repositories[0].getName());
}
finally
{
cleanup(admin);
}
}
public void testRepoAdded() throws Exception
{
CDOAdmin admin = openAdmin(null);
try
{
InternalRepository repo2 = getRepository("repo2");
admin.waitForRepository("repo2");
CDOAdminRepository[] repositories = admin.getRepositories();
assertEquals(2, repositories.length);
assertEquals(getRepository().getName(), repositories[0].getName());
assertEquals(repo2.getName(), repositories[1].getName());
}
finally
{
cleanup(admin);
}
}
public void testRepoAddedRemoved() throws Exception
{
final CDOAdmin admin = openAdmin(null);
try
{
InternalRepository repo2 = getRepository("repo2");
admin.waitForRepository("repo2");
CDOAdminRepository[] repositories = admin.getRepositories();
assertEquals(2, repositories.length);
assertEquals(getRepository().getName(), repositories[0].getName());
assertEquals(repo2.getName(), repositories[1].getName());
LifecycleUtil.deactivate(repo2);
new PollingTimeOuter()
{
@Override
protected boolean successful()
{
CDOAdminRepository[] repositories = admin.getRepositories();
if (repositories.length != 1)
{
return false;
}
assertEquals(getRepository().getName(), repositories[0].getName());
return true;
}
}.assertNoTimeOut();
}
finally
{
cleanup(admin);
}
}
public void testRepoAddedRemovedAdded() throws Exception
{
final CDOAdmin admin = openAdmin(null);
try
{
InternalRepository repo2 = getRepository("repo2");
admin.waitForRepository("repo2");
CDOAdminRepository[] repositories = admin.getRepositories();
assertEquals(2, repositories.length);
assertEquals(getRepository().getName(), repositories[0].getName());
assertEquals(repo2.getName(), repositories[1].getName());
LifecycleUtil.deactivate(repo2);
new PollingTimeOuter()
{
@Override
protected boolean successful()
{
CDOAdminRepository[] repositories = admin.getRepositories();
if (repositories.length != 1)
{
return false;
}
assertEquals(getRepository().getName(), repositories[0].getName());
return true;
}
}.assertNoTimeOut();
repo2 = getRepository("repo2");
admin.waitForRepository("repo2");
repositories = admin.getRepositories();
assertEquals(2, repositories.length);
assertEquals(getRepository().getName(), repositories[0].getName());
assertEquals(repo2.getName(), repositories[1].getName());
}
finally
{
cleanup(admin);
}
}
public void testRepoAddedRemovedAddedOther() throws Exception
{
final CDOAdmin admin = openAdmin(null);
try
{
InternalRepository repo2 = getRepository("repo2");
admin.waitForRepository("repo2");
CDOAdminRepository[] repositories = admin.getRepositories();
assertEquals(2, repositories.length);
assertEquals(getRepository().getName(), repositories[0].getName());
assertEquals(repo2.getName(), repositories[1].getName());
LifecycleUtil.deactivate(repo2);
new PollingTimeOuter()
{
@Override
protected boolean successful()
{
CDOAdminRepository[] repositories = admin.getRepositories();
if (repositories.length != 1)
{
return false;
}
assertEquals(getRepository().getName(), repositories[0].getName());
return true;
}
}.assertNoTimeOut();
InternalRepository repo3 = getRepository("repo3");
admin.waitForRepository("repo3");
repositories = admin.getRepositories();
assertEquals(2, repositories.length);
assertEquals(getRepository().getName(), repositories[0].getName());
assertEquals(repo3.getName(), repositories[1].getName());
}
finally
{
cleanup(admin);
}
}
public void testRepoAddedAdded() throws Exception
{
CDOAdmin admin = openAdmin(null);
try
{
InternalRepository repo2 = getRepository("repo2");
admin.waitForRepository("repo2");
CDOAdminRepository[] repositories = admin.getRepositories();
assertEquals(2, repositories.length);
assertEquals(getRepository().getName(), repositories[0].getName());
assertEquals(repo2.getName(), repositories[1].getName());
InternalRepository repo3 = getRepository("repo3");
admin.waitForRepository("repo3");
repositories = admin.getRepositories();
assertEquals(3, repositories.length);
assertEquals(getRepository().getName(), repositories[0].getName());
assertEquals(repo2.getName(), repositories[1].getName());
assertEquals(repo3.getName(), repositories[2].getName());
}
finally
{
cleanup(admin);
}
}
public void testRepoAddedEvent() throws Exception
{
CDOAdmin admin = openAdmin(null);
TestListener listener = new TestListener();
admin.addListener(listener);
try
{
getRepository("repo2");
admin.waitForRepository("repo2");
listener.assertEvent(IContainerEvent.class, new EventAssertion<IContainerEvent<CDOAdminRepository>>()
{
public void execute(IContainerEvent<CDOAdminRepository> event)
{
assertEquals(IContainerDelta.Kind.ADDED, event.getDeltaKind());
assertEquals("repo2", event.getDeltaElement().getName());
}
});
}
finally
{
cleanup(admin);
}
}
public void testRepoRemovedEvent() throws Exception
{
final CDOAdmin admin = openAdmin(null);
TestListener listener = new TestListener();
admin.addListener(listener);
try
{
InternalRepository repo1 = getRepository();
LifecycleUtil.deactivate(repo1);
new PollingTimeOuter()
{
@Override
protected boolean successful()
{
CDOAdminRepository[] repositories = admin.getRepositories();
return repositories.length == 0;
}
}.assertNoTimeOut();
listener.assertEvent(IContainerEvent.class, new EventAssertion<IContainerEvent<CDOAdminRepository>>()
{
public void execute(IContainerEvent<CDOAdminRepository> event)
{
assertEquals(IContainerDelta.Kind.REMOVED, event.getDeltaKind());
assertEquals("repo1", event.getDeltaElement().getName());
}
});
}
finally
{
cleanup(admin);
}
}
public void testRepoTypeChangedEvent() throws Exception
{
CDOAdmin admin = openAdmin(null);
try
{
CDOAdminRepository repo1 = admin.getRepository("repo1");
TestListener listener = new TestListener();
repo1.addListener(listener);
getRepository().setType(Type.BACKUP);
listener.assertEvent(RepositoryTypeChangedEvent.class, new EventAssertion<RepositoryTypeChangedEvent>()
{
public void execute(RepositoryTypeChangedEvent event)
{
assertEquals(Type.MASTER, event.getOldType());
assertEquals(Type.BACKUP, event.getNewType());
}
});
}
finally
{
cleanup(admin);
}
}
public void testRepoStateChangedEvent() throws Exception
{
CDOAdmin admin = openAdmin(null);
try
{
CDOAdminRepository repo1 = admin.getRepository("repo1");
final TestListener listener = new TestListener();
repo1.addListener(listener);
getRepository().setState(State.OFFLINE);
listener.assertEvent(RepositoryStateChangedEvent.class, new EventAssertion<RepositoryStateChangedEvent>()
{
public void execute(RepositoryStateChangedEvent event)
{
assertEquals(State.ONLINE, event.getOldState());
assertEquals(State.OFFLINE, event.getNewState());
}
});
}
finally
{
cleanup(admin);
}
}
public void testCreateRepo() throws Exception
{
CDOAdmin admin = openAdmin(null);
TestListener listener = new TestListener();
admin.addListener(listener);
try
{
CDOAdminRepository repo2 = admin.createRepository("repo2", ADMIN_HANDLER_TYPE, null);
assertEquals("repo2", repo2.getName());
CDOAdminRepository[] repositories = admin.getRepositories();
assertEquals(2, repositories.length);
assertEquals(getRepository().getName(), repositories[0].getName());
assertEquals(repo2.getName(), repositories[1].getName());
listener.assertEvent(IContainerEvent.class, new EventAssertion<IContainerEvent<CDOAdminRepository>>()
{
public void execute(IContainerEvent<CDOAdminRepository> event)
{
assertEquals(IContainerDelta.Kind.ADDED, event.getDeltaKind());
assertEquals("repo2", event.getDeltaElement().getName());
}
});
}
finally
{
cleanup(admin);
}
}
public void testCreateRepoWithPropertiesEmpty() throws Exception
{
Map<String, Object> properties = Collections.emptyMap();
CDOAdmin admin = openAdmin(properties);
TestListener listener = new TestListener();
admin.addListener(listener);
try
{
CDOAdminRepository repo2 = admin.createRepository("repo2", ADMIN_HANDLER_TYPE, properties);
assertEquals("repo2", repo2.getName());
CDOAdminRepository[] repositories = admin.getRepositories();
assertEquals(2, repositories.length);
assertEquals(getRepository().getName(), repositories[0].getName());
assertEquals(repo2.getName(), repositories[1].getName());
listener.assertEvent(IContainerEvent.class, new EventAssertion<IContainerEvent<CDOAdminRepository>>()
{
public void execute(IContainerEvent<CDOAdminRepository> event)
{
assertEquals(IContainerDelta.Kind.ADDED, event.getDeltaKind());
assertEquals("repo2", event.getDeltaElement().getName());
}
});
}
finally
{
cleanup(admin);
}
}
public void testCreateRepoWithPropertiesPrimitive() throws Exception
{
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("key", 4711);
CDOAdmin admin = openAdmin(properties);
TestListener listener = new TestListener();
admin.addListener(listener);
try
{
CDOAdminRepository repo2 = admin.createRepository("repo2", ADMIN_HANDLER_TYPE, properties);
assertEquals("repo2", repo2.getName());
CDOAdminRepository[] repositories = admin.getRepositories();
assertEquals(2, repositories.length);
assertEquals(getRepository().getName(), repositories[0].getName());
assertEquals(repo2.getName(), repositories[1].getName());
listener.assertEvent(IContainerEvent.class, new EventAssertion<IContainerEvent<CDOAdminRepository>>()
{
public void execute(IContainerEvent<CDOAdminRepository> event)
{
assertEquals(IContainerDelta.Kind.ADDED, event.getDeltaKind());
assertEquals("repo2", event.getDeltaElement().getName());
}
});
}
finally
{
cleanup(admin);
}
}
public void testCreateRepoWithPropertiesCDOID() throws Exception
{
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("key", CDOIDUtil.createLong(4711));
CDOAdmin admin = openAdmin(properties);
TestListener listener = new TestListener();
admin.addListener(listener);
try
{
CDOAdminRepository repo2 = admin.createRepository("repo2", ADMIN_HANDLER_TYPE, properties);
assertEquals("repo2", repo2.getName());
CDOAdminRepository[] repositories = admin.getRepositories();
assertEquals(2, repositories.length);
assertEquals(getRepository().getName(), repositories[0].getName());
assertEquals(repo2.getName(), repositories[1].getName());
listener.assertEvent(IContainerEvent.class, new EventAssertion<IContainerEvent<CDOAdminRepository>>()
{
public void execute(IContainerEvent<CDOAdminRepository> event)
{
assertEquals(IContainerDelta.Kind.ADDED, event.getDeltaKind());
assertEquals("repo2", event.getDeltaElement().getName());
}
});
}
finally
{
cleanup(admin);
}
}
public void testCreateRepoWrongHandlerType() throws Exception
{
CDOAdmin admin = openAdmin(null);
try
{
admin.createRepository("repo2", "WRONG", null);
fail("Exception expected");
}
catch (Exception expected)
{
// Success
}
finally
{
cleanup(admin);
}
}
public void testDeleteRepo() throws Exception
{
CDOAdmin admin = openAdmin(null);
TestListener listener = new TestListener();
admin.addListener(listener);
try
{
CDOAdminRepository repo1 = admin.getRepository("repo1");
repo1.delete(ADMIN_HANDLER_TYPE);
assertEquals(null, admin.getRepository("repo1"));
listener.assertEvent(IContainerEvent.class, new EventAssertion<IContainerEvent<CDOAdminRepository>>()
{
public void execute(IContainerEvent<CDOAdminRepository> event)
{
assertEquals(IContainerDelta.Kind.REMOVED, event.getDeltaKind());
assertEquals("repo1", event.getDeltaElement().getName());
}
});
}
finally
{
cleanup(admin);
}
}
public void testDeleteRepoWrongHandlerType() throws Exception
{
CDOAdmin admin = openAdmin(null);
try
{
CDOAdminRepository repo1 = admin.getRepository("repo1");
repo1.delete("WRONG");
fail("Exception expected");
}
catch (Exception expected)
{
// Success
}
finally
{
cleanup(admin);
}
}
}