package glaze.client.wire.tasks; import static glaze.Glaze.Get; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; import glaze.client.Response; import glaze.client.sync.SyncClient; import glaze.client.sync.SyncMap; import glaze.client.wire.tasks.CallableRequest; import glaze.test.data.Member; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.apache.http.HttpResponse; import org.apache.http.ProtocolVersion; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.message.BasicStatusLine; import org.testng.annotations.Test; public class TestMultithreading { @Test public void call() throws InterruptedException, ExecutionException, TimeoutException { String[] uris = new String[] { "http://www.google.com", "https://api.trello.com/1/members/xxx?key=xxx" }; List<Future<Member>> futures = new ArrayList<Future<Member>>(); ExecutorService executor = Executors.newCachedThreadPool(); for (String uri : uris) { CallableRequest<Member> call = wrap(Get(uri).buildMapCall(Member.class)); Future<Member> future = executor.submit(call); futures.add(future); } executor.shutdown(); for (Future<Member> fm : futures) { Member member = fm.get(1, TimeUnit.MINUTES); assertEquals(member.id, "abcdefg"); } } @Test public void execute() throws InterruptedException { String[] uris = new String[] { "http://www.google.com", "https://www.yahoo.com", "http://wikipedia.com" }; ExecutorService executor = Executors.newCachedThreadPool(); for (String uri : uris) { executor.submit(wrap(Get(uri).buildSendCall())); } executor.shutdown(); executor.awaitTermination(1, TimeUnit.MINUTES); } private class ExecWrapper<T extends Serializable> extends CallableRequest<T> { private static final long serialVersionUID = 1L; private CallableRequest<T> wrapped; public ExecWrapper(CallableRequest<T> req) { super(req.getHttpRequest().materialize(), req.getCallback()); this.wrapped = req; } @SuppressWarnings("unchecked") @Override protected T execute(SyncClient skip, HttpUriRequest request) { SyncClient client = mock(SyncClient.class); HttpResponse response = mock(HttpResponse.class); when(response.getEntity()).thenReturn(new StringEntity("hello", ContentType.DEFAULT_TEXT)); when(response.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK")); when(client.map(any(SyncMap.class))).thenReturn(new Member("abcdefg")); when(client.execute(any(HttpUriRequest.class))).thenReturn(new Response(response)); return wrapped.execute(client, request); } } private <T extends Serializable> CallableRequest<T> wrap(CallableRequest<T> request) { return new ExecWrapper<T>(request); } }