/* * 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); } } }