/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library 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 2.1 of the License, or (at your option) * any later version. * * This library 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. */ package com.liferay.portal.service; import com.liferay.document.library.kernel.model.DLFileEntryType; import com.liferay.document.library.kernel.model.DLFileEntryTypeConstants; import com.liferay.document.library.kernel.service.DLAppLocalServiceUtil; import com.liferay.document.library.kernel.service.DLFileEntryTypeLocalServiceUtil; import com.liferay.exportimport.kernel.service.StagingLocalServiceUtil; import com.liferay.portal.kernel.backgroundtask.BackgroundTaskThreadLocal; import com.liferay.portal.kernel.dao.orm.QueryUtil; import com.liferay.portal.kernel.exception.AccountNameException; import com.liferay.portal.kernel.exception.CompanyMxException; import com.liferay.portal.kernel.exception.CompanyVirtualHostException; import com.liferay.portal.kernel.exception.NoSuchAccountException; import com.liferay.portal.kernel.exception.NoSuchPasswordPolicyException; import com.liferay.portal.kernel.exception.NoSuchVirtualHostException; import com.liferay.portal.kernel.exception.RequiredCompanyException; import com.liferay.portal.kernel.model.Account; import com.liferay.portal.kernel.model.Company; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.GroupConstants; import com.liferay.portal.kernel.model.LayoutSetPrototype; import com.liferay.portal.kernel.model.Organization; import com.liferay.portal.kernel.model.OrganizationConstants; import com.liferay.portal.kernel.model.PortalPreferences; import com.liferay.portal.kernel.model.Role; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.model.UserGroup; import com.liferay.portal.kernel.security.auth.CompanyThreadLocal; import com.liferay.portal.kernel.service.AccountLocalServiceUtil; import com.liferay.portal.kernel.service.CompanyLocalServiceUtil; import com.liferay.portal.kernel.service.GroupLocalServiceUtil; import com.liferay.portal.kernel.service.LayoutPrototypeLocalServiceUtil; import com.liferay.portal.kernel.service.LayoutSetPrototypeLocalServiceUtil; import com.liferay.portal.kernel.service.OrganizationLocalServiceUtil; import com.liferay.portal.kernel.service.PasswordPolicyLocalServiceUtil; import com.liferay.portal.kernel.service.RoleLocalServiceUtil; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.service.UserGroupLocalServiceUtil; import com.liferay.portal.kernel.service.UserLocalServiceUtil; import com.liferay.portal.kernel.service.VirtualHostLocalServiceUtil; import com.liferay.portal.kernel.service.persistence.PasswordPolicyUtil; import com.liferay.portal.kernel.service.persistence.PortalPreferencesUtil; import com.liferay.portal.kernel.service.persistence.PortletUtil; import com.liferay.portal.kernel.test.randomizerbumpers.NumericStringRandomizerBumper; import com.liferay.portal.kernel.test.rule.AggregateTestRule; import com.liferay.portal.kernel.test.rule.Sync; import com.liferay.portal.kernel.test.rule.SynchronousDestinationTestRule; import com.liferay.portal.kernel.test.util.GroupTestUtil; import com.liferay.portal.kernel.test.util.RandomTestUtil; import com.liferay.portal.kernel.test.util.UserGroupTestUtil; import com.liferay.portal.kernel.test.util.UserTestUtil; import com.liferay.portal.kernel.transaction.Propagation; import com.liferay.portal.kernel.transaction.TransactionConfig; import com.liferay.portal.kernel.transaction.TransactionInvokerUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.PortletKeys; import com.liferay.portal.kernel.util.ReflectionUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.test.rule.LiferayIntegrationTestRule; import com.liferay.portal.test.rule.callback.SybaseDump; import com.liferay.portal.test.rule.callback.SybaseDumpTransactionLog; import com.liferay.portal.util.PortalInstances; import com.liferay.portal.util.PropsValues; import com.liferay.sites.kernel.util.SitesUtil; import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.concurrent.Callable; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.springframework.core.io.FileSystemResourceLoader; import org.springframework.mock.web.MockServletContext; /** * @author Mika Koivisto * @author Dale Shan */ @SybaseDumpTransactionLog(dumpBefore = {SybaseDump.CLASS, SybaseDump.METHOD}) @Sync public class CompanyLocalServiceTest { @ClassRule @Rule public static final AggregateTestRule aggregateTestRule = new AggregateTestRule( new LiferayIntegrationTestRule(), SynchronousDestinationTestRule.INSTANCE); public void resetBackgroundTaskThreadLocal() throws Exception { Class<?> backgroundTaskThreadLocalClass = BackgroundTaskThreadLocal.class; Field backgroundTaskIdField = backgroundTaskThreadLocalClass.getDeclaredField( "_backgroundTaskId"); backgroundTaskIdField.setAccessible(true); Method setMethod = ThreadLocal.class.getDeclaredMethod( "set", Object.class); setMethod.invoke(backgroundTaskIdField.get(null), 0L); } @Before public void setUp() { _companyId = CompanyThreadLocal.getCompanyId(); CompanyThreadLocal.setCompanyId(PortalInstances.getDefaultCompanyId()); File file = new File("portal-web/docroot"); _mockServletContext = new MockServletContext( "file:" + file.getAbsolutePath(), new FileSystemResourceLoader()); } @After public void tearDown() throws Exception { CompanyThreadLocal.setCompanyId(_companyId); resetBackgroundTaskThreadLocal(); } @Test public void testAddAndDeleteCompany() throws Exception { Company company = addCompany(); String companyWebId = company.getWebId(); CompanyLocalServiceUtil.deleteCompany(company.getCompanyId()); for (String webId : PortalInstances.getWebIds()) { Assert.assertNotEquals(companyWebId, webId); } } @Test public void testAddAndDeleteCompanyWithCompanyGroupStaging() throws Exception { Company company = addCompany(); long companyId = company.getCompanyId(); long userId = UserLocalServiceUtil.getDefaultUserId(companyId); Group companyGroup = company.getGroup(); StagingLocalServiceUtil.enableLocalStaging( userId, companyGroup, false, false, new ServiceContext()); Group companyStagingGroup = companyGroup.getStagingGroup(); CompanyLocalServiceUtil.deleteCompany(company.getCompanyId()); companyGroup = GroupLocalServiceUtil.fetchGroup( companyGroup.getGroupId()); Assert.assertNull(companyGroup); companyStagingGroup = GroupLocalServiceUtil.fetchGroup( companyStagingGroup.getGroupId()); Assert.assertNull(companyStagingGroup); } @Test public void testAddAndDeleteCompanyWithDLFileEntryTypes() throws Exception { Company company = addCompany(); long companyId = company.getCompanyId(); long userId = UserLocalServiceUtil.getDefaultUserId(companyId); Group guestGroup = GroupLocalServiceUtil.getGroup( companyId, GroupConstants.GUEST); DLFileEntryType dlFileEntryType = DLFileEntryTypeLocalServiceUtil.getFileEntryType( DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT); ServiceContext serviceContext = getServiceContext(companyId); serviceContext.setAttribute( "fileEntryTypeId", dlFileEntryType.getFileEntryTypeId()); serviceContext.setScopeGroupId(guestGroup.getGroupId()); serviceContext.setUserId(userId); DLAppLocalServiceUtil.addFileEntry( userId, guestGroup.getGroupId(), 0, "test.xml", "text/xml", "test.xml", "", "", "test".getBytes(), serviceContext); CompanyLocalServiceUtil.deleteCompany(companyId); } @Test public void testAddAndDeleteCompanyWithLayoutSetPrototype() throws Exception { Company company = addCompany(); long companyId = company.getCompanyId(); long userId = UserLocalServiceUtil.getDefaultUserId(companyId); Group group = GroupTestUtil.addGroup( companyId, userId, GroupConstants.DEFAULT_PARENT_GROUP_ID); LayoutSetPrototype layoutSetPrototype = addLayoutSetPrototype( companyId, userId, RandomTestUtil.randomString()); SitesUtil.updateLayoutSetPrototypesLinks( group, layoutSetPrototype.getLayoutSetPrototypeId(), 0, true, false); addUser( companyId, userId, group.getGroupId(), getServiceContext(companyId)); CompanyLocalServiceUtil.deleteCompany(companyId); layoutSetPrototype = LayoutSetPrototypeLocalServiceUtil.fetchLayoutSetPrototype( layoutSetPrototype.getLayoutSetPrototypeId()); Assert.assertNull(layoutSetPrototype); } @Test public void testAddAndDeleteCompanyWithParentGroup() throws Exception { Company company = addCompany(); long companyId = company.getCompanyId(); long userId = UserLocalServiceUtil.getDefaultUserId(companyId); Group parentGroup = GroupTestUtil.addGroup( companyId, userId, GroupConstants.DEFAULT_PARENT_GROUP_ID); Group group = GroupTestUtil.addGroup( companyId, userId, parentGroup.getGroupId()); addUser( companyId, userId, group.getGroupId(), getServiceContext(companyId)); CompanyLocalServiceUtil.deleteCompany(company.getCompanyId()); parentGroup = GroupLocalServiceUtil.fetchGroup( parentGroup.getGroupId()); Assert.assertNull(parentGroup); group = GroupLocalServiceUtil.fetchGroup(group.getGroupId()); Assert.assertNull(group); } @Test public void testAddAndDeleteCompanyWithStagedOrganizationSite() throws Exception { Company company = addCompany(); User companyAdminUser = UserTestUtil.addCompanyAdminUser(company); Organization companyOrganzation = OrganizationLocalServiceUtil.addOrganization( companyAdminUser.getUserId(), OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID, RandomTestUtil.randomString(), true); Group companyOrganizationGroup = companyOrganzation.getGroup(); GroupTestUtil.enableLocalStaging( companyOrganizationGroup, companyAdminUser.getUserId()); CompanyLocalServiceUtil.deleteCompany(company); companyOrganzation = OrganizationLocalServiceUtil.fetchOrganization( companyOrganzation.getOrganizationId()); Assert.assertNull(companyOrganzation); companyOrganizationGroup = GroupLocalServiceUtil.fetchGroup( companyOrganizationGroup.getGroupId()); Assert.assertNull(companyOrganizationGroup); } @Test public void testAddAndDeleteCompanyWithUserGroup() throws Exception { Company company = addCompany(); long companyId = company.getCompanyId(); long userId = UserLocalServiceUtil.getDefaultUserId(companyId); Group group = GroupTestUtil.addGroup( companyId, userId, GroupConstants.DEFAULT_PARENT_GROUP_ID); UserGroup userGroup = UserGroupTestUtil.addUserGroup( group.getGroupId()); User user = addUser( companyId, userId, group.getGroupId(), getServiceContext(companyId)); UserGroupLocalServiceUtil.addUserUserGroup(user.getUserId(), userGroup); CompanyLocalServiceUtil.deleteCompany(company.getCompanyId()); userGroup = UserGroupLocalServiceUtil.fetchUserGroup( userGroup.getUserGroupId()); Assert.assertNull(userGroup); user = UserLocalServiceUtil.fetchUser(user.getUserId()); Assert.assertNull(user); } @Test(expected = NoSuchAccountException.class) public void testDeleteCompanyDeletesAccount() throws Exception { Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); AccountLocalServiceUtil.getAccount(company.getAccountId()); } @Test(expected = NoSuchPasswordPolicyException.class) public void testDeleteCompanyDeletesDefaultPasswordPolicy() throws Exception { Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); PasswordPolicyLocalServiceUtil.getDefaultPasswordPolicy( company.getCompanyId()); } @Test public void testDeleteCompanyDeletesGroups() throws Exception { Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); int count = GroupLocalServiceUtil.getGroupsCount( company.getCompanyId(), GroupConstants.ANY_PARENT_GROUP_ID, true); Assert.assertEquals(0, count); count = GroupLocalServiceUtil.getGroupsCount( company.getCompanyId(), GroupConstants.ANY_PARENT_GROUP_ID, false); Assert.assertEquals(0, count); } @Test public void testDeleteCompanyDeletesLayoutPrototypes() throws Exception { Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); int count = LayoutPrototypeLocalServiceUtil.searchCount( company.getCompanyId(), true); Assert.assertEquals(0, count); count = LayoutPrototypeLocalServiceUtil.searchCount( company.getCompanyId(), false); Assert.assertEquals(0, count); } @Test public void testDeleteCompanyDeletesLayoutSetPrototypes() throws Exception { Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); List<LayoutSetPrototype> layoutSetPrototypes = LayoutSetPrototypeLocalServiceUtil.getLayoutSetPrototypes( company.getCompanyId()); Assert.assertEquals( layoutSetPrototypes.toString(), 0, layoutSetPrototypes.size()); } @Test public void testDeleteCompanyDeletesNonDefaultPasswordPolicies() throws Throwable { final Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); TransactionInvokerUtil.invoke( _transactionConfig, new Callable<Void>() { @Override public Void call() throws Exception { int count = PasswordPolicyUtil.countByC_DP( company.getCompanyId(), false); Assert.assertEquals(0, count); return null; } }); } @Test public void testDeleteCompanyDeletesOrganizations() throws Exception { Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); int count = OrganizationLocalServiceUtil.getOrganizationsCount( company.getCompanyId(), OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID); Assert.assertEquals(0, count); } @Test public void testDeleteCompanyDeletesPortalInstance() throws Exception { Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); for (long companyId : PortalInstances.getCompanyIds()) { Assert.assertNotEquals( "Company instance was not deleted", company.getCompanyId(), companyId); } } @Test public void testDeleteCompanyDeletesPortalPreferences() throws Throwable { final Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); TransactionInvokerUtil.invoke( _transactionConfig, new Callable<Void>() { @Override public Void call() throws Exception { PortalPreferences portalPreferences = PortalPreferencesUtil.fetchByO_O( company.getCompanyId(), PortletKeys.PREFS_OWNER_TYPE_COMPANY); Assert.assertNull(portalPreferences); return null; } }); } @Test public void testDeleteCompanyDeletesPortlets() throws Throwable { final Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); TransactionInvokerUtil.invoke( _transactionConfig, new Callable<Void>() { @Override public Void call() { int count = PortletUtil.countByCompanyId( company.getCompanyId()); Assert.assertEquals(0, count); return null; } }); } @Test public void testDeleteCompanyDeletesRoles() throws Exception { Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); List<Role> roles = RoleLocalServiceUtil.getRoles( company.getCompanyId()); Assert.assertEquals(roles.toString(), 0, roles.size()); } @Test public void testDeleteCompanyDeletesUsers() throws Exception { Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); List<User> users = UserLocalServiceUtil.getCompanyUsers( company.getCompanyId(), QueryUtil.ALL_POS, QueryUtil.ALL_POS); Assert.assertEquals(users.toString(), 0, users.size()); } @Test(expected = NoSuchVirtualHostException.class) public void testDeleteCompanyDeletesVirtualHost() throws Exception { Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); VirtualHostLocalServiceUtil.getVirtualHost(company.getWebId()); } @Test public void testDeleteCompanyWithLDAPPasswordPolicyEnabled() throws Exception { Company company = addCompany(); CompanyLocalServiceUtil.deleteCompany(company); } @Test(expected = RequiredCompanyException.class) public void testDeleteDefaultCompany() throws Exception { long companyId = PortalInstances.getDefaultCompanyId(); CompanyLocalServiceUtil.deleteCompany(companyId); } @Test public void testUpdateDisplay() throws Exception { Company company = addCompany(); User user = UserLocalServiceUtil.getDefaultUser(company.getCompanyId()); UserLocalServiceUtil.updateUser(user); CompanyLocalServiceUtil.updateDisplay( company.getCompanyId(), "hu", "CET"); user = UserLocalServiceUtil.getDefaultUser(company.getCompanyId()); Assert.assertEquals("hu", user.getLanguageId()); Assert.assertEquals("CET", user.getTimeZoneId()); } @Test public void testUpdateInvalidAccountNames() throws Exception { Company company = addCompany(); Group group = GroupTestUtil.addGroup(); group.setCompanyId(company.getCompanyId()); GroupLocalServiceUtil.updateGroup(group); testUpdateAccountNames( company, new String[] {StringPool.BLANK, group.getDescriptiveName()}, true); GroupLocalServiceUtil.deleteGroup(group); CompanyLocalServiceUtil.deleteCompany(company.getCompanyId()); } @Test public void testUpdateInvalidVirtualHostNames() throws Exception { testUpdateVirtualHostNames( new String[] {StringPool.BLANK, "localhost", ".abc"}, true); } @Test public void testUpdateMx() throws Exception { testUpdateMx("abc.com", true, true); testUpdateMx("abc.com", true, false); testUpdateMx(StringPool.BLANK, false, true); testUpdateMx(StringPool.BLANK, false, false); } @Test public void testUpdateValidAccountNames() throws Exception { Company company = addCompany(); testUpdateAccountNames( company, new String[] {RandomTestUtil.randomString()}, false); CompanyLocalServiceUtil.deleteCompany(company.getCompanyId()); } @Test public void testUpdateValidVirtualHostNames() throws Exception { testUpdateVirtualHostNames(new String[] {"abc.com"}, false); } protected Company addCompany() throws Exception { String webId = RandomTestUtil.randomString() + "test.com"; Company company = CompanyLocalServiceUtil.addCompany( webId, webId, "test.com", false, 0, true); PortalInstances.initCompany(_mockServletContext, webId); return company; } protected LayoutSetPrototype addLayoutSetPrototype( long companyId, long userId, String name) throws Exception { Map<Locale, String> nameMap = new HashMap<>(); nameMap.put(LocaleUtil.getDefault(), name); LayoutSetPrototype layoutSetPrototype = LayoutSetPrototypeLocalServiceUtil.addLayoutSetPrototype( userId, companyId, nameMap, new HashMap<Locale, String>(), true, true, getServiceContext(companyId)); return layoutSetPrototype; } protected User addUser( long companyId, long userId, long groupId, ServiceContext serviceContext) throws Exception { return UserTestUtil.addUser( companyId, userId, RandomTestUtil.randomString(NumericStringRandomizerBumper.INSTANCE), LocaleUtil.getDefault(), RandomTestUtil.randomString(), RandomTestUtil.randomString(), new long[] {groupId}, serviceContext); } protected ServiceContext getServiceContext(long companyId) { ServiceContext serviceContext = new ServiceContext(); serviceContext.setAddGroupPermissions(true); serviceContext.setAddGuestPermissions(true); serviceContext.setCompanyId(companyId); return serviceContext; } protected void testUpdateAccountNames( Company company, String[] accountNames, boolean expectFailure) throws Exception { Account account = AccountLocalServiceUtil.getAccount( company.getAccountId()); for (String accountName : accountNames) { try { company = CompanyLocalServiceUtil.updateCompany( company.getCompanyId(), company.getVirtualHostname(), company.getMx(), company.getHomeURL(), true, null, accountName, account.getLegalName(), account.getLegalId(), account.getLegalType(), account.getSicCode(), account.getTickerSymbol(), account.getIndustry(), account.getType(), account.getSize()); Assert.assertFalse(expectFailure); } catch (AccountNameException ane) { Assert.assertTrue(expectFailure); } } } protected void testUpdateMx(String mx, boolean valid, boolean mailMxUpdate) throws Exception { Company company = addCompany(); String originalMx = company.getMx(); Field field = ReflectionUtil.getDeclaredField( PropsValues.class, "MAIL_MX_UPDATE"); Object value = field.get(null); try { if (mailMxUpdate) { field.set(null, Boolean.TRUE); } else { field.set(null, Boolean.FALSE); } CompanyLocalServiceUtil.updateCompany( company.getCompanyId(), company.getVirtualHostname(), mx, company.getMaxUsers(), company.getActive()); company = CompanyLocalServiceUtil.getCompany( company.getCompanyId()); String updatedMx = company.getMx(); if (valid && mailMxUpdate) { Assert.assertNotEquals(originalMx, updatedMx); } else { Assert.assertEquals(originalMx, updatedMx); } } catch (CompanyMxException cme) { Assert.assertFalse(valid); Assert.assertTrue(mailMxUpdate); } finally { CompanyLocalServiceUtil.deleteCompany(company.getCompanyId()); field.set(null, value); } } protected void testUpdateVirtualHostNames( String[] virtualHostNames, boolean expectFailure) throws Exception { Company company = addCompany(); for (String virtualHostName : virtualHostNames) { try { CompanyLocalServiceUtil.updateCompany( company.getCompanyId(), virtualHostName, company.getMx(), company.getMaxUsers(), company.getActive()); Assert.assertFalse(expectFailure); } catch (CompanyVirtualHostException cvhe) { Assert.assertTrue(expectFailure); } } CompanyLocalServiceUtil.deleteCompany(company.getCompanyId()); } private static final TransactionConfig _transactionConfig; static { TransactionConfig.Builder builder = new TransactionConfig.Builder(); builder.setPropagation(Propagation.SUPPORTS); builder.setReadOnly(true); builder.setRollbackForClasses(Exception.class); _transactionConfig = builder.build(); } private long _companyId; private MockServletContext _mockServletContext; }