blob: b792188389faa254925d001251d0a0706fa794aa [file] [log] [blame]
/**
* Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
* 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:
* Florian Pirchner - Initial implementation
*/
package org.eclipse.osbp.xtext.builder.participant.dmodelsample.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.knowhowlab.osgi.testing.assertions.OSGiAssert.setDefaultBundleContext;
import static org.knowhowlab.osgi.testing.assertions.ServiceAssert.assertServiceUnavailable;
import static org.knowhowlab.osgi.testing.utils.BundleUtils.findBundle;
import static org.knowhowlab.osgi.testing.utils.ServiceUtils.getService;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.XtextPackage;
import org.eclipse.xtext.example.domainmodel.domainmodel.DomainmodelPackage;
import org.eclipse.xtext.example.domainmodel.domainmodel.Entity;
import org.junit.Before;
import org.junit.Test;
import org.eclipse.osbp.xtext.builder.metadata.services.IMetadataBuilderService;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;
public class DomainModelBuilderParticipantTests {
private static final String ENTITY_NAME = "Simple";
private static final String ENTITY = "org.my.tests.Simple";
private static final int TIME_500 = 500;
private static final int TIME_1000 = 1000;
private static final int TIME_2000 = 2000;
private static final int TIME_2500 = 2500;
private Bundle builderBundle;
private Bundle participantBundle;
@Before
public void setup() throws BundleException {
setDefaultBundleContext(Activator.context);
participantBundle = findBundle(Activator.context,
"org.eclipse.osbp.xtext.builder.participant.dmodelsample");
participantBundle.stop();
// restart the metadata service
builderBundle = findBundle(Activator.context,
"org.eclipse.osbp.xtext.builder.metadata.services");
builderBundle.stop();
builderBundle.start();
getService(Activator.context, IMetadataBuilderService.class, TIME_2000);
}
@Test
public void testDeactivateService() throws Exception {
IMetadataBuilderService builderService = getService(Activator.context,
IMetadataBuilderService.class, TIME_1000);
assertNotNull(builderService);
participantBundle.start();
Thread.sleep(TIME_2000);
Entity entity = findEntity(builderService);
assertEquals(ENTITY_NAME, entity.getName());
builderBundle.stop();
Thread.sleep(TIME_500);
assertServiceUnavailable(IMetadataBuilderService.class);
builderBundle.start();
Thread.sleep(TIME_500);
builderService = getService(Activator.context,
IMetadataBuilderService.class, TIME_1000);
assertNotNull(builderService);
Entity entity2 = findEntity(builderService);
assertEquals(ENTITY_NAME, entity2.getName());
assertNotSame(entity, entity2);
// since the resource was unloaded, the entity loaded with old service
// is
// an EProxy now
InternalEObject iEntity = (InternalEObject) entity;
assertFalse(iEntity.eIsProxy());
assertNull(iEntity.eResource().getResourceSet());
assertNotNull(entity2.eResource().getResourceSet());
assertTrue(EcoreUtil.equals(entity, entity2));
}
private Entity findEntity(IMetadataBuilderService builderService) {
return (Entity) builderService.getMetadata(ENTITY,
DomainmodelPackage.Literals.ENTITY);
}
@Test
public void testCache() throws Exception {
IMetadataBuilderService builderService = getService(Activator.context,
IMetadataBuilderService.class, TIME_1000);
assertNotNull(builderService);
participantBundle.start();
Thread.sleep(TIME_2000);
Entity entity = findEntity(builderService);
assertEquals(ENTITY_NAME, entity.getName());
Entity entity2 = findEntity(builderService);
assertEquals(ENTITY_NAME, entity.getName());
InternalEObject iEntity = (InternalEObject) entity;
assertFalse(iEntity.eIsProxy());
assertNotNull(iEntity.eResource().getResourceSet());
assertNotNull(entity2.eResource().getResourceSet());
assertTrue(EcoreUtil.equals(entity, entity2));
assertSame(entity, entity2);
}
@Test
public void testStopParticipantBundle() throws Exception {
IMetadataBuilderService builderService = getService(Activator.context,
IMetadataBuilderService.class, TIME_1000);
assertNotNull(builderService);
participantBundle.stop();
Thread.sleep(TIME_2500);
builderService = getService(Activator.context,
IMetadataBuilderService.class, TIME_1000);
assertNotNull(builderService);
// access the entity by using the builder service directly
Entity entity = (Entity) builderService.getMetadata(ENTITY,
XtextPackage.Literals.GRAMMAR);
assertNull(entity);
participantBundle.start();
Thread.sleep(TIME_500);
entity = findEntity(builderService);
assertEquals(ENTITY_NAME, entity.getName());
// stop and start again
participantBundle.stop();
Thread.sleep(TIME_500);
participantBundle.start();
Thread.sleep(TIME_500);
Entity entity3 = findEntity(builderService);
assertNotNull(entity3);
assertEquals(ENTITY_NAME, entity3.getName());
// assert that the entity loaded before stopping the service has
// changed to an eProxy
InternalEObject iEntity = (InternalEObject) entity;
assertFalse(iEntity.eIsProxy());
assertNull(entity.eResource().getResourceSet());
assertNotNull(entity3.eResource().getResourceSet());
assertTrue(EcoreUtil.equals(entity, entity3));
assertNotSame(entity, entity3);
}
}