diff --git a/docs-stress/pom.xml b/docs-stress/pom.xml
index 68c6bc03..6b7c1efe 100644
--- a/docs-stress/pom.xml
+++ b/docs-stress/pom.xml
@@ -21,6 +21,13 @@
jersey-client
+
+
+ com.sismics.docs
+ docs-web-common
+ test-jar
+
+
com.google.guava
@@ -47,11 +54,9 @@
jcl-over-slf4j
-
junit
junit
- test
diff --git a/docs-stress/src/main/java/com/sismics/docs/stress/Main.java b/docs-stress/src/main/java/com/sismics/docs/stress/Main.java
index 3e11c534..fa349ed2 100644
--- a/docs-stress/src/main/java/com/sismics/docs/stress/Main.java
+++ b/docs-stress/src/main/java/com/sismics/docs/stress/Main.java
@@ -1,8 +1,33 @@
package com.sismics.docs.stress;
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ThreadLocalRandom;
+
+import javax.ws.rs.core.MediaType;
+
+import junit.framework.Assert;
+
+import org.codehaus.jettison.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.sismics.docs.rest.filter.CookieAuthenticationFilter;
+import com.sismics.docs.rest.util.ClientUtil;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.ClientResponse.Status;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.core.util.MultivaluedMapImpl;
+import com.sun.jersey.multipart.FormDataBodyPart;
+import com.sun.jersey.multipart.FormDataMultiPart;
+
/**
* Stress app for Sismics Docs.
*
@@ -14,6 +39,17 @@ public class Main {
*/
private static final Logger log = LoggerFactory.getLogger(Main.class);
+ private static final String API_URL = "http://localhost:9999/docs-web/api/";
+ private static final int USER_COUNT = 50;
+ private static final int DOCUMENT_PER_USER_COUNT = 2000;
+ private static final int TAG_PER_USER_COUNT = 20;
+ private static final int FILE_PER_DOCUMENT_COUNT = 0;
+
+ private static Client client = Client.create();
+ private static ClientUtil clientUtil;
+
+ private static Set userSet = Sets.newHashSet();
+
/**
* Entry point.
*
@@ -21,5 +57,84 @@ public class Main {
*/
public static void main(String[] args) {
log.info("Starting stress test...");
+
+ WebResource resource = client.resource(API_URL);
+ clientUtil = new ClientUtil(resource);
+
+ // Create users
+ for (int i = 0; i < USER_COUNT; i++) {
+ String username = generateString();
+ clientUtil.createUser(username);
+ userSet.add(new User(username, (clientUtil.login(username))));
+ log.info("Created user " + (i + 1) + "/" + USER_COUNT);
+ }
+
+ // Create tags for each user
+ int tagCreatedCount = 1;
+ for (User user : userSet) {
+ WebResource tagResource = resource.path("/tag");
+ tagResource.addFilter(new CookieAuthenticationFilter(user.authToken));
+
+ for (int j = 0; j < TAG_PER_USER_COUNT; j++) {
+ MultivaluedMapImpl postParams = new MultivaluedMapImpl();
+ String name = generateString();
+ postParams.add("name", name);
+ postParams.add("color", "#ff0000");
+ ClientResponse response = tagResource.put(ClientResponse.class, postParams);
+ JSONObject json = response.getEntity(JSONObject.class);
+ user.tagList.add(json.optString("id"));
+ log.info("Created tag " + (tagCreatedCount++) + "/" + TAG_PER_USER_COUNT * USER_COUNT);
+ }
+ }
+
+ // Create documents for each user
+ int documentCreatedCount = 1;
+ for (User user : userSet) {
+ for (int i = 0; i < DOCUMENT_PER_USER_COUNT; i++) {
+ WebResource documentResource = resource.path("/document");
+ documentResource.addFilter(new CookieAuthenticationFilter(user.authToken));
+ MultivaluedMapImpl postParams = new MultivaluedMapImpl();
+ postParams.add("title", generateString());
+ postParams.add("description", generateString());
+ postParams.add("tags", user.tagList.get(ThreadLocalRandom.current().nextInt(user.tagList.size()))); // Random tag
+ postParams.add("language", "eng");
+ long createDate = new Date().getTime();
+ postParams.add("create_date", createDate);
+ ClientResponse response = documentResource.put(ClientResponse.class, postParams);
+ JSONObject json = response.getEntity(JSONObject.class);
+ String documentId = json.optString("id");
+ log.info("Created document " + (documentCreatedCount++) + "/" + DOCUMENT_PER_USER_COUNT * USER_COUNT + " for user: " + user.username);
+
+ // Add files for each document
+ for (int j = 0; j < FILE_PER_DOCUMENT_COUNT; j++) {
+ WebResource fileResource = resource.path("/file");
+ fileResource.addFilter(new CookieAuthenticationFilter(user.authToken));
+ FormDataMultiPart form = new FormDataMultiPart();
+ InputStream file = Main.class.getResourceAsStream("/empty.png");
+ FormDataBodyPart fdp = new FormDataBodyPart("file",
+ new BufferedInputStream(file),
+ MediaType.APPLICATION_OCTET_STREAM_TYPE);
+ form.bodyPart(fdp);
+ form.field("id", documentId);
+ response = fileResource.type(MediaType.MULTIPART_FORM_DATA).put(ClientResponse.class, form);
+ Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
+ }
+ }
+ }
+ }
+
+ private static String generateString() {
+ return UUID.randomUUID().toString().replace("-", "");
+ }
+
+ private static class User {
+ public String username;
+ public List tagList = Lists.newArrayList();
+ public String authToken;
+
+ public User(String username, String authToken) {
+ this.username = username;
+ this.authToken = authToken;
+ }
}
}
diff --git a/docs-stress/src/main/resources/empty.png b/docs-stress/src/main/resources/empty.png
new file mode 100644
index 00000000..cee81591
Binary files /dev/null and b/docs-stress/src/main/resources/empty.png differ