/****************************************************************
* Copyright (C) 2006 LAMS Foundation (http://lamsfoundation.org)
* =============================================================
* License Information: http://lamsfoundation.org/licensing/lams/2.0/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2.0
* as published by the Free Software Foundation.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*
* http://www.gnu.org/licenses/gpl.txt
* ****************************************************************
*/
package org.lamsfoundation.testharness;
import java.io.File;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.codec.binary.Hex;
import org.apache.log4j.Logger;
import org.xml.sax.SAXException;
import com.meterware.httpunit.WebConversation;
import com.meterware.httpunit.WebForm;
import com.meterware.httpunit.WebResponse;
import com.meterware.httpunit.protocol.UploadFileSpec;
/**
* @version
*
*
* View Source
*
*
* @author Fei Yang
*/
public class MockUser {
private static final Logger log = Logger.getLogger(MockUser.class);
private static final String[] DELAY_MESSAGES = { " is deserting ", " is napping ", " is pondering ",
" is in a daze ", " will have a cup of coffee for ", " is away for toilet " };
private static final String LOGIN_PAGE_FLAG = "j_security_check";
private static final String INDEX_PAGE_FLAG = "images/loading.gif";
private static final String USERNAME = "j_username";
private static final String PASSWORD = "j_password";
private static String indexPage;
protected AbstractTest test;
protected String userId;
protected String username;
protected String password;
protected WebConversation wc;
public MockUser(AbstractTest test, String username, String password, String userId) {
this.test = test;
this.username = username;
this.password = password;
this.userId = userId;
}
public static final void setIndexPage(String indexPageURL) {
MockUser.indexPage = indexPageURL;
}
/**
* Login to the system.
*
* @exception TestHarnessException:failure
*/
public final void login() {
try {
wc = new WebConversation();
WebResponse resp = (WebResponse) new Call(wc, test, username + " fetch index page", MockUser.indexPage)
.execute();
if (!checkPageContains(resp, MockUser.LOGIN_PAGE_FLAG)) {
MockUser.log.debug(resp.getText());
throw new TestHarnessException(username + " didn't get login page when hitting LAMS the first time!");
}
Map params = new HashMap();
params.put(MockUser.USERNAME, username);
params.put(MockUser.PASSWORD, HashUtil.sha1(password));
resp = (WebResponse) new Call(wc, test, "User login", fillForm(resp, 0, params)).execute();
if (!checkPageContains(resp, MockUser.INDEX_PAGE_FLAG)) {
MockUser.log.debug(resp.getText());
throw new TestHarnessException(username + " failed to login with password " + password);
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (SAXException e) {
throw new RuntimeException(e);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
protected final WebForm fillForm(WebResponse resp, int formIndex, Map params) throws SAXException,
IOException {
WebForm[] forms = resp.getForms();
if (forms == null || forms.length <= formIndex) {
MockUser.log.debug(resp.getText());
throw new TestHarnessException(username + " cannot find the form whose index is " + formIndex
+ " in the page");
}
WebForm form = forms[formIndex];
if (params != null) {
for (Map.Entry entry : params.entrySet()) {
Object value = entry.getValue();
if (value instanceof String) {
form.setParameter(entry.getKey(), (String) entry.getValue());
} else if (value instanceof File) {
form.setParameter(entry.getKey(), (File) entry.getValue());
} else if (value instanceof String[]) {
form.setParameter(entry.getKey(), (String[]) entry.getValue());
} else if (value instanceof UploadFileSpec[]) {
form.setParameter(entry.getKey(), (UploadFileSpec[]) entry.getValue());
} else {
throw new TestHarnessException("Unsupported parameter value type:"
+ entry.getValue().getClass().getName());
}
}
}
return form;
}
protected final boolean checkPageContains(WebResponse resp, String flag) throws IOException {
return resp.getText().indexOf(flag) != -1;
}
protected final void delay() {
try {
int seconds;
if (test.getMaxDelay() <= test.getMinDelay()) {// to avoid IllegalArgumentException in nextInt method on
// Random object
seconds = test.getMinDelay();
} else {
seconds = test.getMinDelay()
+ TestUtil.generateRandomIndex(test.getMaxDelay() - test.getMinDelay() + 1);
}
if (seconds > 0) {
MockUser.log.info(composeDelayInfo(seconds));
Thread.sleep(seconds * 1000);
}
} catch (InterruptedException e) {
// ignore
}
}
private String composeDelayInfo(int seconds) {
return username + MockUser.DELAY_MESSAGES[TestUtil.generateRandomIndex(MockUser.DELAY_MESSAGES.length)]
+ seconds + (seconds == 1 ? " second" : " seconds");
}
private static class HashUtil {
static String sha1(String plaintext) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA1");
return new String(Hex.encodeHex(md.digest(plaintext.getBytes())));
}
static String md5(String plaintext) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
return new String(Hex.encodeHex(md.digest(plaintext.getBytes())));
}
}
public final String getPassword() {
return password;
}
public final String getUsername() {
return username;
}
public final String getUserId() {
return userId;
}
public final void setUserId(String userId) {
this.userId = userId;
}
}