mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-06-30 18:15:39 +00:00
41454: ALF-15881: Disabling clustering in community 41500: ALF-15883: Move configuration files 41503: ALF-15884: Move cluster package to enterprise repository project 41504: ALF-15884: Move cluster package to enterprise repository project 41519: ALF-15886: References/definition for "hazelcastInstanceFactory" must be in enterprise repo only 41523: ALF-15886: References/definition for "hazelcastInstanceFactory" must be in enterprise repo only 41525: ALF-15886: References/definition for "hazelcastInstanceFactory" must be in enterprise repo only 41527: ALF-15886: References/definition for "hazelcastInstanceFactory" must be in enterprise repo only 41530: ALF-15886: remove import for class no longer in project. 41532: ALF-15887: LockStoreFactoryImpl must be separated into community and enterprise versions 41535: ALF-15883: Move configuration files 41561: ALF-15886: factory class to create key fileserver config beans. 41578: ALF-15888: separate transactional and shared cache bean definitions. 41623: ALF-15888: first pass at DefaultSimpleCache implementation. 41646: ALF-15888: move ehcache-default.xml 41651: ALF-15888: update javadoc to reflect changes 41762: ALF-15888: improve cache test to prove that null values are stored correctly. 41812: ALF-15888: added new cache provider for use by hibernate: DefaultCacheProvider. 41830: ALF-15888: make DefaultSimpleCache BeanNameAware to help with debugging etc. 41831: ALF-15888: missing file from commit - adds enterprise override capability for hibernate-cfg.properties 41850: ALF-15888: move tickets cache to cache-context.xml 41857: ALF-15888: make RemoteAlfrescoTicketServiceImpl cache implementation agnostic. 41866: ALF-15888: extract caches from fileservers and web-client and provide enterprise overrides 41881: ALF-15888: replace use of EhCacheAdapter with DefaultSimpleCache and SimpleCache interface. 41884: ALF-15888: added DefaultSimpleCache configuration to CachingContentStore sample XML. 41885: ALF-15888: move EhCacheAdapter to new package. 41886: ALF-15888: correct absolute class names in config for EhCacheAdapter. 41892: ALF-15888: fix CachingContentStore tests. 41897: ALF-15888: move CacheTest and config to new package. 41898: ALF-15888: remove redundant directory 41899: ALF-15889: move EhCacheManagerFactoryBean to new package. 41902: ALF-15889: moved EhCacheTracerJob to new package. 41913: ALF-15889: move InternalEhCacheManagerFactoryBean to new package. 41916: ALF-15889: move AlfrescoCacheManagerPeerProviderFactory to new package. 41937: ALF-15889: decouple TransactionalCache from EhCache 41966: ALF-15889: decouple RetryingTransactionHelper from ehcache. 41989: ALF-15889: added ContextListener test. 41996: ALF-15889: moved cache test to its own class. 41998: ALF-15889: move ehcache jars. 41999: ALF-15889: modify .classpath to reflect jar moves. 42037: ALF-15889: update poms to reflect lib moves. 42038: ALF-15889: add eclipse library reference to enterprise projects. 42093: ALF-15916: moved core properties to enterprise 42114: ALF-15888: externalized cache sizes to repository.properties. 42127: ALF-16136: move re-indexing configuration 42140: ALF-16136: move cluster check property. 42186: ALF-15889: removing seemingly redundant test config file. 42187: ALF-15888: tidy up config changes. 42189: ALF-15888: cleanup config 42190: ALF-15888: config cleanup 42191: ALF-15888: config cleanup 42198: ALF-16136: restored lost property git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@42210 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
272 lines
9.5 KiB
Java
272 lines
9.5 KiB
Java
/*
|
|
* Copyright (C) 2005-2010 Alfresco Software Limited.
|
|
*
|
|
* This file is part of Alfresco
|
|
*
|
|
* Alfresco is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Alfresco is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
package org.alfresco;
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
import org.alfresco.model.ContentModel;
|
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
|
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
|
import org.alfresco.service.ServiceRegistry;
|
|
import org.alfresco.service.cmr.repository.NodeRef;
|
|
import org.alfresco.service.cmr.repository.NodeService;
|
|
import org.alfresco.service.cmr.repository.StoreRef;
|
|
import org.alfresco.service.transaction.TransactionService;
|
|
import org.alfresco.util.ApplicationContextHelper;
|
|
import org.alfresco.util.BaseApplicationContextHelper;
|
|
import org.springframework.context.ApplicationContext;
|
|
import org.springframework.context.support.AbstractApplicationContext;
|
|
|
|
import junit.framework.TestCase;
|
|
|
|
/**
|
|
* A unit test that verifies it's possible to start up the main
|
|
* Alfresco context, stop it, start a different context,
|
|
* stop that, and finally return to the main context.
|
|
* To do a basic check of if the repository works, use
|
|
* {@link RepositoryStartupTest}.
|
|
* This test allows you to verify that your context
|
|
* is able to shut down cleanly, as well as that the
|
|
* minimal context is able to do the same.
|
|
*
|
|
* As this test opens and closes lots of contexts,
|
|
* it is rather slow....
|
|
*
|
|
* @author Nick Burch
|
|
*/
|
|
public class RepositoryStartStopTest extends TestCase
|
|
{
|
|
private ServiceRegistry serviceRegistry;
|
|
private TransactionService transactionService;
|
|
private boolean writeTestWorked;
|
|
|
|
public void setUp() throws Exception
|
|
{
|
|
// Ensure there's nothing kicking about
|
|
ApplicationContextHelper.closeApplicationContext();
|
|
}
|
|
|
|
public void tearDown() throws Exception
|
|
{
|
|
AuthenticationUtil.clearCurrentSecurityContext();
|
|
}
|
|
|
|
/**
|
|
* Checks that the ApplicationContext cache on the
|
|
* ApplicationContextHelper is empty
|
|
*/
|
|
public static void assertNoCachedApplicationContext() throws Exception {
|
|
Field instanceF = BaseApplicationContextHelper.class.getDeclaredField("instance");
|
|
instanceF.setAccessible(true);
|
|
assertNull(
|
|
"Instance cache on ApplicationContextHelper was populated instead of empty",
|
|
instanceF.get(null)
|
|
);
|
|
}
|
|
|
|
private ApplicationContext getMinimalContext() {
|
|
ApplicationContextHelper.setUseLazyLoading(false);
|
|
ApplicationContextHelper.setNoAutoStart(true);
|
|
return ApplicationContextHelper.getApplicationContext(
|
|
new String[] { "classpath:alfresco/minimal-context.xml" }
|
|
);
|
|
}
|
|
private ApplicationContext getFullContext() {
|
|
ApplicationContextHelper.setUseLazyLoading(false);
|
|
ApplicationContextHelper.setNoAutoStart(false);
|
|
return ApplicationContextHelper.getApplicationContext(
|
|
new String[] { "classpath:alfresco/application-context.xml" }
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Tests that we can open a context, use
|
|
* it, and then close it again without error
|
|
*/
|
|
public void testOpenClose() throws Exception
|
|
{
|
|
assertNoCachedApplicationContext();
|
|
|
|
ApplicationContext ctx = getMinimalContext();
|
|
|
|
assertNotNull(ctx);
|
|
doTestBasicWriteOperations(ctx);
|
|
|
|
ApplicationContextHelper.closeApplicationContext();
|
|
|
|
assertNoCachedApplicationContext();
|
|
}
|
|
|
|
/**
|
|
* Using a minimal no-autostart context:
|
|
* Test that we can bring up and close down
|
|
* a context twice without error, using it
|
|
* when running.
|
|
*/
|
|
public void testOpenCloseOpenCloseNoAutostart() throws Exception
|
|
{
|
|
assertNoCachedApplicationContext();
|
|
|
|
// Open it, and use it
|
|
ApplicationContext ctx = getMinimalContext();
|
|
assertNotNull(ctx);
|
|
doTestBasicWriteOperations(ctx);
|
|
|
|
// Close it down
|
|
ApplicationContextHelper.closeApplicationContext();
|
|
assertNoCachedApplicationContext();
|
|
|
|
// Re-open it, we get a fresh copy
|
|
ApplicationContext ctx2 = getMinimalContext();
|
|
assertNotNull(ctx2);
|
|
doTestBasicWriteOperations(ctx2);
|
|
assertNotSame(ctx, ctx2);
|
|
|
|
// Ask for it again, will be no change this time
|
|
ctx = getMinimalContext();
|
|
assertEquals(ctx, ctx2);
|
|
|
|
// And finally close it
|
|
ApplicationContextHelper.closeApplicationContext();
|
|
assertNoCachedApplicationContext();
|
|
}
|
|
|
|
/**
|
|
* Using a full autostarting context:
|
|
* Test that we can bring up and close down
|
|
* a context twice without error, using it
|
|
* when running.
|
|
*/
|
|
public void testOpenCloseOpenCloseFull() throws Exception
|
|
{
|
|
assertNoCachedApplicationContext();
|
|
|
|
// Open it, and use it
|
|
ApplicationContext ctx = getFullContext();
|
|
assertNotNull(ctx);
|
|
doTestBasicWriteOperations(ctx);
|
|
|
|
// Close it down
|
|
ApplicationContextHelper.closeApplicationContext();
|
|
assertNoCachedApplicationContext();
|
|
|
|
// Re-open it, we get a fresh copy
|
|
ApplicationContext ctx2 = getFullContext();
|
|
assertNotNull(ctx2);
|
|
doTestBasicWriteOperations(ctx2);
|
|
|
|
// Ask for it again, will be no change this time
|
|
ctx = getFullContext();
|
|
assertEquals(ctx, ctx2);
|
|
|
|
// Refresh it, shouldn't break anything
|
|
((AbstractApplicationContext)ctx).refresh();
|
|
|
|
// And finally close it
|
|
ApplicationContextHelper.closeApplicationContext();
|
|
assertNoCachedApplicationContext();
|
|
}
|
|
|
|
/**
|
|
* Tests that we can open a context, use it,
|
|
* close it, and open a different one.
|
|
* Does this by opening and closing contexts
|
|
* 4 different times, sometimes full ones,
|
|
* sometimes minimal ones with no autostart.
|
|
*/
|
|
public void testOpenCloseRepeatedly() throws Exception {
|
|
assertNoCachedApplicationContext();
|
|
|
|
// Open the minimal one and test
|
|
ApplicationContext ctx = getMinimalContext();
|
|
assertNotNull(ctx);
|
|
doTestBasicWriteOperations(ctx);
|
|
|
|
// Close
|
|
ApplicationContextHelper.closeApplicationContext();
|
|
assertNoCachedApplicationContext();
|
|
|
|
|
|
// Now open the full one
|
|
ctx = getFullContext();
|
|
assertNotNull(ctx);
|
|
doTestBasicWriteOperations(ctx);
|
|
|
|
// Ask for it again, will get the same thing
|
|
ApplicationContext ctxSav = ctx;
|
|
ctx = getFullContext();
|
|
assertEquals(ctx, ctxSav);
|
|
|
|
// Close it
|
|
ApplicationContextHelper.closeApplicationContext();
|
|
assertNoCachedApplicationContext();
|
|
|
|
|
|
// Back to the minimal one
|
|
ctx = getMinimalContext();
|
|
assertNotNull(ctx);
|
|
doTestBasicWriteOperations(ctx);
|
|
|
|
// Close
|
|
ApplicationContextHelper.closeApplicationContext();
|
|
assertNoCachedApplicationContext();
|
|
|
|
|
|
// And finally we want the full one again
|
|
ctx = getFullContext();
|
|
assertNotNull(ctx);
|
|
doTestBasicWriteOperations(ctx);
|
|
|
|
// Close and we're done
|
|
ApplicationContextHelper.closeApplicationContext();
|
|
assertNoCachedApplicationContext();
|
|
}
|
|
|
|
public void doTestBasicWriteOperations(ApplicationContext ctx) throws Exception
|
|
{
|
|
// Grab the beans we need
|
|
serviceRegistry = (ServiceRegistry) ctx.getBean(ServiceRegistry.SERVICE_REGISTRY);
|
|
transactionService = serviceRegistry.getTransactionService();
|
|
|
|
// So we can write test nodes
|
|
AuthenticationUtil.setRunAsUserSystem();
|
|
|
|
// Check it looks fine
|
|
assertFalse("The transaction is read-only - further unit tests are pointless.", transactionService.isReadOnly());
|
|
|
|
// A basic write operation on a node
|
|
RetryingTransactionCallback<Void> addPropertyCallback = new RetryingTransactionCallback<Void>()
|
|
{
|
|
public Void execute() throws Throwable
|
|
{
|
|
NodeService nodeService = serviceRegistry.getNodeService();
|
|
NodeRef rootNodeRef = nodeService.getRootNode(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
|
|
nodeService.setProperty(rootNodeRef, ContentModel.PROP_NAME, "SanityCheck");
|
|
writeTestWorked = true;
|
|
return null;
|
|
}
|
|
};
|
|
|
|
// Now do a write operation, and ensure it worked
|
|
writeTestWorked = false;
|
|
transactionService.getRetryingTransactionHelper().doInTransaction(addPropertyCallback, false, true);
|
|
assertTrue("The Node Write didn't occur or failed with an error", writeTestWorked);
|
|
}
|
|
}
|