Author: sebb
Date: Fri Nov 13 18:36:22 2009
New Revision: 835949

URL: http://svn.apache.org/viewvc?rev=835949&view=rev
Log:
Bug 48163 - TestCase for org.apache.jmeter.protocol.http.control.CacheManager
Initial checkin

Added:
    
jakarta/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/control/TestCacheManager.java
   (with props)

Added: 
jakarta/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/control/TestCacheManager.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/control/TestCacheManager.java?rev=835949&view=auto
==============================================================================
--- 
jakarta/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/control/TestCacheManager.java
 (added)
+++ 
jakarta/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/control/TestCacheManager.java
 Fri Nov 13 18:36:22 2009
@@ -0,0 +1,218 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+
+package org.apache.jmeter.protocol.http.control;
+
+import java.lang.reflect.Field;
+import java.net.URL;
+import java.net.URLConnection;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.SimpleTimeZone;
+
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.URI;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.util.HttpURLConnection;
+import org.apache.jmeter.junit.JMeterTestCase;
+import org.apache.jmeter.protocol.http.control.CacheManager.CacheEntry;
+import org.apache.jmeter.protocol.http.util.HTTPConstantsInterface;
+import org.apache.jmeter.samplers.SampleResult;
+
+public class TestCacheManager extends JMeterTestCase {
+       
+       private static final String APACHE = "http://jakarta.apache.org/";;
+       private static final String EXPECTED_ETAG = "0xCAFEBABEDEADBEEF";
+       private CacheManager cacheManager;
+       private String currentTimeInGMT;
+       private URL url;
+       private URI uri;
+       private URLConnection urlConnection;
+       private HttpMethod httpMethod;
+       private HttpURLConnection httpUrlConnection;
+
+       public TestCacheManager(String name) {
+               super(name);
+       }
+
+       public void setUp() throws Exception {
+               super.setUp();
+               this.cacheManager = new CacheManager();
+               SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
+               simpleDateFormat.setTimeZone(new SimpleTimeZone(0, "GMT"));
+               simpleDateFormat.applyPattern("EEE, dd MMM yyyy HH:mm:ss z");
+               this.currentTimeInGMT = simpleDateFormat.format(new Date());
+               this.uri = new URI(APACHE, false);
+               this.url = new URL(APACHE);
+               this.urlConnection = this.url.openConnection();
+               this.httpMethod = new PostMethod();
+               this.httpUrlConnection = new HttpURLConnection(this.httpMethod, 
this.url);
+       }
+
+       protected void tearDown() throws Exception {
+               this.httpUrlConnection = null;
+               this.httpMethod = null;
+               this.urlConnection = null;
+               this.url = null;
+               this.uri = null;
+               this.cacheManager = null;
+               this.currentTimeInGMT = null;
+               super.tearDown();
+       }
+
+       public void testGetClearEachIteration() throws Exception {
+               assertFalse("Should default not to clear after each 
iteration.", this.cacheManager.getClearEachIteration());
+               this.cacheManager.setClearEachIteration(true);
+               assertTrue("Should be settable to clear after each iteration.", 
this.cacheManager.getClearEachIteration());
+               this.cacheManager.setClearEachIteration(false);
+               assertFalse("Should be settable not to clear after each 
iteration.", this.cacheManager.getClearEachIteration());
+       }
+
+       public void testSaveDetailsWithEmptySampleResultGivesNoCacheEntry() 
throws Exception {
+               saveDetailsWithConnectionAndSampleResultWithResponseCode("");
+               assertTrue("Saving details with empty SampleResult should not 
make cache entry.", getThreadCache().isEmpty());
+       }
+
+       public void 
testSaveDetailsURLConnectionWithSampleResultWithResponseCode200GivesCacheEntry()
 throws Exception {
+               saveDetailsWithConnectionAndSampleResultWithResponseCode("200");
+               CacheManager.CacheEntry cacheEntry = 
getThreadCacheEntry(this.url.toString());
+               assertNotNull("Saving details with SampleResult & connection 
with 200 response should make cache entry.", cacheEntry);
+               assertNotNull("Saving details with SampleResult & connection 
with 200 response should make cache entry with an etag.", cacheEntry.getEtag());
+               assertNotNull("Saving details with SampleResult & connection 
with 200 response should make cache entry with last modified date.", 
cacheEntry.getLastModified());
+       }
+
+       public void 
testSaveDetailsHttpMethodWithSampleResultWithResponseCode200GivesCacheEntry() 
throws Exception {
+               saveDetailsWithHttpMethodAndSampleResultWithResponseCode("200");
+               CacheManager.CacheEntry cacheEntry = 
getThreadCacheEntry(this.httpMethod.getURI().toString());
+               assertNotNull("Saving SampleResult with HttpMethod & 200 
response should make cache entry.", cacheEntry);
+               assertNull("Saving details with SampleResult & HttpMethod with 
200 response should make cache entry with no etag.", cacheEntry.getEtag());
+               assertNull("Saving details with SampleResult & HttpMethod with 
200 response should make cache entry with no last modified date.", 
cacheEntry.getLastModified());
+       }
+
+       public void 
testSaveDetailsURLConnectionWithSampleResultWithResponseCode404GivesNoCacheEntry()
 throws Exception {
+               saveDetailsWithConnectionAndSampleResultWithResponseCode("404");
+               assertNull("Saving details with SampleResult & connection with 
404 response should not make cache entry.", 
getThreadCacheEntry(url.toString()));
+       }
+
+       public void 
testSaveDetailsHttpMethodWithSampleResultWithResponseCode404GivesNoCacheEntry() 
throws Exception {
+               saveDetailsWithHttpMethodAndSampleResultWithResponseCode("404");
+               assertNull("Saving SampleResult with HttpMethod & 404 response 
should not make cache entry.", getThreadCacheEntry(this.httpMethod.getPath()));
+       }
+
+       public void 
testSetHeadersHttpMethodWithSampleResultWithResponseCode200GivesCacheEntry() 
throws Exception {
+               this.httpMethod.setURI(this.uri);
+               this.httpMethod.addRequestHeader(new 
Header(HTTPConstantsInterface.IF_MODIFIED_SINCE, this.currentTimeInGMT, false));
+               this.httpMethod.addRequestHeader(new 
Header(HTTPConstantsInterface.ETAG, EXPECTED_ETAG, false));
+               saveDetailsWithHttpMethodAndSampleResultWithResponseCode("200");
+               
setFieldInCacheEntry(getThreadCacheEntry(this.httpMethod.getURI().toString()), 
"etag", EXPECTED_ETAG);
+               setHeadersWithUrlAndHttpMethod();
+               checkRequestHeader(HTTPConstantsInterface.IF_NONE_MATCH, 
EXPECTED_ETAG);
+               checkRequestHeader(HTTPConstantsInterface.IF_MODIFIED_SINCE, 
this.currentTimeInGMT);
+       }
+
+       public void 
testSetHeadersHttpMethodWithSampleResultWithResponseCode404GivesNoCacheEntry() 
throws Exception {
+               this.httpMethod.setURI(this.uri);
+               saveDetailsWithHttpMethodAndSampleResultWithResponseCode("404");
+               setHeadersWithUrlAndHttpMethod();
+               assertNull("Saving SampleResult with HttpMethod & 404 response 
should not make cache entry.", getThreadCacheEntry(this.httpMethod.getPath()));
+       }
+
+       public void 
testSetHeadersHttpURLConnectionWithSampleResultWithResponseCode200GivesCacheEntry()
 throws Exception {
+               saveDetailsWithConnectionAndSampleResultWithResponseCode("200");
+               CacheManager.CacheEntry cacheEntry = 
getThreadCacheEntry(httpUrlConnection.getURL().toString());
+               setFieldInCacheEntry(cacheEntry, "etag", EXPECTED_ETAG);
+               setFieldInCacheEntry(cacheEntry, "lastModified", 
this.currentTimeInGMT);
+               setHeadersWithHttpUrlConnectionAndUrl();
+               Map<String, List<String>> properties = 
this.httpUrlConnection.getRequestProperties();
+               checkProperty(properties, HTTPConstantsInterface.IF_NONE_MATCH, 
EXPECTED_ETAG);
+               checkProperty(properties, 
HTTPConstantsInterface.IF_MODIFIED_SINCE, this.currentTimeInGMT);
+       }
+
+       public void 
testSetHeadersHttpURLConnectionWithSampleResultWithResponseCode404GivesNoCacheEntry()
 throws Exception {
+               saveDetailsWithConnectionAndSampleResultWithResponseCode("404");
+               setHeadersWithHttpUrlConnectionAndUrl();
+               assertNull("Saving SampleResult with HttpMethod & 404 response 
should not make cache entry.", getThreadCacheEntry(this.url.toString()));
+       }
+
+       public void testClearCache() throws Exception {
+               assertTrue("ThreadCache should be empty initially.", 
getThreadCache().isEmpty());
+               saveDetailsWithHttpMethodAndSampleResultWithResponseCode("200");
+               assertFalse("ThreadCache should be populated after saving 
details for HttpMethod with SampleResult with response code 200.", 
getThreadCache().isEmpty());
+               this.cacheManager.clear();
+               assertTrue("ThreadCache should be emptied by call to clear.", 
getThreadCache().isEmpty());
+       }
+
+       private void checkRequestHeader(String requestHeader, String 
expectedValue) {
+               Header header = this.httpMethod.getRequestHeader(requestHeader);
+               assertEquals("Wrong name in header for " + requestHeader, 
requestHeader, header.getName());
+               assertEquals("Wrong value for header " + header, expectedValue, 
header.getValue());
+       }
+
+       private static void checkProperty(Map<String, List<String>> properties, 
String property, String expectedPropertyValue) {
+               assertNotNull("Properties should not be null. Expected to find 
within it property = " + property + " with expected value = " + 
expectedPropertyValue, properties);
+               List<String> listOfPropertyValues = properties.get(property);
+               assertNotNull("No property entry found for property " + 
property, listOfPropertyValues);
+               assertEquals("Did not find single property for property " + 
property, 1, listOfPropertyValues.size());
+               assertEquals("Unexpected value for property " + property, 
expectedPropertyValue, listOfPropertyValues.get(0));
+       }
+
+       private SampleResult getSampleResultWithSpecifiedResponseCode(String 
code) {
+               SampleResult sampleResult = new SampleResult();
+               sampleResult.setResponseCode(code);
+               return sampleResult;
+       }
+
+       @SuppressWarnings("unchecked")
+       private Map<String, CacheManager.CacheEntry> getThreadCache() throws 
Exception {
+               Field threadLocalfield = 
CacheManager.class.getDeclaredField("threadCache");
+               threadLocalfield.setAccessible(true);
+               ThreadLocal<Map<String, CacheEntry>> threadLocal = 
(ThreadLocal<Map<String, CacheManager.CacheEntry>>) 
threadLocalfield.get(this.cacheManager);
+               return (Map<String, CacheManager.CacheEntry>) threadLocal.get();
+       }
+
+       private CacheManager.CacheEntry getThreadCacheEntry(String url) throws 
Exception {
+               return (CacheManager.CacheEntry) getThreadCache().get(url);
+       }
+
+       private void 
saveDetailsWithHttpMethodAndSampleResultWithResponseCode(String responseCode) 
throws Exception {
+               SampleResult sampleResult = 
getSampleResultWithSpecifiedResponseCode(responseCode);
+               this.cacheManager.saveDetails(this.httpMethod, sampleResult);
+       }
+
+       private void 
saveDetailsWithConnectionAndSampleResultWithResponseCode(String responseCode) {
+               SampleResult sampleResult = 
getSampleResultWithSpecifiedResponseCode(responseCode);
+               this.cacheManager.saveDetails(this.urlConnection, sampleResult);
+       }
+
+       private void setFieldInCacheEntry(CacheManager.CacheEntry cacheEntry, 
String fieldName, String expectedValue) throws Exception {
+               Field field = 
CacheManager.CacheEntry.class.getDeclaredField(fieldName);
+               field.setAccessible(true);
+               field.set(cacheEntry, expectedValue);
+       }
+
+       private void setHeadersWithHttpUrlConnectionAndUrl() {
+               this.cacheManager.setHeaders(this.httpUrlConnection, this.url);
+       }
+
+       private void setHeadersWithUrlAndHttpMethod() {
+               this.cacheManager.setHeaders(this.url, this.httpMethod);
+       }
+}

Propchange: 
jakarta/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/control/TestCacheManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/control/TestCacheManager.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision



---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscr...@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-h...@jakarta.apache.org

Reply via email to