/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/search/trunk/search-integration-test/src/test/org/sakaiproject/search/component/test/LoaderComponentIntegrationTest.java $ * $Id: LoaderComponentIntegrationTest.java 105078 2012-02-24 23:00:38Z ottenhoff@longsight.com $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.search.component.test; import java.io.File; import java.io.FileInputStream; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.PropertyResourceBundle; import junit.extensions.TestSetup; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.catalina.loader.WebappClassLoader; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.authz.api.AuthzGroupService; import org.sakaiproject.authz.api.SecurityService; import org.sakaiproject.component.api.ComponentManager; import org.sakaiproject.component.impl.SpringCompMgr; import org.sakaiproject.search.api.SearchIndexBuilder; import org.sakaiproject.search.api.SearchService; import org.sakaiproject.site.api.Group; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.api.SiteService; import org.sakaiproject.tool.api.Session; import org.sakaiproject.tool.cover.SessionManager; import org.sakaiproject.user.api.UserDirectoryService; import org.sakaiproject.user.api.UserEdit; /** * @author ieb */ public class LoaderComponentIntegrationTest extends TestCase { private static Log logger = LogFactory .getLog(LoaderComponentIntegrationTest.class); private SiteService siteService; private Site site; private Group group1; private Site targetSite; private Group group2; private UserDirectoryService userDirService; private SecurityService securityService = null; private AuthzGroupService authzGroupService = null; private SearchService searchService = null; private SearchIndexBuilder searchIndexBuilder = null; // Constants private static final String GROUP1_TITLE = "group1"; private static final String GROUP2_TITLE = "group2"; private static final String loaderDirectory = "/Users/ieb/Caret/testdataset"; public static Test suite() { TestSetup setup = new TestSetup(new TestSuite( LoaderComponentIntegrationTest.class)) { protected void setUp() throws Exception { oneTimeSetup(); } }; return setup; } /** * Setup test fixture (runs once for each test method called) */ public void setUp() throws Exception { // Get the services we need for the tests siteService = (SiteService) getService(SiteService.class.getName()); userDirService = (UserDirectoryService) getService(UserDirectoryService.class.getName()); securityService = (SecurityService) getService(SecurityService.class.getName()); authzGroupService = (AuthzGroupService) getService(AuthzGroupService.class.getName()); searchService = (SearchService) getService(SearchService.class.getName()); searchIndexBuilder = (SearchIndexBuilder) getService(SearchIndexBuilder.class.getName()); assertNotNull( "Cant find site service as org.sakaiproject.service.legacy.authzGroup.AuthzGroupService ", authzGroupService); assertNotNull( "Cant find site service as org.sakaiproject.service.legacy.security.SecurityService ", securityService); assertNotNull( "Cant find site service as org.sakaiproject.service.legacy.site.SiteService ", siteService); assertNotNull( "Cant find User Directory service as org.sakaiproject.service.legacy.user.UserDirectoryService ", userDirService); assertNotNull( "Cant find Search Service as org.sakaiproject.search.api.SearchService ", searchService); assertNotNull( "Cant find Search Index Builder as org.sakaiproject.search.api.SearchIndexBuilder ", searchIndexBuilder); // Set username as admin setUser("admin"); tearDown(); userDirService.addUser("test.user.1", "test.user.1", "Jane", "Doe", "jd1@foo.com", "123", null, null); userDirService.addUser("test.user.2", "test.user.2", "Joe", "Schmoe", "js2@foo.com", "123", null, null); userDirService.addUser("test.ta.1", "test.ta.1", "TA", "Doe", "tajd1@foo.com", "123", null, null); // Create a site site = siteService.addSite(generateSiteId(), "course"); targetSite = siteService.addSite(generateSiteId(), "course"); // Create a group for SectionAwareness to, er, become aware of group1 = site.addGroup(); group1.setTitle(GROUP1_TITLE); // Save the group siteService.save(site); site.addMember("test.user.1", "Student", true, false); // Save the site and its new member siteService.save(site); site.addMember("test.ta.1", "TA", true, false); siteService.save(site); // Add a user to a group group1.addMember("test.user.1", "Student", true, false); group1.addMember("test.ta.1", "TA", true, false); group2 = targetSite.addGroup(); group2.setTitle(GROUP2_TITLE); // Save the group siteService.save(targetSite); targetSite.addMember("test.user.1", "Student", true, false); // Save the site and its new member siteService.save(targetSite); // Add a user to a group group2.addMember("test.user.1", "Student", true, false); logger.info("Site Ref " + site.getReference()); logger.info("Target Site ref " + targetSite.getReference()); logger.info("Group 1 ref " + group1.getReference()); logger.info("Group 2 ref " + group2.getReference()); } /** * Remove the newly created objects, so we can run more tests with a clean * slate. */ public void tearDown() throws Exception { setUser("admin"); try { // Remove the site (along with its groups) siteService.removeSite(site); } catch (Throwable t) { int x = 1; //ignore } try { // Remove the site (along with its groups) siteService.removeSite(targetSite); } catch (Throwable t) { int x = 1; //ignore } try { // Remove the users UserEdit user1 = userDirService.editUser("test.user.1"); userDirService.removeUser(user1); } catch (Throwable t) { // logger.info("Failed to remove user ",t); logger.info("Failed to remove user " + t.getMessage()); } try { UserEdit user2 = userDirService.editUser("test.user.2"); userDirService.removeUser(user2); } catch (Throwable t) { // logger.info("Failed to remove user ",t); logger.info("Failed to remove user " + t.getMessage()); } try { // Remove the users UserEdit user1 = userDirService.editUser("test.ta.1"); userDirService.removeUser(user1); } catch (Throwable t) { // logger.info("Failed to remove user ",t); logger.info("Failed to remove user " + t.getMessage()); } } public void testRefreshIndex() throws Exception { searchIndexBuilder.refreshIndex(); while (!searchIndexBuilder.isBuildQueueEmpty()) { Thread.sleep(5000); } searchIndexBuilder.destroy(); Thread.sleep(15000); } public void testRebuildIndex() throws Exception { searchIndexBuilder.rebuildIndex(); while (!searchIndexBuilder.isBuildQueueEmpty()) { Thread.sleep(5000); } searchIndexBuilder.destroy(); Thread.sleep(15000); } public void testRebuildIndexAndWait() throws Exception { searchIndexBuilder.refreshIndex(); searchIndexBuilder.rebuildIndex(); searchIndexBuilder.refreshIndex(); Thread.sleep(15000); while (!searchIndexBuilder.isBuildQueueEmpty()) { Thread.sleep(5000); } searchIndexBuilder.destroy(); Thread.sleep(15000); } // Stolen shamelessly from test-harness, since I want to run these test inside exlipse protected static ComponentManager compMgr; /** * Initialize the component manager once for all tests, and log in as admin. */ protected static void oneTimeSetup() throws Exception { if(compMgr == null) { // Find the sakai home dir String tomcatHome = getTomcatHome(); String sakaiHome = tomcatHome + File.separatorChar + "sakai" + File.separatorChar; String componentsDir = tomcatHome + "components/"; // Set the system properties needed by the sakai component manager System.setProperty("sakai.home", sakaiHome); System.setProperty(ComponentManager.SAKAI_COMPONENTS_ROOT_SYS_PROP, componentsDir); // Get a tomcat classloader logger.debug("Creating a tomcat classloader for component loading"); WebappClassLoader wcloader = new WebappClassLoader(Thread.currentThread().getContextClassLoader()); wcloader.start(); // Initialize spring component manager logger.debug("Loading component manager via tomcat's classloader"); Class clazz = wcloader.loadClass(SpringCompMgr.class.getName()); Constructor constructor = clazz.getConstructor(new Class[] {ComponentManager.class}); compMgr = (ComponentManager)constructor.newInstance(new Object[] {null}); Method initMethod = clazz.getMethod("init", new Class[0]); initMethod.invoke(compMgr, new Object[0]); } // Sign in as admin if(SessionManager.getCurrentSession() == null) { SessionManager.startSession(); Session session = SessionManager.getCurrentSession(); session.setUserId("admin"); } } /** * Close the component manager when the tests finish. */ public static void oneTimeTearDown() { if(compMgr != null) { compMgr.close(); } } /** * Fetches the "maven.tomcat.home" property from the maven build.properties * file located in the user's $HOME directory. * * @return * @throws Exception */ private static String getTomcatHome() throws Exception { String testTomcatHome = System.getProperty("test.tomcat.home"); if ( testTomcatHome != null && testTomcatHome.length() > 0 ) { return testTomcatHome; } else { String homeDir = System.getProperty("user.home"); File file = new File(homeDir + File.separatorChar + "build.properties"); FileInputStream fis = new FileInputStream(file); PropertyResourceBundle rb = new PropertyResourceBundle(fis); return rb.getString("maven.tomcat.home"); } } /** * Convenience method to get a service bean from the Sakai component manager. * * @param beanId The id of the service * * @return The service, or null if the ID is not registered */ public static final Object getService(String beanId) { return org.sakaiproject.component.cover.ComponentManager.get(beanId); } /** * Convenience method to set the current user in sakai. By default, the user * is admin. * * @param userUid The user to become */ public static final void setUser(String userUid) { Session session = SessionManager.getCurrentSession(); session.setUserId(userUid); } /** * Convenience method to create a somewhat unique site id for testing. Useful * in tests that need to create a site to run tests upon. * * @return A string suitable for using as a site id. */ protected String generateSiteId() { return "site-" + getClass().getName() + "-" + Math.floor(Math.random()*100000); } /** * Returns a dynamic proxy for a service interface. Useful for testing with * customized service implementations without needing to write custom stubs. * * @param clazz The service interface class * @param handler The invocation handler that defines how the dynamic proxy should behave * * @return The dynamic proxy to use as a collaborator */ public static final Object getServiceProxy(Class clazz, InvocationHandler handler) { return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[] {clazz}, handler); } }