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