/*
* (C) Copyright 2014 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed under the Apache 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.apache.org/licenses/LICENSE-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.
*
* Contributors:
* Nicolas Chapurlat <nchapurlat@nuxeo.com>
*/
package org.nuxeo.ecm.platform.usermanager;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.Serializable;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.inject.Inject;
import org.apache.commons.lang.SerializationUtils;
import org.junit.Before;
import org.junit.Test;
import org.nuxeo.ecm.core.api.CoreSession;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.NuxeoGroup;
import org.nuxeo.ecm.core.api.NuxeoPrincipal;
import org.nuxeo.ecm.core.api.impl.NuxeoGroupImpl;
import org.nuxeo.ecm.core.api.validation.DocumentValidationService;
import org.nuxeo.ecm.core.schema.types.SimpleType;
import org.nuxeo.ecm.core.schema.types.resolver.ObjectResolver;
import org.nuxeo.runtime.test.runner.LocalDeploy;
@LocalDeploy({ "org.nuxeo.ecm.platform.usermanager.tests:test-usermanagerimpl/directory-config.xml",
"org.nuxeo.ecm.platform.usermanager.tests:test-usermanager-resolver.xml" })
public class TestUserManagerResolver extends UserManagerTestCase {
private static final String USER_XPATH = "umr:user";
private static final String GROUP_XPATH = "umr:group";
private static final String USER_GROUP_XPATH = "umr:userOrGroup";
@Inject
protected CoreSession session;
@Inject
protected DocumentValidationService validator;
protected DocumentModel doc;
@Before
public void setUp() throws Exception {
doc = session.createDocumentModel("/", "doc1", "TestResolver");
}
@Test
public void defaultSupportedClasses() throws Exception {
List<Class<?>> classes = new UserManagerResolver().getManagedClasses();
assertEquals(2, classes.size());
assertTrue(classes.contains(NuxeoPrincipal.class));
assertTrue(classes.contains(NuxeoGroup.class));
}
@Test
public void userAndGroupSupportedClasses() throws Exception {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
umr.configure(parameters);
List<Class<?>> classes = umr.getManagedClasses();
assertEquals(2, classes.size());
assertTrue(classes.contains(NuxeoPrincipal.class));
assertTrue(classes.contains(NuxeoGroup.class));
}
@Test
public void userSupportedClasses() throws Exception {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_USER);
umr.configure(parameters);
List<Class<?>> classes = umr.getManagedClasses();
assertEquals(1, classes.size());
assertTrue(classes.contains(NuxeoPrincipal.class));
}
@Test
public void groupSupportedClasses() throws Exception {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_GROUP);
umr.configure(parameters);
List<Class<?>> classes = umr.getManagedClasses();
assertEquals(1, classes.size());
assertTrue(classes.contains(NuxeoGroup.class));
}
@Test(expected = IllegalStateException.class)
public void testLifecycleNoConfigurationFetch() {
new UserManagerResolver().fetch("usr:Administrator");
}
@Test(expected = IllegalStateException.class)
public void testLifecycleNoConfigurationFetchCast() {
new UserManagerResolver().fetch(NuxeoPrincipal.class, "usr:Administrator");
}
@Test(expected = IllegalStateException.class)
public void testLifecycleNoConfigurationGetReference() {
new UserManagerResolver().getReference(userManager.getPrincipal("Administrator"));
}
@Test(expected = IllegalStateException.class)
public void testLifecycleNoConfigurationGetParameters() {
new UserManagerResolver().getParameters();
}
@Test(expected = IllegalStateException.class)
public void testLifecycleNoConfigurationGetConstraintErrorMessage() {
new UserManagerResolver().getConstraintErrorMessage(null, Locale.ENGLISH);
}
@Test(expected = IllegalStateException.class)
public void testLifecycleConfigurationTwice() {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
umr.configure(parameters);
umr.configure(parameters);
}
@Test
public void testConfigurationDefaultUserOrGroup() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertTrue(umr.isIncludingGroups());
assertTrue(umr.isIncludingUsers());
Map<String, Serializable> outputParameters = umr.getParameters();
assertEquals(true, outputParameters.get(UserManagerResolver.PARAM_INCLUDE_GROUPS));
assertEquals(true, outputParameters.get(UserManagerResolver.PARAM_INCLUDE_USERS));
}
@Test
public void testConfigurationUser() {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_USER);
umr.configure(parameters);
assertFalse(umr.isIncludingGroups());
assertTrue(umr.isIncludingUsers());
Map<String, Serializable> outputParameters = umr.getParameters();
assertEquals(false, outputParameters.get(UserManagerResolver.PARAM_INCLUDE_GROUPS));
assertEquals(true, outputParameters.get(UserManagerResolver.PARAM_INCLUDE_USERS));
}
@Test
public void testConfigurationGroup() {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_GROUP);
umr.configure(parameters);
assertTrue(umr.isIncludingGroups());
assertFalse(umr.isIncludingUsers());
Map<String, Serializable> outputParameters = umr.getParameters();
assertEquals(true, outputParameters.get(UserManagerResolver.PARAM_INCLUDE_GROUPS));
assertEquals(false, outputParameters.get(UserManagerResolver.PARAM_INCLUDE_USERS));
}
@Test
public void testName() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertEquals(UserManagerResolver.NAME, umr.getName());
}
@Test
public void testValidateGoodUserWithDefaultConf() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertTrue(umr.validate("user:Administrator"));
}
@Test
public void testValidateGoodUserWithFilterUser() {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_USER);
umr.configure(parameters);
assertTrue(umr.validate("user:Administrator"));
}
@Test
public void testValidateUserFailedWithBadValue() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertFalse(umr.validate("toto"));
}
@Test
public void testValidateUserSucceedWithoutPrefix() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertTrue(umr.validate("Administrator"));
}
@Test
public void testValidateUserFailedWithFilterGroup() {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_GROUP);
umr.configure(parameters);
assertFalse(umr.validate("user:Administrator"));
}
@Test
public void testValidateGoodGroupWithDefaultConf() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertTrue(umr.validate("group:members"));
}
@Test
public void testValidateGoodGroupWithFilterGroup() {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_GROUP);
umr.configure(parameters);
assertTrue(umr.validate("group:members"));
}
@Test
public void testValidateGroupFailedWithBadValue() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertFalse(umr.validate("toto"));
}
@Test
public void testValidateGroupSucceedWithoutPrefix() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertTrue(umr.validate("members"));
}
@Test
public void testValidateGroupFailedWithFilterGroup() {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_USER);
umr.configure(parameters);
assertFalse(umr.validate("group:members"));
}
@Test
public void testFetchGoodUserWithDefaultConf() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
Object entity = umr.fetch("user:Administrator");
assertTrue(entity instanceof NuxeoPrincipal);
assertEquals("Administrator", ((NuxeoPrincipal) entity).getName());
}
@Test
public void testFetchGoodUserWithFilterUser() {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_USER);
umr.configure(parameters);
Object entity = umr.fetch("user:Administrator");
assertTrue(entity instanceof NuxeoPrincipal);
assertEquals("Administrator", ((NuxeoPrincipal) entity).getName());
}
@Test
public void testFetchUserFailedWithBadValue() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertNull(umr.fetch("user:toto"));
}
@Test
public void testFetchUserSucceedWithoutPrefix() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertNotNull(umr.fetch("Administrator"));
}
@Test
public void testFetchUserFailedWithFilterGroup() {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_GROUP);
umr.configure(parameters);
assertNull(umr.fetch("user:Administrator"));
}
@Test
public void testFetchGoodGroupWithDefaultConf() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
Object entity = umr.fetch("group:members");
assertTrue(entity instanceof NuxeoGroup);
assertEquals("members", ((NuxeoGroup) entity).getName());
}
@Test
public void testFetchGoodGroupWithFilterGroup() {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_GROUP);
umr.configure(parameters);
Object entity = umr.fetch("group:members");
assertTrue(entity instanceof NuxeoGroup);
assertEquals("members", ((NuxeoGroup) entity).getName());
}
@Test
public void testFetchGroupFailedWithBadValue() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertNull(umr.fetch("group:toto"));
}
@Test
public void testFetchGroupSucceedWithoutPrefix() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertNotNull(umr.fetch("members"));
}
@Test
public void testFetchGroupFailedWithFilterUser() {
UserManagerResolver umr = new UserManagerResolver();
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_USER);
umr.configure(parameters);
assertNull(umr.fetch("group:members"));
}
@Test
public void testFetchCastNuxeoPrincipal() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
NuxeoPrincipal principal = umr.fetch(NuxeoPrincipal.class, "user:Administrator");
assertNotNull(principal);
assertEquals("Administrator", principal.getName());
assertNotNull(umr.fetch(NuxeoPrincipal.class, "Administrator"));
assertNull(umr.fetch(NuxeoPrincipal.class, "user:toto"));
assertNull(umr.fetch(NuxeoPrincipal.class, "group:members"));
}
@Test
public void testFetchCastNuxeoGroup() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
NuxeoGroup group = umr.fetch(NuxeoGroup.class, "group:members");
assertNotNull(group);
assertEquals("members", group.getName());
assertNotNull(umr.fetch(NuxeoGroup.class, "members"));
assertNull(umr.fetch(NuxeoGroup.class, "group:toto"));
assertNull(umr.fetch(NuxeoGroup.class, "user:Administrator"));
}
@Test
public void testFetchCastDoesntSupportDocumentModel() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertNull(umr.fetch(DocumentModel.class, "user:Administrator"));
}
@Test
public void testFetchCastDoesntSupportStupidTypes() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertNull(umr.fetch(List.class, "user:Administrator"));
}
@Test
public void testGetReferenceUser() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
NuxeoPrincipal principal = userManager.getPrincipal("Administrator");
assertEquals("user:Administrator", umr.getReference(principal));
}
@Test
public void testGetReferenceGroup() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
NuxeoGroup group = userManager.getGroup("members");
assertEquals("group:members", umr.getReference(group));
}
@Test
public void testGetReferenceWithNonExistingUserWorks() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
NuxeoPrincipal principal = new NuxeoPrincipalImpl("chaps");
assertEquals("user:chaps", umr.getReference(principal));
}
@Test
public void testGetReferenceWithNonExistingGroupWorks() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
NuxeoGroup group = new NuxeoGroupImpl("chaps");
assertEquals("group:chaps", umr.getReference(group));
}
@Test
public void testGetReferenceInvalid() {
UserManagerResolver umr = new UserManagerResolver();
umr.configure(new HashMap<String, String>());
assertNull(umr.getReference("nothing"));
}
@Test
public void testConfigurationIsLoaded() {
UserManagerResolver userResolver = (UserManagerResolver) ((SimpleType) doc.getProperty(USER_XPATH).getType()).getObjectResolver();
assertTrue(userResolver.isIncludingUsers());
assertFalse(userResolver.isIncludingGroups());
UserManagerResolver groupResolver = (UserManagerResolver) ((SimpleType) doc.getProperty(GROUP_XPATH).getType()).getObjectResolver();
assertFalse(groupResolver.isIncludingUsers());
assertTrue(groupResolver.isIncludingGroups());
UserManagerResolver anyResolver = (UserManagerResolver) ((SimpleType) doc.getProperty(USER_GROUP_XPATH).getType()).getObjectResolver();
assertTrue(anyResolver.isIncludingUsers());
assertTrue(anyResolver.isIncludingGroups());
}
@Test
public void testTypeHasResolver() {
ObjectResolver resolver;
resolver = doc.getProperty(USER_XPATH).getType().getObjectResolver();
assertNotNull(resolver);
assertTrue(resolver instanceof UserManagerResolver);
resolver = doc.getProperty(GROUP_XPATH).getType().getObjectResolver();
assertNotNull(resolver);
assertTrue(resolver instanceof UserManagerResolver);
resolver = doc.getProperty(USER_GROUP_XPATH).getType().getObjectResolver();
assertNotNull(resolver);
assertTrue(resolver instanceof UserManagerResolver);
}
@Test
public void testNullValueReturnNull() {
assertNull(doc.getObjectResolver(USER_XPATH).fetch());
assertNull(doc.getObjectResolver(USER_XPATH).fetch(DocumentModel.class));
assertNull(doc.getProperty(USER_XPATH).getObjectResolver().fetch());
assertNull(doc.getProperty(USER_XPATH).getObjectResolver().fetch(DocumentModel.class));
assertNull(doc.getObjectResolver(GROUP_XPATH).fetch());
assertNull(doc.getObjectResolver(GROUP_XPATH).fetch(DocumentModel.class));
assertNull(doc.getProperty(GROUP_XPATH).getObjectResolver().fetch());
assertNull(doc.getProperty(GROUP_XPATH).getObjectResolver().fetch(DocumentModel.class));
assertNull(doc.getObjectResolver(USER_GROUP_XPATH).fetch());
assertNull(doc.getObjectResolver(USER_GROUP_XPATH).fetch(DocumentModel.class));
assertNull(doc.getProperty(USER_GROUP_XPATH).getObjectResolver().fetch());
assertNull(doc.getProperty(USER_GROUP_XPATH).getObjectResolver().fetch(DocumentModel.class));
}
@Test
public void testBadValuesValidationFailed() {
doc.setPropertyValue(USER_XPATH, "totoDoesntExists");
assertNull(doc.getProperty(USER_XPATH).getObjectResolver().fetch());
assertFalse(doc.getProperty(USER_XPATH).getObjectResolver().validate());
doc.setPropertyValue(GROUP_XPATH, "totoDoesntExists");
assertNull(doc.getProperty(GROUP_XPATH).getObjectResolver().fetch());
assertFalse(doc.getProperty(GROUP_XPATH).getObjectResolver().validate());
doc.setPropertyValue(USER_GROUP_XPATH, "totoDoesntExists");
assertNull(doc.getProperty(USER_GROUP_XPATH).getObjectResolver().fetch());
assertFalse(doc.getProperty(USER_GROUP_XPATH).getObjectResolver().validate());
assertEquals(3, validator.validate(doc).numberOfErrors());
}
@Test
public void testUserCorrectValues() {
doc.setPropertyValue(USER_XPATH, "user:Administrator");
NuxeoPrincipal principal = (NuxeoPrincipal) doc.getProperty(USER_XPATH).getObjectResolver().fetch();
assertNotNull(principal);
assertEquals("Administrator", principal.getName());
principal = doc.getProperty(USER_XPATH).getObjectResolver().fetch(NuxeoPrincipal.class);
assertNotNull(principal);
assertEquals("Administrator", principal.getName());
principal = (NuxeoPrincipal) doc.getObjectResolver(USER_XPATH).fetch();
assertNotNull(principal);
assertEquals("Administrator", principal.getName());
principal = doc.getObjectResolver(USER_XPATH).fetch(NuxeoPrincipal.class);
assertNotNull(principal);
assertEquals("Administrator", principal.getName());
}
@Test
public void testUserDoesntSupportGroup() {
doc.setPropertyValue(USER_XPATH, "group:members");
assertNull(doc.getProperty(USER_XPATH).getObjectResolver().fetch());
}
@Test
public void testUserNoPrefixWorks() {
doc.setPropertyValue(USER_XPATH, "Administrator");
assertNotNull(doc.getProperty(USER_XPATH).getObjectResolver().fetch());
}
@Test
public void testUserOrGroupSupportsUser() {
doc.setPropertyValue(USER_GROUP_XPATH, "user:Administrator");
assertNotNull(doc.getProperty(USER_GROUP_XPATH).getObjectResolver());
}
@Test
public void testGroupCorrectValues() {
doc.setPropertyValue(GROUP_XPATH, "group:members");
NuxeoGroup group = (NuxeoGroup) doc.getProperty(GROUP_XPATH).getObjectResolver().fetch();
assertNotNull(group);
assertEquals("members", group.getName());
group = doc.getProperty(GROUP_XPATH).getObjectResolver().fetch(NuxeoGroup.class);
assertNotNull(group);
assertEquals("members", group.getName());
group = (NuxeoGroup) doc.getObjectResolver(GROUP_XPATH).fetch();
assertNotNull(group);
assertEquals("members", group.getName());
group = doc.getObjectResolver(GROUP_XPATH).fetch(NuxeoGroup.class);
assertNotNull(group);
assertEquals("members", group.getName());
}
@Test
public void testGroupFieldDoesntSupportUser() {
doc.setPropertyValue(GROUP_XPATH, "user:Administrator");
assertNull(doc.getProperty(GROUP_XPATH).getObjectResolver().fetch());
}
@Test
public void testGroupNoPrefixWorks() {
doc.setPropertyValue(GROUP_XPATH, "members");
assertNotNull(doc.getProperty(GROUP_XPATH).getObjectResolver().fetch());
}
@Test
public void testUserOrGroupSupportsGroup() {
doc.setPropertyValue(USER_GROUP_XPATH, "group:members");
assertNotNull(doc.getProperty(USER_GROUP_XPATH).getObjectResolver().fetch());
}
@Test
public void testTranslation() {
UserManagerResolver allUMR = new UserManagerResolver();
allUMR.configure(new HashMap<String, String>());
checkMessage(allUMR);
UserManagerResolver userUMR = new UserManagerResolver();
Map<String, String> userParams = new HashMap<String, String>();
userParams.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_USER);
userUMR.configure(userParams);
checkMessage(userUMR);
UserManagerResolver groupUMR = new UserManagerResolver();
Map<String, String> groupParams = new HashMap<String, String>();
groupParams.put(UserManagerResolver.INPUT_PARAM_FILTER, UserManagerResolver.FILTER_GROUP);
groupUMR.configure(groupParams);
checkMessage(groupUMR);
}
@Test
public void testSerialization() throws Exception {
// create it
UserManagerResolver resolver = new UserManagerResolver();
resolver.configure(new HashMap<String, String>());
// write it
byte[] buffer = SerializationUtils.serialize(resolver);
// forget the resolver
resolver = null;
// read it
Object readObject = SerializationUtils.deserialize(buffer);
// check it's a dir resolver
assertTrue(readObject instanceof UserManagerResolver);
UserManagerResolver readResolver = (UserManagerResolver) readObject;
// check the configuration
assertTrue(readResolver.isIncludingGroups());
assertTrue(readResolver.isIncludingUsers());
Map<String, Serializable> outputParameters = readResolver.getParameters();
assertEquals(true, outputParameters.get(UserManagerResolver.PARAM_INCLUDE_GROUPS));
assertEquals(true, outputParameters.get(UserManagerResolver.PARAM_INCLUDE_USERS));
// test it works: validate
assertTrue(readResolver.validate("user:Administrator"));
// test it works: fetch
Object entity = readResolver.fetch("user:Administrator");
assertTrue(entity instanceof NuxeoPrincipal);
assertEquals("Administrator", ((NuxeoPrincipal) entity).getName());
// test it works: getReference
NuxeoPrincipal principal = userManager.getPrincipal("Administrator");
assertEquals("user:Administrator", readResolver.getReference(principal));
}
private void checkMessage(UserManagerResolver umr) {
for (Locale locale : Arrays.asList(Locale.FRENCH, Locale.ENGLISH)) {
String message = umr.getConstraintErrorMessage("abc123", locale);
assertNotNull(message);
assertFalse(message.trim().isEmpty());
System.out.println(message);
}
}
}