Index: TestHarness4LAMS2/.classpath =================================================================== diff -u -r044d2c0977e88053366db9cecba68192a6cebe5a -rd1613469baf410358fffc018b070d1a726df5391 --- TestHarness4LAMS2/.classpath (.../.classpath) (revision 044d2c0977e88053366db9cecba68192a6cebe5a) +++ TestHarness4LAMS2/.classpath (.../.classpath) (revision d1613469baf410358fffc018b070d1a726df5391) @@ -13,5 +13,12 @@ + + + + + + + Index: TestHarness4LAMS2/lib/jboss-logging-3.1.4.GA.jar =================================================================== diff -u Binary files differ Index: TestHarness4LAMS2/lib/jboss-websocket-api_1.1_spec-1.1.0.Final.jar =================================================================== diff -u Binary files differ Index: TestHarness4LAMS2/lib/undertow-core-1.1.8.Final.jar =================================================================== diff -u Binary files differ Index: TestHarness4LAMS2/lib/undertow-servlet-1.1.8.Final.jar =================================================================== diff -u Binary files differ Index: TestHarness4LAMS2/lib/undertow-websockets-jsr-1.1.8.Final.jar =================================================================== diff -u Binary files differ Index: TestHarness4LAMS2/lib/xnio-api-3.3.0.Final.jar =================================================================== diff -u Binary files differ Index: TestHarness4LAMS2/lib/xnio-nio-3.3.0.Final.jar =================================================================== diff -u Binary files differ Index: TestHarness4LAMS2/src/org/lamsfoundation/testharness/learner/MockLearner.java =================================================================== diff -u -ra240eabaa5f16d93b5e21422951351b3702924a8 -rd1613469baf410358fffc018b070d1a726df5391 --- TestHarness4LAMS2/src/org/lamsfoundation/testharness/learner/MockLearner.java (.../MockLearner.java) (revision a240eabaa5f16d93b5e21422951351b3702924a8) +++ TestHarness4LAMS2/src/org/lamsfoundation/testharness/learner/MockLearner.java (.../MockLearner.java) (revision d1613469baf410358fffc018b070d1a726df5391) @@ -24,7 +24,6 @@ import java.io.File; import java.io.IOException; -import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -35,7 +34,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.websocket.MessageHandler; + import org.apache.log4j.Logger; +import org.apache.tomcat.util.json.JSONException; +import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.testharness.Call; import org.lamsfoundation.testharness.MockUser; import org.lamsfoundation.testharness.TestHarnessException; @@ -67,7 +70,7 @@ private static final String LESSON_FINISHED_FLAG = "LessonComplete.do"; private static final String LOAD_TOOL_ACTIVITY_FLAG = "Load Tool Activity"; private static final Pattern SESSION_MAP_ID_PATTERN = Pattern.compile("sessionMapID=(.+)\\&"); - private static final Pattern TOOL_SESSION_ID_PATTERN = Pattern.compile("var TOOL_SESSION_ID = '(\\d+)'"); + private static final Pattern TOOL_SESSION_ID_PATTERN = Pattern.compile("TOOL_SESSION_ID = '(\\d+)'"); private static final String FINISH_SUBSTRING = "finish.do"; private static final String FORUM_FINISH_SUBSTRING = "lafrum11/learning/finish.do"; @@ -510,6 +513,7 @@ return nextResp; } + @SuppressWarnings("deprecation") private void handleToolChat(WebResponse resp) throws IOException { String asText = resp.getText(); Matcher m = MockLearner.TOOL_SESSION_ID_PATTERN.matcher(asText); @@ -518,14 +522,32 @@ return; } - String url = MockLearner.CHAT_FINISH_SUBSTRING + "?dispatch=sendMessage&toolSessionID=" + m.group(1) - + "&message="; - // send few messages - for (int replyIndex = 0; replyIndex < MockLearner.CHAT_REPLIES; replyIndex++) { - String message = MockLearner.composeArbitraryText(); - message = URLEncoder.encode(message, "UTF-8"); - new Call(wc, test, username + " sends Chat message", url + message).execute(); - delay(); + String toolSessionID = m.group(1); + String url = test.getTestSuite().getTargetServer().replace("http", "ws") + + "/lams/tool/lachat11/learningWebsocket?toolSessionID=" + toolSessionID; + String sessionID = wc.getCookieJar().getCookieValue("JSESSIONID"); + WebsocketClient websocketClient = new WebsocketClient(url, sessionID, new MessageHandler.Whole() { + @Override + public void onMessage(String message) { + log.debug(username + " received Chat " + toolSessionID + " history from server: " + message); + } + }); + + // send few messages to the whole group + JSONObject messageJSON = new JSONObject(); + try { + messageJSON.put("toolSessionID", toolSessionID); + messageJSON.put("toUser", ""); + for (int replyIndex = 0; replyIndex < MockLearner.CHAT_REPLIES; replyIndex++) { + String message = MockLearner.composeArbitraryText(); + messageJSON.put("message", message); + // send message to websocket + websocketClient.sendMessage(messageJSON.toString()); + delay(); + } + websocketClient.close(); + } catch (JSONException e) { + throw new IOException("Error while creating Chat JSON for websocket", e); } } Index: TestHarness4LAMS2/src/org/lamsfoundation/testharness/learner/WebsocketClient.java =================================================================== diff -u --- TestHarness4LAMS2/src/org/lamsfoundation/testharness/learner/WebsocketClient.java (revision 0) +++ TestHarness4LAMS2/src/org/lamsfoundation/testharness/learner/WebsocketClient.java (revision d1613469baf410358fffc018b070d1a726df5391) @@ -0,0 +1,79 @@ +package org.lamsfoundation.testharness.learner; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import javax.websocket.ClientEndpointConfig; +import javax.websocket.ClientEndpointConfig.Builder; +import javax.websocket.ClientEndpointConfig.Configurator; +import javax.websocket.ContainerProvider; +import javax.websocket.DeploymentException; +import javax.websocket.Endpoint; +import javax.websocket.EndpointConfig; +import javax.websocket.MessageHandler; +import javax.websocket.Session; +import javax.websocket.WebSocketContainer; + +/** + * Simple websocket client for TestHarness purposes. + * Uses Undertow libraries. + * + * @author Marcin Cieslak + */ +public class WebsocketClient { + private WebsocketEndpoint websocketEndpoint = null; + + public WebsocketClient(String uri, String sessionID, MessageHandler.Whole messageHandler) + throws IOException { + + // add session ID so the request gets through LAMS security + Builder configBuilder = ClientEndpointConfig.Builder.create(); + configBuilder.configurator(new Configurator() { + @Override + public void beforeRequest(final Map> headers) { + headers.put("Cookie", Arrays.asList("JSESSIONID=" + sessionID)); + } + }); + ClientEndpointConfig clientConfig = configBuilder.build(); + this.websocketEndpoint = new WebsocketEndpoint(messageHandler); + WebSocketContainer container = ContainerProvider.getWebSocketContainer(); + try { + container.connectToServer(websocketEndpoint, clientConfig, new URI(uri)); + } catch (DeploymentException | URISyntaxException e) { + throw new IOException("Error while connecting to websocket server", e); + } + } + + public boolean sendMessage(String message) throws IOException { + if (websocketEndpoint.session == null) { + return false; + } + websocketEndpoint.session.getBasicRemote().sendText(message); + return true; + } + + public void close() throws IOException { + if (websocketEndpoint.session != null) { + websocketEndpoint.session.close(); + } + } +} + +class WebsocketEndpoint extends Endpoint { + Session session = null; + private MessageHandler.Whole messageHandler = null; + + WebsocketEndpoint(MessageHandler.Whole messageHandler) { + this.messageHandler = messageHandler; + } + + @Override + public void onOpen(Session session, EndpointConfig endpointConfig) { + this.session = session; + session.addMessageHandler(messageHandler); + } +} \ No newline at end of file