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