/*
* Copyright (C) 2005-2011 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 .
*/
package org.alfresco.repo.site;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.PrintStream;
import java.util.Set;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.security.authentication.AuthenticationComponent;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.service.cmr.repository.DuplicateChildNodeNameException;
import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.AuthorityType;
import org.alfresco.service.cmr.security.MutableAuthenticationService;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.cmr.site.SiteVisibility;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.ApplicationContextHelper;
import org.alfresco.util.PropertyMap;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
/**
* Site service unit test that targets HUGE numbers of sites
*
* @author Alan Davis
*/
public class SiteServiceTestHuge
{
private enum Allocation
{
/**
* Allocate source (groups) to target (sites) on a round robin basis
* until all targets (sites) have been allocated a single source (group).
*
* Some source (groups) might have been allocated to more than one target
* (site) or none at all.
**/
ROUND_ROBIN_TO_TARGET,
/**
* Allocate source (users) to target (groups) on a round robin basis
* until all source (users) have been allocated a target (group).
*
* Some target (groups) might have been allocated to more than one source
* (user) or none at all.
**/
ROUND_ROBIN_FROM_SOURCE,
/**
* Allocate source (users) to target (groups) on a round robin basis
* until all source (users) AND all target (groups) have been allocated
* to at least one a target (group) or one source (user).
*
* If there are more target (groups) than source (users)
* then some source (users) will be in more than one target (group).
*
* If there are more source (users) than target (groups) then some
* target (groups) will contain more than one source (user).
**/
ROUND_ROBIN_BOTH,
/**
* Allocate all source (users) to each target (group).
* OR
* Allocate all source (users) to each target (site).
* OR
* Allocate all source (groups) to each target (site).
**/
ALL_TO_EACH,
/** No allocation **/
NONE
}
private enum OnFailure
{
GIVE_UP,
KEEP_GOING
}
// Standard numbers of users, groups and sites
private static final int NUM_USERS = 100;
private static final int NUM_GROUPS = 60;
private static int NUM_SITES = 60000;
private static final String ADMIN_USER = "admin";
// Max times in ms for various activities
private static final long SECOND = 1000;
private static final long FIVE_SECONDS = SECOND * 5;
private static final long MAX_CREATE_USER_MS = FIVE_SECONDS;
private static final long MAX_CREATE_GROUP_MS = FIVE_SECONDS;
private static final long MAX_CREATE_SITE_MS = FIVE_SECONDS;
private static final long MAX_DELETE_USER_MS = FIVE_SECONDS;
private static final long MAX_DELETE_GROUP_MS = FIVE_SECONDS;
private static final long MAX_DELETE_SITE_MS = FIVE_SECONDS;
private static final long MAX_USER_TO_GROUP_MS = FIVE_SECONDS;
private static final long MAX_USER_TO_SITE_MS = FIVE_SECONDS;
private static final long MAX_GROUP_TO_SITE_MS = FIVE_SECONDS;
// Used to save having to check if users, groups and sites exist if already created by this test.
private static int usersCreated = 0;
private static int groupsCreated = 0;
private static int sitesCreated = 0;
private static ApplicationContext ctx = ApplicationContextHelper.getApplicationContext();
private static TransactionService transactionService = (TransactionService)ctx.getBean("TransactionService");
private static AuthenticationComponent authenticationComponent = (AuthenticationComponent)ctx.getBean("authenticationComponent");
private static MutableAuthenticationService authenticationService = (MutableAuthenticationService)ctx.getBean("authenticationService");
private static PersonService personService = (PersonService)ctx.getBean("PersonService");
private static AuthorityService authorityService = (AuthorityService)ctx.getBean("AuthorityService");
private static SiteService siteService = (SiteService)ctx.getBean("SiteService"); // Big 'S'
private static String logFilename;
private static PrintStream log;
@BeforeClass
public static void setUpBeforeClass() throws Exception
{
logFilename = "sites.log";
}
@AfterClass
public static void tearDownClass()
{
if (log != null)
{
log.close();
}
}
@Before
public void setUp() throws Exception
{
authenticationComponent.setCurrentUser(AuthenticationUtil.getAdminUserName());
}
@After
public void tearDown() throws Exception
{
authenticationComponent.clearCurrentSecurityContext();
}
private void log(String msg) throws Exception
{
System.out.println(msg);
if (logFilename != null)
{
if (log == null)
{
log = new PrintStream(new File(logFilename));
}
log.println(msg);
}
}
// ------------------ main test helper methods --------------------
private void createAndAllocate(int userCount, int groupCount, int siteCount,
Allocation usersToGroups, Allocation usersToSites, Allocation groupsToSites)
throws Exception
{
createUsersGroupsAndSites(userCount, groupCount, siteCount);
allocateUsersToGroupsAndSites(userCount, groupCount, siteCount, usersToGroups,
usersToSites, groupsToSites);
}
private void createUsersGroupsAndSites(int userCount, int groupCount, int siteCount)
throws Exception
{
createUsers(userCount);
createGroups(groupCount);
createSites(siteCount, userCount, 0, OnFailure.GIVE_UP);
}
private void allocateUsersToGroupsAndSites(int userCount, int groupCount, int siteCount,
Allocation usersToGroups, Allocation usersToSites, Allocation groupsToSites)
throws Exception
{
if ((usersToGroups == Allocation.ALL_TO_EACH &&
usersToSites == Allocation.NONE &&
groupsToSites == Allocation.ROUND_ROBIN_TO_TARGET)
||
(usersToGroups == Allocation.NONE &&
usersToSites == Allocation.ALL_TO_EACH &&
groupsToSites == Allocation.NONE))
{
allocateUsersToGroups(userCount, groupCount, usersToGroups);
allocateUsersToSites(userCount, siteCount, usersToSites);
allocateGroupsToSites(groupCount, siteCount, groupsToSites, userCount, 0, OnFailure.GIVE_UP);
}
else
{
fail("Users are not able to see all sites or can see a site directly and via a group");
}
}
private void addMoreSites(int sitesToAdd, OnFailure onFailureAction) throws Exception
{
log("\n\n ADD "+sitesToAdd+" MORE SITES AND ADD A GROUP TO EACH");
Allocation groupsToSites = Allocation.ROUND_ROBIN_TO_TARGET;
int sitesAlreadyCreated = sitesCreated;
int siteCount = sitesAlreadyCreated + sitesToAdd;
long ms = System.currentTimeMillis();
createSites(siteCount, NUM_USERS, sitesAlreadyCreated, OnFailure.GIVE_UP);
allocateGroupsToSites(NUM_GROUPS, siteCount, groupsToSites, NUM_USERS, sitesAlreadyCreated, OnFailure.KEEP_GOING);
assertTime("Add more sites", sitesAlreadyCreated+1, sitesToAdd, ms, MAX_CREATE_SITE_MS+MAX_GROUP_TO_SITE_MS, onFailureAction, sitesToAdd);
}
private void assertTime(String what, int id1, int id2, long start, long max) throws Exception
{
assertTime(what, id1, id2, start, max, OnFailure.GIVE_UP, 1);
}
private void assertTime(String what, int id1, int id2, long start, long max, OnFailure onFailureAction, int blockSize) throws Exception
{
long ms = (System.currentTimeMillis() - start)/blockSize;
String msg = what+","+id1+(id2 > 0 ? ","+id2 : "")+","+ms+",ms"+((blockSize == 1) ? "" : " average for,"+blockSize);
log(msg);
if (ms > max && onFailureAction == OnFailure.GIVE_UP)
{
fail(msg+" is longer than "+max);
}
}
// ------------------ create N --------------------
// Creates users and removes extra ones
private void createUsers(int userCount) throws Exception
{
for (int userId=1; ; userId++)
{
String userName = getUserName(userId);
boolean exists = (userId <= usersCreated) || personService.personExists(userName);
if (userId <= userCount)
{
if (!exists)
{
long ms = System.currentTimeMillis();
createUser(userName);
assertTime("Create user", userId, -1, ms, MAX_CREATE_USER_MS);
}
}
else
{
if (!exists)
{
break;
}
long ms = System.currentTimeMillis();
deleteUser(userName);
assertTime("Delete user", userId, -1, ms, MAX_DELETE_USER_MS);
}
}
usersCreated = userCount;
}
// Creates groups and removes extra ones
private void createGroups(int groupCount) throws Exception
{
for (int groupId=1; ; groupId++)
{
String groupName = getGroupName(groupId);
String groupAuthorityName = authorityService.getName(AuthorityType.GROUP, groupName);
boolean exists = (groupId <= groupsCreated) || authorityService.authorityExists(groupAuthorityName);
if (groupId <= groupCount)
{
if (!exists)
{
long ms = System.currentTimeMillis();
createGroup(groupName);
assertTime("Create group", groupId, -1, ms, MAX_CREATE_GROUP_MS);
}
}
else
{
if (!exists)
{
break;
}
long ms = System.currentTimeMillis();
deleteGroup(groupName);
assertTime("Delete group", groupId, -1, ms, MAX_DELETE_GROUP_MS);
}
}
groupsCreated = groupCount;
}
// Creates sites and removes extra ones
private void createSites(int siteCount, int userCount, int sitesAlreadyCreated, OnFailure onFailureAction) throws Exception
{
for (int siteId=sitesAlreadyCreated+1; ; siteId++)
{
String siteName = getSiteName(siteId);
boolean exists = (siteId <= sitesCreated) || siteService.getSite(siteName) != null;
if (siteId <= siteCount)
{
if (!exists)
{
String siteOwnerUserName = getSiteOwnerUserName(siteId, userCount);
creatSite(siteId, siteOwnerUserName, onFailureAction);
}
}
else
{
if (!exists)
{
if (siteId >= siteCount + 1)
break;
}
else
{
long ms = System.currentTimeMillis();
deleteSite(siteName, null);
assertTime("Delete site", siteId, -1, ms, MAX_DELETE_SITE_MS);
}
}
}
sitesCreated = siteCount;
}
private void deleteSites(int fromSiteId, int toSiteId, OnFailure onFailureAction) throws Exception
{
log("\n\n TIDY UP: DELETE SITES "+fromSiteId+" TO "+toSiteId);
for (int siteId = fromSiteId; siteId <= toSiteId; siteId++)
{
try
{
deleteSite(siteId, null, onFailureAction);
}
catch (Exception e)
{
// move on
}
}
sitesCreated = fromSiteId-1;
}
// ------------------ create 1 --------------------
private void createUser(String userName) throws Exception
{
UserTransaction txn = transactionService.getUserTransaction();
try
{
txn.begin();
authenticationService.createAuthentication(userName, userName.toCharArray());
PropertyMap ppOne = new PropertyMap(4);
ppOne.put(ContentModel.PROP_USERNAME, userName);
ppOne.put(ContentModel.PROP_FIRSTNAME, userName.substring(0, userName.length()-4));
ppOne.put(ContentModel.PROP_LASTNAME, "user");
ppOne.put(ContentModel.PROP_EMAIL, userName + "@email.com");
ppOne.put(ContentModel.PROP_JOBTITLE, "jobTitle");
personService.createPerson(ppOne);
txn.commit();
}
catch (Exception e)
{
txn.rollback();
throw e;
}
}
private void createGroup(String groupName) throws Exception
{
UserTransaction txn = transactionService.getUserTransaction();
try
{
txn.begin();
authorityService.createAuthority(AuthorityType.GROUP, groupName);
txn.commit();
}
catch (Exception e)
{
txn.rollback();
throw e;
}
}
private void creatSite(int siteId, String doAsUser, OnFailure onFailureAction) throws Exception
{
String siteName = getSiteName(siteId);
long ms = System.currentTimeMillis();
creatSite(siteName, doAsUser);
assertTime("Create site", siteId, -1, ms, MAX_CREATE_SITE_MS, onFailureAction, 1);
}
private void creatSite(String siteName, String doAsUser) throws Exception
{
String currentUser = authenticationComponent.getCurrentUserName();
UserTransaction txn = transactionService.getUserTransaction();
try
{
if (doAsUser != null)
authenticationComponent.setCurrentUser(doAsUser);
txn.begin();
if (siteService.getSite(siteName) == null)
{
String sitePreset = "site-dashboard";
siteService.createSite(sitePreset, siteName, "Title for " + siteName, "Description for "
+ siteName, SiteVisibility.PUBLIC);
// TODO Should do the following rather than the createContainers - not sure how
// Map tokens = new HashMap();
// tokens.put("siteid", siteName);
// presetsManager.constructPreset(tokens, tokens);
siteService.createContainer(siteName, "documentLibrary", ContentModel.TYPE_FOLDER, null);
siteService.createContainer(siteName, "links", ContentModel.TYPE_FOLDER, null);
}
txn.commit();
}
catch (Exception e)
{
try
{
txn.rollback();
}
catch (Exception e2)
{
}
throw e;
}
finally
{
authenticationComponent.setCurrentUser(currentUser);
}
}
// ------------------ delete 1 --------------------
private void deleteUser(String userName) throws Exception
{
UserTransaction txn = transactionService.getUserTransaction();
try
{
txn.begin();
personService.deletePerson(userName);
txn.commit();
}
catch (Exception e)
{
txn.rollback();
throw e;
}
}
private void deleteGroup(String groupName) throws Exception
{
UserTransaction txn = transactionService.getUserTransaction();
try
{
txn.begin();
String groupAuthorityName = authorityService.getName(AuthorityType.GROUP, groupName);
authorityService.deleteAuthority(groupAuthorityName, true);
txn.commit();
}
catch (Exception e)
{
txn.rollback();
throw e;
}
}
private void deleteSite(int siteId, String doAsUser, OnFailure onFailureAction) throws Exception
{
String siteName = getSiteName(siteId);
long ms = System.currentTimeMillis();
deleteSite(siteName, doAsUser);
assertTime("Delete site", siteId, -1, ms, MAX_DELETE_SITE_MS, onFailureAction, 1);
}
private void deleteSite(String siteName, String doAsUser) throws Exception
{
String currentUser = authenticationComponent.getCurrentUserName();
UserTransaction txn = transactionService.getUserTransaction();
try
{
if (doAsUser != null)
authenticationComponent.setCurrentUser(doAsUser);
txn.begin();
siteService.deleteSite(siteName);
txn.commit();
}
catch (Exception e)
{
try
{
txn.rollback();
}
catch (Exception e2)
{
}
throw e;
}
finally
{
authenticationComponent.setCurrentUser(currentUser);
}
}
// ------------------ allocate N --------------------
private void allocateUsersToGroups(int userCount, int groupCount, Allocation allocation)
throws Exception
{
if (allocation == Allocation.ALL_TO_EACH)
{
for (int userId = 1; userId <= userCount; userId++)
{
UserTransaction txn = transactionService.getUserTransaction();
try
{
txn.begin();
Set existingAuthorities = authorityService.getContainingAuthoritiesInZone(AuthorityType.GROUP,
getUserName(userId), AuthorityService.ZONE_APP_DEFAULT, null, -1);
for (int groupId = 1; groupId <= groupCount; groupId++)
{
if (!existingAuthorities.contains(authorityService.getName(AuthorityType.GROUP,
getGroupName(groupId))))
{
allocateUserToGroup(userId, groupId);
}
}
txn.commit();
}
catch (Exception e)
{
txn.rollback();
throw e;
}
}
}
else
{
int iterations, groupIncrement;
if (allocation == Allocation.ROUND_ROBIN_FROM_SOURCE)
{
iterations = userCount;
groupIncrement = 1;
}
else
{
iterations = groupCount;
groupIncrement = userCount;
}
int i=0;
OUTER: while (i < iterations)
{
for (int userId = 1; userId <= userCount; userId++)
{
UserTransaction txn = transactionService.getUserTransaction();
try
{
txn.begin();
Set existingAuthorities = authorityService.getContainingAuthoritiesInZone(AuthorityType.GROUP,
getUserName(userId), AuthorityService.ZONE_APP_DEFAULT, null, -1);
for (int groupId = userId; groupId <= groupCount; groupId += groupIncrement)
{
if (!existingAuthorities.contains(authorityService.getName(AuthorityType.GROUP,
getGroupName(groupId))))
{
allocateUserToGroup(userId, groupId);
}
if (++i >= iterations)
{
txn.commit();
break OUTER;
}
}
txn.commit();
}
catch (Exception e)
{
txn.rollback();
throw e;
}
}
}
}
}
private void allocateUsersToSites(int userCount, int siteCount, Allocation allocation)
throws Exception
{
if (allocation == Allocation.ALL_TO_EACH)
{
for (int userId = 1; userId <= userCount; userId++)
{
for (int siteId = 1; siteId <= siteCount; siteId++)
{
allocateUserToSite(userId, siteId, userCount);
}
}
}
else if (allocation == Allocation.ROUND_ROBIN_TO_TARGET)
{
boolean sourceEnd = (allocation == Allocation.ROUND_ROBIN_TO_TARGET);
boolean targetEnd = (allocation == Allocation.ROUND_ROBIN_FROM_SOURCE);
for (int siteId = 1, userId = 1; ; siteId++, userId++)
{
if (userId > userCount)
{
if (targetEnd)
break;
sourceEnd = true;
userId = 1;
}
if (siteId > siteCount)
{
if (sourceEnd)
break;
targetEnd = true;
siteId = 1;
}
allocateUserToSite(userId, siteId, userCount);
}
}
}
private void allocateGroupsToSites(int groupCount, int siteCount, Allocation allocation, int userCount,
int sitesAlreadyCreated, OnFailure onFailureAction) throws Exception
{
if (allocation == Allocation.ALL_TO_EACH)
{
for (int groupId = 1; groupId <= groupCount; groupId++)
{
for (int siteId = sitesAlreadyCreated+1; siteId <= siteCount; siteId++)
{
String doAsUser = getSiteOwnerUserName(siteId, userCount);
allocateGroupToSite(groupId, siteId, userCount, doAsUser, onFailureAction);
}
}
}
else if (allocation == Allocation.ROUND_ROBIN_TO_TARGET)
{
boolean sourceEnd = (allocation == Allocation.ROUND_ROBIN_TO_TARGET);
boolean targetEnd = (allocation == Allocation.ROUND_ROBIN_FROM_SOURCE);
int startGroupId = sitesAlreadyCreated % groupCount + 1;
for (int siteId = sitesAlreadyCreated+1, groupId = startGroupId; ; siteId++, groupId++)
{
if (groupId > groupCount)
{
if (targetEnd)
break;
sourceEnd = true;
groupId = 1;
}
if (siteId > siteCount)
{
if (sourceEnd)
break;
targetEnd = true;
siteId = 1;
}
String doAsUser = getSiteOwnerUserName(siteId, userCount);
allocateGroupToSite(groupId, siteId, userCount, doAsUser, onFailureAction);
}
}
}
private void allocateUserToGroup(int userId, int groupId) throws Exception
{
String userName = getUserName(userId);
String groupName = getGroupName(groupId);
long ms = System.currentTimeMillis();
allocateUserToGroup(userName, groupName);
assertTime("Adding a user to a group", userId, groupId, ms, MAX_USER_TO_GROUP_MS);
}
private void allocateUserToSite(int userId, int siteId, int userCount) throws Exception
{
try
{
String userName = getUserName(userId);
String siteName = getSiteName(siteId);
String siteOwnerUserName = getSiteOwnerUserName(siteId, userCount);
long ms = System.currentTimeMillis();
allocateUserToSite(userName, siteName, siteOwnerUserName);
assertTime("Adding a user to a site", userId, siteId, ms, MAX_USER_TO_SITE_MS);
}
catch (DuplicateChildNodeNameException e)
{
// Already allocated.
}
}
private int getNextSiteToAddGroupTo(int firstSiteIdToCheck) throws Exception
{
String userName = getUserName(1);
Set existingAuthorities = authorityService.getAuthoritiesForUser(userName);
int siteId = firstSiteIdToCheck;
for (; siteId <= NUM_SITES; siteId++)
{
String siteName = getSiteName(siteId);
String groupName = "GROUP_site_"+siteName;
if (!existingAuthorities.contains(groupName))
{
break;
}
}
log("Next site to add group to is "+siteId);
return siteId;
}
private void allocateGroupToSite(int firstSiteId, int userCount, String doAsUser, OnFailure onFailureAction, int blockSize) throws Exception
{
String currentUser = authenticationComponent.getCurrentUserName();
UserTransaction txn = transactionService.getUserTransaction();
long ms1 = System.currentTimeMillis();
try
{
if (doAsUser != null)
authenticationComponent.setCurrentUser(doAsUser);
txn.begin();
for (int siteId = firstSiteId; siteId < firstSiteId+blockSize; siteId++)
{
try
{
int groupId = (siteId - 1) % NUM_GROUPS + 1;
String groupName = getGroupName(groupId);
String siteName = getSiteName(siteId);
long ms2 = System.currentTimeMillis();
String groupAuthorityName = authorityService.getName(AuthorityType.GROUP,
groupName);
siteService.setMembership(siteName, groupAuthorityName, SiteModel.SITE_COLLABORATOR);
assertTime("Adding a group to a site", groupId, siteId, ms2, MAX_GROUP_TO_SITE_MS, onFailureAction, 1);
}
catch (DuplicateChildNodeNameException e)
{
// Already allocated.
}
}
txn.commit();
assertTime(" Block Add", firstSiteId, 0, ms1, MAX_GROUP_TO_SITE_MS, onFailureAction, blockSize);
}
catch (Exception e)
{
txn.rollback();
throw e;
}
finally
{
authenticationComponent.setCurrentUser(currentUser);
}
}
private void allocateGroupToSite(int siteId, int userCount, String doAsUser, OnFailure onFailureAction) throws Exception
{
int groupId = (siteId-1) % NUM_GROUPS + 1;
allocateGroupToSite(groupId, siteId, userCount, doAsUser, onFailureAction);
}
private void allocateGroupToSite(int groupId, int siteId, int userCount, String doAsUser, OnFailure onFailureAction) throws Exception
{
try
{
String groupName = getGroupName(groupId);
String siteName = getSiteName(siteId);
long ms = System.currentTimeMillis();
allocateGroupToSite(groupName, siteName, doAsUser);
assertTime("Adding a group to a site", groupId, siteId, ms, MAX_GROUP_TO_SITE_MS, onFailureAction, 1);
}
catch (DuplicateChildNodeNameException e)
{
// Already allocated.
}
}
// ------------------ allocate 1 --------------------
private void allocateUserToGroup(String userName, String groupName) throws Exception
{
String groupAuthorityName = authorityService.getName(AuthorityType.GROUP, groupName);
authorityService.addAuthority(groupAuthorityName, userName);
}
private void allocateUserToSite(String userName, String siteName, String doAsUser)
throws Exception
{
setSiteMembership(userName, siteName, doAsUser);
}
private void allocateGroupToSite(String groupName, String siteName, String doAsUser)
throws Exception
{
String groupAuthorityName = authorityService.getName(AuthorityType.GROUP, groupName);
setSiteMembership(groupAuthorityName, siteName, doAsUser);
}
private void setSiteMembership(String authority, String siteName, String doAsUser)
throws SystemException, Exception
{
String currentUser = authenticationComponent.getCurrentUserName();
UserTransaction txn = transactionService.getUserTransaction();
try
{
if (doAsUser != null)
authenticationComponent.setCurrentUser(doAsUser);
txn.begin();
siteService.setMembership(siteName, authority, SiteModel.SITE_COLLABORATOR);
txn.commit();
}
catch (Exception e)
{
txn.rollback();
throw e;
}
finally
{
authenticationComponent.setCurrentUser(currentUser);
}
}
// ------------------ names --------------------
private String getUserName(int userId)
{
return getName("user", userId);
}
private String getGroupName(int groupId)
{
return getName("group", groupId);
}
private String getSiteName(int siteId)
{
return getName("site", siteId);
}
private String getName(String prefix, int id)
{
return new StringBuilder(prefix).append(id).toString();
}
private String getSiteOwnerUserName(int siteId, int userCount)
{
int ownerId = (siteId-1)%userCount+1;
return getUserName(ownerId);
}
// ------------------ Original Tests --------------------
// @Test
// public void testSingleGroup() throws Exception
// {
// Allocation usersToGroups = Allocation.ALL_TO_EACH;
// Allocation usersToSites = Allocation.NONE;
// Allocation groupsToSites = Allocation.ROUND_ROBIN_TO_TARGET;
//
// createAndAllocate(NUM_USERS, NUM_GROUPS, NUM_SITES, usersToGroups, usersToSites, groupsToSites);
// }
// @Test
// public void testMultipleGroups() throws Exception
// {
// Allocation usersToGroups = Allocation.ALL_TO_EACH;
// Allocation usersToSites = Allocation.NONE;
// Allocation groupsToSites = Allocation.ROUND_ROBIN_TO_TARGET;
//
// createAndAllocate(NUM_USERS, NUM_GROUPS, NUM_SITES, usersToGroups, usersToSites, groupsToSites);
// }
// @Test
// public void testNoGroups() throws Exception
// {
// Allocation usersToGroups = Allocation.NONE;
// Allocation usersToSites = Allocation.ALL_TO_EACH;
// Allocation groupsToSites = Allocation.NONE;
//
// createAndAllocate(NUM_USERS, NUM_GROUPS, NUM_SITES, usersToGroups, usersToSites, groupsToSites);
// }
// ------------------ Initial Data Load Tests --------------------
// @Test
// public void testInitClearDownAll() throws Exception
// {
// createUsersGroupsAndSites(0, 0, 0);
// }
// @Test
// public void testInitCreateUsersAndGroups() throws Exception
// {
// createUsers(NUM_USERS);
// createGroups(NUM_GROUPS);
// allocateUsersToGroups(NUM_USERS, NUM_GROUPS, Allocation.ALL_TO_EACH);
// }
// @Test
// public void testInit() throws Exception
// {
// createUsers(NUM_USERS);
// createGroups(NUM_GROUPS);
// allocateUsersToGroups(NUM_USERS, NUM_GROUPS, Allocation.ALL_TO_EACH);
//
// createSites(NUM_SITES, NUM_USERS, 0, OnFailure.KEEP_GOING);
//
// int blockSize = 10;
// for (int siteId = getNextSiteToAddGroupTo(1); siteId <= NUM_SITES; siteId += blockSize)
// {
// allocateGroupToSite(siteId, NUM_USERS, ADMIN_USER, OnFailure.KEEP_GOING, blockSize);
// }
// }
// ------------------ Test to load data from cmd line --------------------
@Test
public void commandLine() throws Exception
{
String from = System.getProperty("from");
String to = System.getProperty("to");
String restart = System.getProperty("restart");
String action = System.getProperty("action");
logFilename = System.getProperty("log", "sites.log");
boolean usersOnly = "usersOnly".equalsIgnoreCase(action);
boolean sites = "sites".equalsIgnoreCase(action);
boolean groups = "groups".equalsIgnoreCase(action);
boolean test = "test".equalsIgnoreCase(action);
if ((usersOnly && (from != null || to != null || restart != null)) ||
(!usersOnly && (from == null || to == null || (action != null && !sites && !groups && !test))))
{
System.err.println(
"Usage: -Dfrom= -Dto= [ -Dlog= ]\n" +
" -Daction=usersOnly [ -Dlog= ]\n" +
" -Daction=sites -Dfrom= -Dto= [ -Dlog= ] [ -Drestart= ]\n" +
" -Daction=groups -Dfrom= -Dto= [ -Dlog= ] [ -Drestart= ]" +
" -Daction=test -Dfrom= -Dto= [ -Dlog= ] ");
}
else
{
try
{
int fromId = (from == null) ? 0 : Integer.parseInt(from);
NUM_SITES = (to == null) ? 0 : Integer.parseInt(to);
int restartFromId = (restart == null) ? fromId : Integer.parseInt(restart);
if (test)
{
testAddingSitesAndDelete(fromId, NUM_SITES);
}
else
{
if (action == null || usersOnly)
{
createUsers(NUM_USERS);
createGroups(NUM_GROUPS);
allocateUsersToGroups(NUM_USERS, NUM_GROUPS, Allocation.ALL_TO_EACH);
if (action == null)
{
sites = true;
}
}
if (sites)
{
createSites(NUM_SITES, NUM_USERS, restartFromId - 1, OnFailure.KEEP_GOING);
restartFromId = fromId;
groups = true;
}
if (groups)
{
int blockSize = 10;
for (int siteId = getNextSiteToAddGroupTo(restartFromId); siteId <= NUM_SITES; siteId += blockSize)
{
int size = Math.min(blockSize, NUM_SITES - siteId + 1);
allocateGroupToSite(siteId, NUM_USERS, ADMIN_USER, OnFailure.KEEP_GOING, size);
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
log("\n\n DONE");
}
}
}
/**
* Simplify running unit test from the command line.
*
* set SITE_CPATH=%TOMCAT_HOME%/lib/*;%TOMCAT_HOME%/endorsed/*;%TOMCAT_HOME%/webapps/alfresco/WEB-INF/lib/*;%TOMCAT_HOME%/webapps/alfresco/WEB-INF/classes;%TOMCAT_HOME%/shared/classes;
* java -Xmx2048m -XX:MaxPermSize=512M -classpath %SITE_CPATH% org.alfresco.repo.site.SiteServiceTestHuge ...
*/
public static void main(String args[])
{
org.junit.runner.JUnitCore.main(SiteServiceTestHuge.class.getName());
}
// ------------------ Tests Once Data Is Loaded --------------------
// @Test
// public void testAdding1000SitesInBlocksOf100() throws Exception
// {
// usersCreated = NUM_USERS;
// groupsCreated = NUM_GROUPS;
// sitesCreated = NUM_SITES;
//
// deleteSites(NUM_SITES+1, NUM_SITES+1000, OnFailure.KEEP_GOING);
//
// for (int i=1; i<=10; i++)
// {
// addMoreSites(100, OnFailure.GIVE_UP);
// }
//
// deleteSites(NUM_SITES+1, NUM_SITES+1000, OnFailure.KEEP_GOING);
// }
// @Test
// public void testAdding4SitesAndDelete() throws Exception
// {
// testAddingSitesAndDelete(NUM_SITES + 1, NUM_SITES + 100);
// }
public void testAddingSitesAndDelete(int fromSiteId, int toSiteId) throws Exception
{
usersCreated = NUM_USERS;
groupsCreated = NUM_GROUPS;
sitesCreated = fromSiteId - 1;
deleteSites(fromSiteId, toSiteId, OnFailure.KEEP_GOING);
log("\n\n CREATE SITES");
for (int siteId = fromSiteId; siteId <= toSiteId; siteId++)
{
String siteCreatorUser = getSiteOwnerUserName(siteId, NUM_USERS);
creatSite(siteId, siteCreatorUser, OnFailure.KEEP_GOING);
}
log("\n\n ADD GROUPS");
for (int siteId = fromSiteId; siteId <= toSiteId; siteId++)
{
String siteCreatorUser = getSiteOwnerUserName(siteId, NUM_USERS);
allocateGroupToSite(siteId, NUM_USERS, siteCreatorUser, OnFailure.KEEP_GOING);
}
log("\n\n DELETE");
for (int siteId = fromSiteId; siteId <= toSiteId; siteId++)
{
String siteCreatorUser = getSiteOwnerUserName(siteId, NUM_USERS);
deleteSite(siteId, siteCreatorUser, OnFailure.KEEP_GOING);
}
}
}