package com.perforce;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import java.util.Random;
import javax.servlet.ServletContext;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.mock.web.MockServletContext;
import com.perforce.model.License;
import com.perforce.model.Notification;
import com.perforce.model.UserInfo;
import com.perforce.p4java.admin.IProperty;
public class P4HelperTest {
static Logger logger = Logger.getLogger(P4HelperTest.class.getName());
static Properties _props = null;
static P4Helper helper = null;
static UserInfo testUI = null;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
logger.debug("init()");
System.setProperty(Constants.CONFIGURATION_FILE_SYSTEM_PROPERTY, "test.properties");
_props = new Properties();
_props.load(new FileInputStream("test.properties"));
ServletContext context = new MockServletContext();
Enumeration<?> enumeration = _props.propertyNames();
while(enumeration.hasMoreElements()) {
String key = (String)enumeration.nextElement();
context.setAttribute(key, _props.getProperty(key));
}
ServletContextHolder.getInstance().setServletContext(context);
helper = new P4Helper();
helper.configServer();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
testUI = helper.loginUser(_props.getProperty("test.user"), _props.getProperty("test.passwd"));
}
@After
public void tearDown() throws Exception {
}
@Test
public void testUserExists() {
logger.info("### testUserExists");
try {
logger.info("checking existing user");
assertTrue(helper.userExists(_props.getProperty("test.user")));
logger.info("checking non-existant user");
assertFalse(helper.userExists(_props.getProperty("test.baduser")));
} catch (ApplicationException e) {
fail(e.getMessage());
}
}
@Test
public void testLoginUser() {
logger.info("### testLoginUser");
String user = _props.getProperty("test.user");
String pass = _props.getProperty("test.passwd");
try {
logger.info("checking valid credentials");
UserInfo ui = helper.loginUser(user, pass);
assertTrue(ui != null && ui.getTicket() != null && ui.getTicket().length()>0);
} catch (ApplicationException e) {
fail(e.getMessage());
}
}
@Test
public void testGetGroups() {
logger.info("### testGetGroups");
try {
List<String> groups = helper.getGroups(true);
for (String g : groups) {
logger.info("group: " + g);
}
} catch (ApplicationException e) {
fail(e.getMessage());
}
}
@Test
public void testGetUserGroups() {
logger.info("### testGetUserGroups");
String user = _props.getProperty("test.user");
try {
List<String> groups = helper.getUserGroups(user, true);
for (String g : groups) {
logger.info("group: " + g);
}
} catch (ApplicationException e) {
fail(e.getMessage());
}
}
@Test
public void testIsAdmin() {
logger.info("### testIsAdmin");
String adminUser = _props.getProperty(Constants.ADMINUSER);
String nonAdminUser = _props.getProperty("test.user");
try {
logger.info("checking admin user");
assertTrue(helper.isAdmin(adminUser));
logger.info("checking non-admin user");
assertFalse(helper.isAdmin(nonAdminUser));
} catch (ApplicationException e) {
fail(e.getMessage());
}
}
@Test
public void testIsServerStoringPasswords() {
logger.info("### TEST: testIsServerStoringPasswords");
boolean expected = Boolean.parseBoolean(_props.getProperty(Constants.PERFORCE_PASSWORDS));
assertEquals(expected, helper.isServerStoringPasswords());
}
@Test
public void testChangePassword() {
logger.info("### TEST: changePassword");
String user = _props.getProperty("test.user");
String currentPass = _props.getProperty("test.passwd");
String randomPass = randomString(10);
try {
logger.info("changing password to " + randomPass);
helper.changePassword(user, randomPass);
logger.info("checking password with login");
UserInfo ui = helper.loginUser(user, randomPass);
assertTrue(ui != null && ui.getTicket() != null && ui.getTicket().length()>0);
logger.info("restoring original user password");
helper.changePassword(user, currentPass);
logger.info("checking password with login");
ui = helper.loginUser(user, currentPass);
assertTrue(ui != null && ui.getTicket() != null && ui.getTicket().length()>0);
} catch (ApplicationException e) {
fail(e.getMessage());
}
}
static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static Random rnd = new Random();
private String randomString(int length) {
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++)
sb.append(AB.charAt(rnd.nextInt(AB.length())));
return sb.toString();
}
@Test
public void testGetServerLicense() throws Exception {
try {
License lic = helper.getServerLicense();
assertFalse(lic.isLicensed());
assertTrue(lic.canAddUser());
} catch (ApplicationException e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@Test
public void testIsEnforceUniqueEmails() throws Exception {
logger.info("### TEST: testIsEnforceUniqueEmails");
boolean expected = Boolean.parseBoolean(_props.getProperty(Constants.UNIQUE_EMAILS));
assertEquals(expected, helper.isEnforceUniqueEmails());
}
@Test
public void testGetProperties() throws Exception {
logger.info("### TEST: testGetProperties");
List<IProperty> properties = helper.getProperties();
for(IProperty p : properties) {
logger.debug(String.format("%s : %s", p.getName(), p.getValue()));
}
}
@Test
public void testGetUserProperties() throws Exception {
logger.info("### TEST: testGetUserProperties");
List<IProperty> properties = helper.getUserProperties(testUI);
for(IProperty p : properties) {
logger.debug(String.format("%s : %s", p.getName(), p.getValue()));
}
}
@Test
public void testSetAccountRequest() throws Exception {
logger.info("### TEST: testSetAccountRequest");
UserInfo ui = new UserInfo();
ui.setName("user1");
ui.setFullName("User Name");
ui.setEmail("user@host.com");
ui.setPassword("userpassword");
helper.setAccountRequest(ui);
List<IProperty> propList = helper.getProperties("approval.account", null, null);
for(IProperty p : propList) {
logger.info(String.format("%s : %s", p.getName(), p.getValue()));
}
}
@Test
public void testCreateUser() throws Exception {
logger.info("### TEST: testCreateUser");
UserInfo ui = new UserInfo();
ui.setName("user1");
ui.setFullName("User Name");
ui.setEmail("user@host.com");
ui.setPassword("p@ssw0rd");
helper.createUser(ui);
assertTrue(helper.userExists(ui.getName()));
helper.deleteUser(ui.getName());
assertFalse(helper.userExists(ui.getName()));
}
@Test
public void testDeleteUser() throws Exception {
logger.info("### TEST: testCreateUser");
UserInfo ui = new UserInfo();
ui.setName("user1");
ui.setFullName("User Name");
ui.setEmail("user@host.com");
ui.setPassword("p@ssw0rd");
helper.createUser(ui);
assertTrue(helper.userExists(ui.getName()));
helper.deleteUser(ui.getName());
assertFalse(helper.userExists(ui.getName()));
}
@Test
public void testCreateGroup() throws Exception {
logger.info("### TEST: testCreateGroup");
String groupname = _props.getProperty("test.group");
if(!helper.groupExists(groupname)) {
List<String> owners = new ArrayList<String>();
owners.add("user1");
owners.add("user2");
List<String> members = new ArrayList<String>();
members.add("user3");
members.add("user4");
helper.createGroup("testGroup", owners, members);
} else {
logger.info("group already exists... skipping test");
}
}
@Test
public void testDeleteGroup() throws Exception {
logger.info("### TEST: testDeleteGroup");
String groupname = _props.getProperty("test.group");
if(helper.groupExists(groupname)) {
helper.deleteGroup("testGroup");
} else {
logger.info("group does not exist... skipping test");
}
}
@Test
public void testAddUserToGroup() throws Exception {
logger.info("### TEST: testAddUserToGroup");
testDeleteGroup();
testCreateGroup();
String user = _props.getProperty("test.user");
String group = _props.getProperty("test.group");
helper.addUserToGroup(user,group);
List<String> groups = helper.getUserGroups(user, false);
assertTrue("User is not in the group", groups.contains(group));
}
@Test
public void testRemoveUserFromGroup() throws Exception {
logger.info("### TEST: testRemoveUserFromGroup");
String user = _props.getProperty("test.user");
String group = _props.getProperty("test.group");
if(helper.groupExists(group)) {
helper.removeUserFromGroup(user, group);
List<String> groups = helper.getUserGroups(user, false);
assertFalse("User was not removed from the group", groups.contains(group));
} else {
logger.info("group does not exist... skipping test");
}
}
@Test
public void testRequestPasswordReset() throws Exception {
logger.info("### TEST: testRequestPasswordReset");
String user = _props.getProperty("test.user");
String uuid = helper.requestPasswordReset(user);
logger.info(uuid);
}
@Test
public void testGetHiddenGroups() throws Exception {
logger.info("### TEST: testGetHiddenGroups");
List<String> hidden = helper.getHiddenGroups();
String hiddenProp = _props.getProperty(Constants.HIDDEN_GROUPS);
List<String> hiddenArr = Arrays.asList(hiddenProp.split(","));
for(String g : hidden) {
assertTrue(hiddenArr.contains(g));
}
}
@Test
public void testGetGroupRequests() throws Exception {
logger.info("### TEST: testGetGroupRequests");
helper.getGroupRequests(_props.getProperty("test.group"));
}
@Test
public void testGetUserGroupRequest() throws Exception {
logger.info("### TEST: testGetUserGroupRequest");
String user = _props.getProperty("test.user");
String group = _props.getProperty("test.group");
helper.setUserGroupRequest(user, group);
List<IProperty> requests = helper.getUserGroupRequests(user, null);
for(IProperty p : requests) {
logger.debug(p.getName());
}
}
@Test
public void testAddUserNotification() throws Exception {
logger.info("### TEST: testAddUserNotification");
String user = _props.getProperty("test.user");
String message = "SAMPLE NOTIFICATION";
Notification notification = new Notification(message);
helper.addUserNotification(user, notification);
}
@Test
public void testGetNotifications() throws Exception {
logger.info("### TEST: testGetNotifications");
String user = _props.getProperty("test.user");
List<Notification> notifications = helper.getNotifications(user);
if(notifications != null) {
logger.debug("num notifications: " + notifications.size());
for(Notification n : notifications) {
logger.debug(n.getSequence() + " " + n.getMessage() + "(" + n.getType() + ")");
}
}
}
}