Brian Remmington ed839dcbe0 Merged BRANCHES/V4.2 to HEAD:
55206: Branch created for 4.2.x releases.
   55209: Merged HEAD to BRANCHES/V4.2:
        55208: Added Sharepoint config to unit test classpath to fix VtiRequestDispatcherTest.
   55222: Merged HEAD-BUG-FIX to V4.2
        55220: Merged V4.1-BUG-FIX (4.1.7) to HEAD-BUG-FIX (4.2)
           55218: Fix for ALF-19894 Site is not displayed after restoring from Trashcan
             This bug was reported on 4.2, but the bug is also present on 4.1.
             I have added a testcase to reproduce the bug along with a fix.
             The problem was in SiteServiceImpl.delete where the code was writing an empty property value into the {}memberships property
             and therefore there was no record of which users had been members of the deleted site.
   55245: Fixed javadoc while checking that ALF-19055 was fixed.  ActivityService no longer uses 'format
   55246: CLOUD-2050 -Content changes are not synced from Cloud to On-Premise (errors in the logs)
   55249: Hazelcast: Added ability to create cache with 'read-backup-data' via property *.readBackupData
   55250: Hazelcast cache builder now accepts 'async-backup-count' value and any error in setting a value logs the full exception
   55251: Asynchronous cache: Better logging of in- and after-transaction processes
   55252: Asynchronous cache: Better logging of in- and after-transaction processes
   55266: Workflow REST API fix for variable retrieval
   55276: Merged HEAD to BRANCHES/V4.2:
        55274: Disabling Sharepoint unit tests until we can make them run properly in the build.
   55278: ALF-19889 - String for Brazilian Portuguese
   55279: Merged DEV to 4.2
        ALF-17464 : Replication jobs aren't displayed until sorting by some characteristic
           - Changing not exact equals (!==) to not euqals (!=)
   55280: Fix for ALF-19865 - Forgot password link redirects to Login page. Also cleaned up the mess that is the 'Sign in to Alfresco in the cloud' dialog.
   55281: Probable fix for ALF-19225 Intermittent test failures in SubscriptionServiceActivitiesTest
   55282: ALF-19865 - Cloud Sync profile area now looks like the rest of profile area.
   55285: Merged BRANCHES/DEV/BELARUS/HEAD-2013_08_27 to BRANCHES/V4.2:
        55068: ALF-19915 : MT and WebDAV: Content is lost when uploading non-empty document
   55286: Merged BRANCHES/DEV/BELARUS/HEAD-2013_08_29 to BRANCHES/V4.2:
        55207: ALF-19915 : MT and WebDAV: Content is lost when uploading non-empty document
        55210: ALF-19915 : MT and WebDAV: Content is lost when uploading non-empty document
   55297: As part of prep work for fixing ALF-20023 Recent Sites and Favorite Sites in copy/move pickers empty,
   55299: ALF-19556: IE10 specific fix for file upload browse (impressive how IE finds more and more innovative ways to spoil things for itself)
   55300: Fixed date issue when creating a new process instance
   55308: Resync to HEAD@55302


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@55309 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2013-09-15 15:00:13 +00:00

246 lines
11 KiB
Java

/*
* Copyright (C) 2005-2013 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.repo.preference;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.jscript.ClasspathScriptLocation;
import org.alfresco.repo.model.Repository;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.preference.PreferenceService;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.ScriptLocation;
import org.alfresco.service.cmr.repository.ScriptService;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.util.test.junitrules.AlfrescoPerson;
import org.alfresco.util.test.junitrules.ApplicationContextInit;
import org.alfresco.util.test.junitrules.RunAsFullyAuthenticatedRule;
import org.alfresco.util.test.junitrules.RunAsFullyAuthenticatedRule.RunAsUser;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.RuleChain;
/**
* {@link PreferenceService} implementation unit test
*
* @author Roy Wetherall
* @author Neil Mc Erlean (refactoring to JUnit Rules and enabling disabled tests)
*/
public class PreferenceServiceImplTest
{
private static final Log log = LogFactory.getLog(PreferenceServiceImplTest.class);
// JUnit rule to initialise the default Alfresco spring configuration
@ClassRule public static ApplicationContextInit APP_CONTEXT_INIT = new ApplicationContextInit();
private static final String USERNAME2 = "userBad";
// Rules to create test users. Note that this class is unusual in that we do *NOT* want to reuse users across test methods.
public AlfrescoPerson testUser1 = new AlfrescoPerson(APP_CONTEXT_INIT);
public AlfrescoPerson testUser2 = new AlfrescoPerson(APP_CONTEXT_INIT, USERNAME2);
// A rule to have all test methods be run as "UserOne".
public RunAsFullyAuthenticatedRule runAsRule = new RunAsFullyAuthenticatedRule(testUser1);
// Tie them together in a Rule Chain
@Rule public RuleChain ruleChain = RuleChain.outerRule(testUser1)
.around(testUser2)
.around(runAsRule);
// Various services
private static ContentService CONTENT_SERVICE;
private static PersonService PERSON_SERVICE;
private static PreferenceService PREFERENCE_SERVICE;
private static RetryingTransactionHelper TRANSACTION_HELPER;
private static ScriptService SCRIPT_SERVICE;
private static NodeRef COMPANY_HOME;
@BeforeClass public static void initStaticData() throws Exception
{
CONTENT_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("ContentService", ContentService.class);
PERSON_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("PersonService", PersonService.class);
PREFERENCE_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("PreferenceService", PreferenceService.class);
SCRIPT_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("ScriptService", ScriptService.class);
TRANSACTION_HELPER = APP_CONTEXT_INIT.getApplicationContext().getBean("retryingTransactionHelper", RetryingTransactionHelper.class);
Repository repositoryHelper = (Repository) APP_CONTEXT_INIT.getApplicationContext().getBean("repositoryHelper");
COMPANY_HOME = repositoryHelper.getCompanyHome();
}
@Test public void testPreferences() throws Exception
{
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback<Void>()
{
@Override public Void execute() throws Throwable
{
// Try and get preferences before they have been set
Map<String, Serializable> prefs = PREFERENCE_SERVICE.getPreferences(testUser1.getUsername());
assertNotNull(prefs);
assertEquals(0, prefs.size());
// Lets set some preferences for the user
prefs = new HashMap<String, Serializable>(5);
prefs.put("alfresco.one.alpha", "string");
prefs.put("alfresco.one.beta", 100);
prefs.put("alfresco.two.alpha", 3.142);
prefs.put("alfresco.two.beta", COMPANY_HOME);
prefs.put("alfresco.two.gamma", new Date());
prefs.put("atTheRoot", "thisIsAtTheRoot");
PREFERENCE_SERVICE.setPreferences(testUser1.getUsername(), prefs);
NodeRef personNodeRef = PERSON_SERVICE.getPerson(testUser1.getUsername());
ContentReader reader = CONTENT_SERVICE.getReader(personNodeRef, ContentModel.PROP_PREFERENCE_VALUES);
log.debug("JSON: \n" + prettyJson(reader.getContentString()));
// Try and get all the preferences
prefs = PREFERENCE_SERVICE.getPreferences(testUser1.getUsername(), null);
assertNotNull(prefs);
assertEquals(6, prefs.size());
// Try and get some of the preferences
prefs = PREFERENCE_SERVICE.getPreferences(testUser1.getUsername(), "alfresco.two");
assertNotNull(prefs);
assertEquals(3, prefs.size());
// Clear some of the preferences
PREFERENCE_SERVICE.clearPreferences(testUser1.getUsername(), "alfresco.two");
prefs = PREFERENCE_SERVICE.getPreferences(testUser1.getUsername(), null);
assertNotNull(prefs);
assertEquals(3, prefs.size());
// Clear all the preferences
PREFERENCE_SERVICE.clearPreferences(testUser1.getUsername());
prefs = PREFERENCE_SERVICE.getPreferences(testUser1.getUsername());
assertNotNull(prefs);
assertEquals(0, prefs.size());
return null;
}
});
}
@Test(expected=AccessDeniedException.class)
@RunAsUser(userName=USERNAME2)
public void testBadUser()
{
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback<Void>()
{
@Override public Void execute() throws Throwable
{
Map<String, Serializable> prefs = new HashMap<String, Serializable>(5);
prefs.put("alfresco.one.alpha", "string");
PREFERENCE_SERVICE.setPreferences(testUser1.getUsername(), prefs);
return null;
}
});
}
@Test public void testGetOtherUserPreferences()
{
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback<Void>()
{
@Override public Void execute() throws Throwable
{
// Lets set some preferences for the user one
Map<String, Serializable> prefs = new HashMap<String, Serializable>(5);
prefs.put("alfresco.one.alpha", "string");
prefs.put("alfresco.one.beta", 100);
PREFERENCE_SERVICE.setPreferences(testUser1.getUsername(), prefs);
Map<String, Serializable> userOnePrefs = PREFERENCE_SERVICE.getPreferences(testUser1.getUsername());
assertNotNull(userOnePrefs);
assertEquals(2, prefs.size());
return null;
}
});
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback<Void>()
{
@Override public Void execute() throws Throwable
{
AuthenticationUtil.setFullyAuthenticatedUser(USERNAME2);
// This should not be possible
try
{
PREFERENCE_SERVICE.getPreferences(testUser1.getUsername());
}
catch (AccessDeniedException expected) { return null; }
fail("Expected exception when trying to access another user's prefs");
return null;
}
});
}
// == Test the JavaScript API ==
@Test public void testJSAPI() throws Exception
{
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback<Void>()
{
@Override public Void execute() throws Throwable
{
// This test is running as user1 and the JavaScript needs to know that.
Map<String, Object> model = new HashMap<String, Object>();
model.put("username", testUser1.getUsername());
ScriptLocation location = new ClasspathScriptLocation("org/alfresco/repo/preference/script/test_preferenceService.js");
SCRIPT_SERVICE.executeScript(location, model);
return null;
}
});
}
private String prettyJson(String jsonString)
{
String result = jsonString;
try
{
JSONObject json = new JSONObject(new JSONTokener(jsonString));
result = json.toString(2);
} catch (JSONException ignored)
{
// Intentionally empty
}
return result;
}
}