/* * Copyright 2008-2009 LinkedIn, Inc * * Licensed 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 voldemort.store.http; import java.util.concurrent.TimeUnit; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.SchemeRegistryFactory; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.mortbay.jetty.Server; import org.mortbay.jetty.servlet.Context; import voldemort.ServerTestUtils; import voldemort.VoldemortTestConstants; import voldemort.client.protocol.RequestFormat; import voldemort.client.protocol.RequestFormatFactory; import voldemort.client.protocol.RequestFormatType; import voldemort.cluster.Cluster; import voldemort.cluster.Node; import voldemort.store.AbstractByteArrayStoreTest; import voldemort.store.Store; import voldemort.store.UnreachableStoreException; import voldemort.utils.ByteArray; import voldemort.utils.VoldemortIOUtils; import voldemort.versioning.VectorClock; import voldemort.versioning.Versioned; import voldemort.xml.ClusterMapper; /** * Tests of HTTP store against the HTTP server * * */ public class HttpStoreTest extends AbstractByteArrayStoreTest { private HttpStore httpStore; private Server server; private Context context; private HttpClient httpClient; @Override public void setUp() throws Exception { super.setUp(); Cluster cluster = ServerTestUtils.getLocalCluster(1); Node node = cluster.getNodes().iterator().next(); context = ServerTestUtils.getJettyServer(new ClusterMapper().writeCluster(cluster), VoldemortTestConstants.getSimpleStoreDefinitionsXml(), "users", RequestFormatType.VOLDEMORT_V1, node.getHttpPort()); server = context.getServer(); ThreadSafeClientConnManager connectionManager = new ThreadSafeClientConnManager(SchemeRegistryFactory.createDefault(), 5000, TimeUnit.MILLISECONDS); httpClient = new DefaultHttpClient(connectionManager); httpStore = ServerTestUtils.getHttpStore("users", RequestFormatType.VOLDEMORT_V1, node.getHttpPort(), httpClient); } public <T extends Exception> void testBadUrlOrPort(String url, int port, Class<T> expected) { ByteArray key = new ByteArray("test".getBytes()); RequestFormat requestFormat = new RequestFormatFactory().getRequestFormat(RequestFormatType.VOLDEMORT_V1); HttpParams clientParams = httpClient.getParams(); HttpConnectionParams.setConnectionTimeout(clientParams, 5000); HttpStore badUrlHttpStore = new HttpStore("test", url, port, httpClient, requestFormat, false); try { badUrlHttpStore.put(key, new Versioned<byte[]>("value".getBytes(), new VectorClock()), null); } catch(Exception e) { assertTrue(e.getClass().equals(expected)); } try { badUrlHttpStore.get(key, null); } catch(Exception e) { assertTrue(e.getClass().equals(expected)); } try { badUrlHttpStore.delete(key, new VectorClock()); } catch(Exception e) { assertTrue(e.getClass().equals(expected)); } } public void testBadUrl() { testBadUrlOrPort("asfgsadfsda", ServerTestUtils.findFreePort(), UnreachableStoreException.class); } public void testBadPort() { testBadUrlOrPort("localhost", ServerTestUtils.findFreePort(), UnreachableStoreException.class); } @Override public void tearDown() throws Exception { super.tearDown(); httpStore.close(); server.stop(); context.destroy(); VoldemortIOUtils.closeQuietly(httpClient); } @Override public Store<ByteArray, byte[], byte[]> getStore() { return httpStore; } }