You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2011/10/19 12:44:15 UTC
svn commit: r1186082 - in /tomcat/tc7.0.x/trunk: ./
test/org/apache/catalina/authenticator/TesterDigestAuthenticatorPerformance.java
Author: markt
Date: Wed Oct 19 10:44:14 2011
New Revision: 1186082
URL: http://svn.apache.org/viewvc?rev=1186082&view=rev
Log:
Focus DIGEST auth performance test on authentication process.
Modified:
tomcat/tc7.0.x/trunk/ (props changed)
tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TesterDigestAuthenticatorPerformance.java
Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Oct 19 10:44:14 2011
@@ -1 +1 @@
-/tomcat/trunk:1156115,1156171,1156276,1156304,1156519,1156530,1156602,1157015,1157018,1157151,1157198,1157204,1157810,1157832,1157834,1157847,1157908,1157939,1158155,1158160,1158176,1158195,1158198-1158199,1158227,1158331,1158334-1158335,1158426,1160347,1160592,1160611,1160619,1160626,1160639,1160652,1160720-1160721,1160772,1160774,1160776,1161303,1161310,1161322,1161339,1161486,1161540,1161549,1161584,1162082,1162149,1162169,1162721,1162769,1162836,1162932,1163630,1164419,1164438,1164469,1164480,1164567,1165234,1165247-1165248,1165253,1165273,1165282,1165309,1165331,1165338,1165347,1165360-1165361,1165367-1165368,1165602,1165608,1165677,1165693,1165721,1165723,1165728,1165730,1165738,1165746,1165765,1165777,1165918,1165921,1166077,1166150-1166151,1166290,1166366,1166620,1166686,1166693,1166752,1166757,1167368,1167394,1169447,1170647,1171692,1172233-1172234,1172236,1172269,1172278,1172282,1172556,1172610,1172664,1172689,1172711,1173020-1173021,1173082,1173088,1173090,1173096
,1173241,1173256,1173288,1173333,1173342,1173461,1173614,1173630,1173659,1173722,1174061,1174239,1174322,1174325,1174329-1174330,1174337-1174339,1174343,1174353,1174799,1174882,1174884,1174983,1175155,1175158,1175167,1175182,1175190,1175201,1175272,1175275,1175283,1175582,1175589-1175590,1175594,1175602,1175613,1175633,1175690,1175713,1175889,1175896,1175907,1176584,1176590,1176799,1177050,1177060,1177125,1177152,1177160,1177245,1177850,1177862,1177978,1178209,1178228,1178233,1178449,1178542,1178681,1178684,1178721,1179268,1179274,1180261,1180891,1180894,1180907,1181028,1181123,1181125,1181136,1181291,1181743,1182796,1183078,1183105,1183142,1183328,1183339-1183340,1183492-1183494,1183605,1184917,1184919,1185018,1185020,1185200,1185588,1185626,1185756,1185758,1186042-1186045
+/tomcat/trunk:1156115,1156171,1156276,1156304,1156519,1156530,1156602,1157015,1157018,1157151,1157198,1157204,1157810,1157832,1157834,1157847,1157908,1157939,1158155,1158160,1158176,1158195,1158198-1158199,1158227,1158331,1158334-1158335,1158426,1160347,1160592,1160611,1160619,1160626,1160639,1160652,1160720-1160721,1160772,1160774,1160776,1161303,1161310,1161322,1161339,1161486,1161540,1161549,1161584,1162082,1162149,1162169,1162721,1162769,1162836,1162932,1163630,1164419,1164438,1164469,1164480,1164567,1165234,1165247-1165248,1165253,1165273,1165282,1165309,1165331,1165338,1165347,1165360-1165361,1165367-1165368,1165602,1165608,1165677,1165693,1165721,1165723,1165728,1165730,1165738,1165746,1165765,1165777,1165918,1165921,1166077,1166150-1166151,1166290,1166366,1166620,1166686,1166693,1166752,1166757,1167368,1167394,1169447,1170647,1171692,1172233-1172234,1172236,1172269,1172278,1172282,1172556,1172610,1172664,1172689,1172711,1173020-1173021,1173082,1173088,1173090,1173096
,1173241,1173256,1173288,1173333,1173342,1173461,1173614,1173630,1173659,1173722,1174061,1174239,1174322,1174325,1174329-1174330,1174337-1174339,1174343,1174353,1174799,1174882,1174884,1174983,1175155,1175158,1175167,1175182,1175190,1175201,1175272,1175275,1175283,1175582,1175589-1175590,1175594,1175602,1175613,1175633,1175690,1175713,1175889,1175896,1175907,1176584,1176590,1176799,1177050,1177060,1177125,1177152,1177160,1177245,1177850,1177862,1177978,1178209,1178228,1178233,1178449,1178542,1178681,1178684,1178721,1179268,1179274,1180261,1180865,1180891,1180894,1180907,1181028,1181123,1181125,1181136,1181291,1181743,1182796,1183078,1183105,1183142,1183328,1183339-1183340,1183492-1183494,1183605,1184917,1184919,1185018,1185020,1185200,1185588,1185626,1185756,1185758,1186042-1186045
Modified: tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TesterDigestAuthenticatorPerformance.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TesterDigestAuthenticatorPerformance.java?rev=1186082&r1=1186081&r2=1186082&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TesterDigestAuthenticatorPerformance.java (original)
+++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TesterDigestAuthenticatorPerformance.java Wed Oct 19 10:44:14 2011
@@ -18,52 +18,51 @@ package org.apache.catalina.authenticato
import java.io.IOException;
import java.security.MessageDigest;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.security.NoSuchAlgorithmException;
+
+import javax.servlet.http.HttpServletResponse;
import static org.junit.Assert.assertEquals;
+import org.junit.Before;
import org.junit.Test;
import org.apache.catalina.Context;
+import org.apache.catalina.connector.Request;
+import org.apache.catalina.core.StandardContext;
import org.apache.catalina.deploy.LoginConfig;
-import org.apache.catalina.deploy.SecurityCollection;
-import org.apache.catalina.deploy.SecurityConstraint;
+import org.apache.catalina.filters.TesterResponse;
import org.apache.catalina.startup.TestTomcat.MapRealm;
-import org.apache.catalina.startup.TesterServlet;
-import org.apache.catalina.startup.Tomcat;
-import org.apache.catalina.startup.TomcatBaseTest;
import org.apache.catalina.util.MD5Encoder;
-import org.apache.tomcat.util.buf.ByteChunk;
-public class TesterDigestAuthenticatorPerformance extends TomcatBaseTest {
+public class TesterDigestAuthenticatorPerformance {
private static String USER = "user";
private static String PWD = "pwd";
private static String ROLE = "role";
+ private static String METHOD = "GET";
private static String URI = "/protected";
private static String CONTEXT_PATH = "/foo";
private static String CLIENT_AUTH_HEADER = "authorization";
private static String REALM = "TestRealm";
private static String QOP = "auth";
+ private DigestAuthenticator authenticator = new DigestAuthenticator();
+
+
@Test
public void testSimple() throws Exception {
- doTest(100, 1000);
+ doTest(100, 1000000);
}
public void doTest(int threadCount, int requestCount) throws Exception {
- getTomcatInstance().start();
-
TesterRunnable runnables[] = new TesterRunnable[threadCount];
Thread threads[] = new Thread[threadCount];
// Create the runnables & threads
for (int i = 0; i < threadCount; i++) {
- runnables[i] = new TesterRunnable(i, requestCount);
+ runnables[i] = new TesterRunnable(requestCount);
threads[i] = new Thread(runnables[i]);
}
@@ -98,85 +97,65 @@ public class TesterDigestAuthenticatorPe
assertEquals(requestCount * threadCount, totalSuccess);
}
+ @Before
+ public void setUp() throws Exception {
+
+ // Configure the Realm
+ MapRealm realm = new MapRealm();
+ realm.addUser(USER, PWD);
+ realm.addUserRole(USER, ROLE);
+
+ // Add the Realm to the Context
+ Context context = new StandardContext();
+ context.setName(CONTEXT_PATH);
+ context.setRealm(realm);
+
+ // Make the Context and Realm visible to the Authenticator
+ authenticator.setContainer(context);
+
+ // Prevent caching of cnonces so we can the same one for all requests
+ authenticator.setCnonceCacheSize(0);
+ authenticator.start();
+ }
+
+
private class TesterRunnable implements Runnable {
// Number of valid requests required
private int requestCount;
- private String nonce;
- private String opaque;
-
- private String cnonce;
-
- private Map<String,List<String>> reqHeaders;
- private List<String> authHeader;
-
- private MessageDigest digester;
- private MD5Encoder encoder;
-
- private String md5a1;
- private String md5a2;
-
- private String path;
-
private int success = 0;
private long time = 0;
+ private TesterDigestRequest request;
+ private HttpServletResponse response;
+ private LoginConfig config;
+
// All init code should be in here. run() needs to be quick
- public TesterRunnable(int id, int requestCount) throws Exception {
+ public TesterRunnable(int requestCount) throws Exception {
this.requestCount = requestCount;
- path = "http://localhost:" + getPort() + CONTEXT_PATH + URI;
+ request = new TesterDigestRequest();
+ String nonce = authenticator.generateNonce(request);
+ request.setAuthHeader(buildDigestResponse(nonce));
- // Make the first request as we need the Digest challenge to obtain
- // the server nonce
- Map<String,List<String>> respHeaders =
- new HashMap<String,List<String>>();
- getUrl(path, new ByteChunk(), respHeaders);
-
- nonce = TestDigestAuthenticator.getNonce(respHeaders);
- opaque = TestDigestAuthenticator.getOpaque(respHeaders);
-
- cnonce = "cnonce" + id;
-
- reqHeaders = new HashMap<String,List<String>>();
- authHeader = new ArrayList<String>();
- reqHeaders.put(CLIENT_AUTH_HEADER, authHeader);
-
- digester = MessageDigest.getInstance("MD5");
- encoder = new MD5Encoder();
+ response = new TesterResponse();
- String a1 = USER + ":" + REALM + ":" + PWD;
- String a2 = "GET:" + CONTEXT_PATH + URI;
-
- md5a1 = encoder.encode(digester.digest(a1.getBytes()));
- md5a2 = encoder.encode(digester.digest(a2.getBytes()));
+ config = new LoginConfig();
+ config.setRealmName(REALM);
}
@Override
public void run() {
- int rc;
- int nc = 0;
- ByteChunk bc = new ByteChunk();
long start = System.currentTimeMillis();
for (int i = 0; i < requestCount; i++) {
- nc++;
- authHeader.clear();
- authHeader.add(buildDigestResponse(nc));
-
- rc = -1;
- bc.recycle();
- bc.reset();
-
try {
- rc = getUrl(path, bc, reqHeaders, null);
+ if (authenticator.authenticate(request, response, config)) {
+ success++;
+ }
} catch (IOException ioe) {
// Ignore
}
-
- if (rc == 200 && "OK".equals(bc.toString())) {
- success++;
- }
}
time = System.currentTimeMillis() - start;
}
@@ -189,9 +168,20 @@ public class TesterDigestAuthenticatorPe
return time;
}
- private String buildDigestResponse(int nc) {
+ private String buildDigestResponse(String nonce)
+ throws NoSuchAlgorithmException {
+
+ String ncString = "00000001";
+ String cnonce = "cnonce";
+
+ String a1 = USER + ":" + REALM + ":" + PWD;
+ String a2 = METHOD + ":" + CONTEXT_PATH + URI;
- String ncString = String.format("%1$08x", Integer.valueOf(nc));
+ MessageDigest digester = MessageDigest.getInstance("MD5");
+ MD5Encoder encoder = new MD5Encoder();
+
+ String md5a1 = encoder.encode(digester.digest(a1.getBytes()));
+ String md5a2 = encoder.encode(digester.digest(a2.getBytes()));
String response = md5a1 + ":" + nonce + ":" + ncString + ":" +
cnonce + ":" + QOP + ":" + md5a2;
@@ -209,7 +199,7 @@ public class TesterDigestAuthenticatorPe
auth.append("\", uri=\"");
auth.append(CONTEXT_PATH + URI);
auth.append("\", opaque=\"");
- auth.append(opaque);
+ auth.append(authenticator.getOpaque());
auth.append("\", response=\"");
auth.append(md5response);
auth.append("\"");
@@ -227,40 +217,43 @@ public class TesterDigestAuthenticatorPe
}
}
- @Override
- public void setUp() throws Exception {
- super.setUp();
+
+ private static class TesterDigestRequest extends Request {
- // Configure a context with digest auth and a single protected resource
- Tomcat tomcat = getTomcatInstance();
+ private String authHeader = null;
- // Must have a real docBase - just use temp
- Context ctxt = tomcat.addContext(CONTEXT_PATH,
- System.getProperty("java.io.tmpdir"));
-
- // Add protected servlet
- Tomcat.addServlet(ctxt, "TesterServlet", new TesterServlet());
- ctxt.addServletMapping(URI, "TesterServlet");
- SecurityCollection collection = new SecurityCollection();
- collection.addPattern(URI);
- SecurityConstraint sc = new SecurityConstraint();
- sc.addAuthRole(ROLE);
- sc.addCollection(collection);
- ctxt.addConstraint(sc);
+ @Override
+ public String getRemoteAddr() {
+ return "127.0.0.1";
+ }
- // Configure the Realm
- MapRealm realm = new MapRealm();
- realm.addUser(USER, PWD);
- realm.addUserRole(USER, ROLE);
- ctxt.setRealm(realm);
+ public void setAuthHeader(String authHeader) {
+ this.authHeader = authHeader;
+ }
+
+ @Override
+ public String getHeader(String name) {
+ if (CLIENT_AUTH_HEADER.equalsIgnoreCase(name)) {
+ return authHeader;
+ } else {
+ return super.getHeader(name);
+ }
+ }
+
+ @Override
+ public String getMethod() {
+ return METHOD;
+ }
+
+ @Override
+ public String getQueryString() {
+ return null;
+ }
+
+ @Override
+ public String getRequestURI() {
+ return CONTEXT_PATH + URI;
+ }
- // Configure the authenticator
- LoginConfig lc = new LoginConfig();
- lc.setAuthMethod("DIGEST");
- lc.setRealmName(REALM);
- ctxt.setLoginConfig(lc);
- DigestAuthenticator authenticator = new DigestAuthenticator();
- authenticator.setCnonceCacheSize(100);
- ctxt.getPipeline().addValve(authenticator);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org