/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.test.platform.repository2.mt;
import org.apache.jackrabbit.spi.Name;
import org.apache.jackrabbit.spi.NameFactory;
import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.pentaho.platform.api.mt.ITenant;
import org.pentaho.platform.engine.core.system.TenantUtils;
import org.pentaho.platform.repository2.unified.DefaultUnifiedRepositoryBase;
import org.pentaho.platform.repository2.unified.ServerRepositoryPaths;
import org.pentaho.platform.repository2.unified.jcr.JcrRepositoryDumpToFile;
import org.pentaho.platform.repository2.unified.jcr.JcrRepositoryDumpToFile.Mode;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
import static org.junit.Assert.*;
/**
* @author mlowery
*/
@RunWith( SpringJUnit4ClassRunner.class )
@SuppressWarnings( "nls" )
public class RepositoryTenantManagerTest extends DefaultUnifiedRepositoryBase {
private final String TENANT_ID_APPLE = "apple";
private final String TENANT_ID_MICROSOFT = "microsoft";
private final String TENANT_ID_SUN = "sun";
public static final String MAIN_TENANT_1 = "maintenant1";
public static final String SUB_TENANT1_1 = "subtenant11";
public static final String SUB_TENANT1_1_1 = "subtenant111";
public static final String SUB_TENANT1_1_2 = "subtenant112";
public static final String SUB_TENANT1_2 = "subtenant12";
public static final String SUB_TENANT1_2_1 = "subtenant121";
public static final String SUB_TENANT1_2_2 = "subtenant122";
public static final String MAIN_TENANT_2 = "maintenant2";
public static final String SUB_TENANT2_1 = "subtenant21";
public static final String SUB_TENANT2_1_1 = "subtenant211";
public static final String SUB_TENANT2_1_2 = "subtenant212";
public static final String SUB_TENANT2_2 = "subtenant22";
public static final String SUB_TENANT2_2_1 = "subtenant221";
public static final String SUB_TENANT2_2_2 = "subtenant222";
NameFactory NF = NameFactoryImpl.getInstance();
Name P_PRINCIPAL_NAME = NF.create( Name.NS_REP_URI, "principalName" ); //$NON-NLS-1$
String pPrincipalName;
private void assertTenantNotNull( ITenant tenant ) {
assertNotNull( tenant );
assertNotNull( tenant.getId() );
assertNotNull( tenant.getName() );
}
@Test
public void testCreateSystemTenant() {
loginAsRepositoryAdmin();
ITenant duplicateTenant =
tenantManager.createTenant( null, ServerRepositoryPaths.getPentahoRootFolderName(), tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
assertNull( duplicateTenant );
}
@Test
public void testCreateTenant() {
loginAsSysTenantAdmin();
assertNotNull( systemTenant );
assertTrue( systemTenant.isEnabled() );
ITenant tenantRoot =
tenantManager.createTenant( systemTenant, TenantUtils.TENANTID_SINGLE_TENANT, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( tenantRoot, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
assertNotNull( tenantRoot );
assertTrue( tenantRoot.isEnabled() );
ITenant subTenantRoot =
tenantManager.createTenant( tenantRoot, TENANT_ID_APPLE, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenantRoot, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
assertNotNull( subTenantRoot );
assertTrue( subTenantRoot.isEnabled() );
List<ITenant> childTenants = tenantManager.getChildTenants( tenantRoot );
assertTrue( childTenants.size() == 1 );
assertTrue( childTenants.get( 0 ).equals( subTenantRoot ) );
cleanupUserAndRoles( tenantRoot );
cleanupUserAndRoles( subTenantRoot );
}
@Test
public void testEnableDisableTenant() {
loginAsSysTenantAdmin();
assertTenantNotNull( systemTenant );
ITenant tenantRoot =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( tenantRoot, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
assertTenantNotNull( tenantRoot );
assertTrue( tenantRoot.isEnabled() );
tenantManager.enableTenant( tenantRoot, false );
tenantRoot = tenantManager.getTenant( tenantRoot.getRootFolderAbsolutePath() );
assertTrue( !tenantRoot.isEnabled() );
tenantManager.enableTenant( tenantRoot, true );
tenantRoot = tenantManager.getTenant( tenantRoot.getRootFolderAbsolutePath() );
assertTrue( tenantRoot.isEnabled() );
cleanupUserAndRoles( tenantRoot );
}
@Test
public void testIsTenantRoot() {
loginAsSysTenantAdmin();
assertTenantNotNull( systemTenant );
assertTrue( systemTenant.isEnabled() );
ITenant tenantRoot =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( tenantRoot, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
assertTenantNotNull( tenantRoot );
cleanupUserAndRoles( tenantRoot );
}
@Test
public void testIsSubTenant() {
loginAsSysTenantAdmin();
ITenant mainTenant_1 =
tenantManager.createTenant( systemTenant, MAIN_TENANT_1, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( mainTenant_1, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
ITenant mainTenant_2 =
tenantManager.createTenant( systemTenant, MAIN_TENANT_2, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( mainTenant_2, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
ITenant subTenant1_1 =
tenantManager.createTenant( mainTenant_1, SUB_TENANT1_1, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant1_1, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
ITenant subTenant1_2 =
tenantManager.createTenant( mainTenant_1, SUB_TENANT1_2, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant1_2, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
ITenant subTenant2_1 =
tenantManager.createTenant( mainTenant_2, SUB_TENANT2_1, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant2_1, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
ITenant subTenant2_2 =
tenantManager.createTenant( mainTenant_2, SUB_TENANT2_2, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant2_2, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
assertTrue( tenantManager.isSubTenant( mainTenant_1, mainTenant_1 ) );
assertTrue( tenantManager.isSubTenant( mainTenant_2, mainTenant_2 ) );
assertTrue( tenantManager.isSubTenant( mainTenant_1, subTenant1_2 ) );
assertTrue( tenantManager.isSubTenant( mainTenant_1, subTenant1_1 ) );
assertFalse( tenantManager.isSubTenant( mainTenant_1, subTenant2_1 ) );
assertFalse( tenantManager.isSubTenant( mainTenant_1, subTenant2_2 ) );
assertFalse( tenantManager.isSubTenant( mainTenant_2, subTenant1_2 ) );
assertFalse( tenantManager.isSubTenant( mainTenant_2, subTenant1_1 ) );
assertTrue( tenantManager.isSubTenant( mainTenant_2, subTenant2_1 ) );
assertTrue( tenantManager.isSubTenant( mainTenant_2, subTenant2_2 ) );
assertTrue( tenantManager.isSubTenant( subTenant2_2, subTenant2_2 ) );
assertTrue( tenantManager.isSubTenant( subTenant1_2, subTenant1_2 ) );
JcrRepositoryDumpToFile dumpToFile =
new JcrRepositoryDumpToFile( testJcrTemplate, jcrTransactionTemplate, repositoryAdminUsername,
"c:/tmp/testdump122", Mode.CUSTOM );
dumpToFile.execute();
cleanupUserAndRoles( mainTenant_1 );
cleanupUserAndRoles( mainTenant_2 );
cleanupUserAndRoles( subTenant1_1 );
cleanupUserAndRoles( subTenant1_2 );
cleanupUserAndRoles( subTenant2_1 );
cleanupUserAndRoles( subTenant2_2 );
}
@Test
public void testGetChildrenTenants() {
loginAsSysTenantAdmin();
ITenant tenantRoot =
tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( tenantRoot, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
assertNotNull( tenantRoot );
assertTrue( tenantRoot.isEnabled() );
ITenant subTenantRoot1 =
tenantManager.createTenant( tenantRoot, TENANT_ID_APPLE, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenantRoot1, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
assertTrue( subTenantRoot1.isEnabled() );
ITenant subTenantRoot2 =
tenantManager.createTenant( tenantRoot, TENANT_ID_MICROSOFT, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenantRoot2, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
assertTrue( subTenantRoot2.isEnabled() );
List<ITenant> tenantChildren = tenantManager.getChildTenants( tenantRoot );
assertTrue( tenantChildren.size() == 2 );
List<ITenant> tenantChildrenId = tenantManager.getChildTenants( tenantRoot );
assertTrue( tenantChildrenId.size() == 2 );
cleanupUserAndRoles( tenantRoot );
cleanupUserAndRoles( subTenantRoot1 );
cleanupUserAndRoles( subTenantRoot2 );
}
@Test
public void testDeleteTenant() {
loginAsSysTenantAdmin();
ITenant mainTenant_1 =
tenantManager.createTenant( systemTenant, MAIN_TENANT_1, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( mainTenant_1, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
ITenant mainTenant_2 =
tenantManager.createTenant( systemTenant, MAIN_TENANT_2, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( mainTenant_2, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
ITenant subTenant1_1 = null;
// Testing SubTenant1_1 as a TenantAdmin of MainTenant2. This should fail
login( USERNAME_ADMIN, mainTenant_2, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
try {
subTenant1_1 =
tenantManager.createTenant( mainTenant_1, SUB_TENANT1_1, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
fail( "should have thrown an exception" );
} catch ( Throwable th ) {
assertNotNull( th );
}
logout();
login( USERNAME_ADMIN, mainTenant_1, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
subTenant1_1 =
tenantManager.createTenant( mainTenant_1, SUB_TENANT1_1, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant1_1, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
ITenant subTenant1_1_1 =
tenantManager.createTenant( subTenant1_1, SUB_TENANT1_1_1, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant1_1_1, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
ITenant subTenant1_1_2 =
tenantManager.createTenant( subTenant1_1, SUB_TENANT1_1_2, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant1_1_2, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
logout();
// Testing SubTenant1_2 as a TenantAdmin of MainTenant2. This should fail
login( USERNAME_ADMIN, mainTenant_2, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant subTenant1_2 = null;
try {
subTenant1_2 =
tenantManager.createTenant( mainTenant_1, SUB_TENANT1_2, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
fail( "should have thrown an exception" );
} catch ( Throwable th ) {
assertNotNull( th );
}
logout();
login( USERNAME_ADMIN, mainTenant_1, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
subTenant1_2 =
tenantManager.createTenant( mainTenant_1, SUB_TENANT1_2, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant1_2, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
logout();
login( USERNAME_ADMIN, subTenant1_2, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant subTenant1_2_1 =
tenantManager.createTenant( subTenant1_2, SUB_TENANT1_2_1, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant1_2_1, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
ITenant subTenant1_2_2 =
tenantManager.createTenant( subTenant1_2, SUB_TENANT1_2_2, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant1_2_2, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
logout();
login( USERNAME_ADMIN, mainTenant_2, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant subTenant2_1 =
tenantManager.createTenant( mainTenant_2, SUB_TENANT2_1, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant2_1, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
ITenant subTenant2_1_1 =
tenantManager.createTenant( subTenant2_1, SUB_TENANT2_1_1, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant2_1_1, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
ITenant subTenant2_1_2 =
tenantManager.createTenant( subTenant2_1, SUB_TENANT2_1_2, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant2_1_2, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
logout();
login( USERNAME_ADMIN, mainTenant_1, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant subTenant2_2 = null;
try {
subTenant2_2 =
tenantManager.createTenant( mainTenant_2, SUB_TENANT2_2, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
fail( "should have thrown an exception" );
} catch ( Throwable th ) {
assertNotNull( th );
}
logout();
login( USERNAME_ADMIN, mainTenant_2, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
subTenant2_2 =
tenantManager.createTenant( mainTenant_2, SUB_TENANT2_2, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant2_2, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
logout();
login( USERNAME_ADMIN, subTenant2_2, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
ITenant subTenant2_2_1 =
tenantManager.createTenant( subTenant2_2, SUB_TENANT2_2_1, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant2_2_1, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
ITenant subTenant2_2_2 =
tenantManager.createTenant( subTenant2_2, SUB_TENANT2_2_2, tenantAdminRoleName,
tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME );
userRoleDao.createUser( subTenant2_2_2, USERNAME_ADMIN, PASSWORD, "", new String[]{ tenantAdminRoleName } );
// Delete Tenants
login( USERNAME_ADMIN, subTenant2_1, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
try {
tenantManager.deleteTenant( subTenant2_1 );
fail( "should have thrown an exception" );
} catch ( Throwable th ) {
assertNotNull( th );
}
logout();
login( USERNAME_ADMIN, mainTenant_2, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
tenantManager.deleteTenant( subTenant2_1 );
ITenant tenant = tenantManager.getTenant( subTenant2_1.getRootFolderAbsolutePath() );
assertNull( tenant );
tenant = tenantManager.getTenant( subTenant2_1_1.getRootFolderAbsolutePath() );
assertNull( tenant );
tenant = tenantManager.getTenant( subTenant2_1_2.getRootFolderAbsolutePath() );
assertNull( tenant );
logout();
login( USERNAME_ADMIN, subTenant2_2, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
try {
tenantManager.deleteTenant( subTenant2_2 );
fail( "should have thrown an exception" );
} catch ( Throwable th ) {
assertNotNull( th );
}
logout();
login( USERNAME_ADMIN, mainTenant_2, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
tenantManager.deleteTenant( subTenant2_2 );
tenant = tenantManager.getTenant( subTenant2_2.getRootFolderAbsolutePath() );
assertNull( tenant );
tenant = tenantManager.getTenant( subTenant2_2_1.getRootFolderAbsolutePath() );
assertNull( tenant );
tenant = tenantManager.getTenant( subTenant2_2_2.getRootFolderAbsolutePath() );
assertNull( tenant );
logout();
login( USERNAME_ADMIN, mainTenant_1, new String[]{ tenantAdminRoleName, tenantAuthenticatedRoleName } );
tenantManager.deleteTenant( subTenant1_1 );
tenantManager.deleteTenant( subTenant1_2 );
logout();
loginAsSysTenantAdmin();
tenantManager.deleteTenant( mainTenant_1 );
tenantManager.deleteTenant( mainTenant_2 );
logout();
}
}