You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by co...@apache.org on 2018/10/05 17:18:54 UTC

[cxf] 05/12: CXF-7784: Adding test case for concurrent invocations of the Invocation.Builder instance

This is an automated email from the ASF dual-hosted git repository.

coheigea pushed a commit to branch 3.2.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit 2ca662c9fb75c7201ddef576c3a118561b3b976d
Author: reta <dr...@gmail.com>
AuthorDate: Sun Jul 22 18:55:03 2018 -0400

    CXF-7784: Adding test case for concurrent invocations of the Invocation.Builder instance
    
    (cherry picked from commit 7d611371e968258830cd7cec4cdbb03bff79fc12)
---
 .../cxf/jaxrs/client/spec/ClientImplTest.java      | 50 ++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/rt/rs/client/src/test/java/org/apache/cxf/jaxrs/client/spec/ClientImplTest.java b/rt/rs/client/src/test/java/org/apache/cxf/jaxrs/client/spec/ClientImplTest.java
index 88cf9da..1f502e4 100644
--- a/rt/rs/client/src/test/java/org/apache/cxf/jaxrs/client/spec/ClientImplTest.java
+++ b/rt/rs/client/src/test/java/org/apache/cxf/jaxrs/client/spec/ClientImplTest.java
@@ -20,12 +20,22 @@ package org.apache.cxf.jaxrs.client.spec;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
+import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import java.util.logging.Handler;
 import java.util.logging.LogRecord;
 
 import javax.ws.rs.client.Client;
 import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Invocation;
 import javax.ws.rs.client.WebTarget;
 
 import org.apache.cxf.common.logging.LogUtils;
@@ -187,4 +197,44 @@ public class ClientImplTest extends Assert {
         }
         fail("did not log expected message");
     }
+    
+    /**
+     * This test cases creates a single WebTarget instance and than calls
+     * the request() method concurrently from different threads verifying that
+     * its behavior is thread-safe.
+     */
+    @Test
+    public void testAccessInvocationBuilderConcurrently() {
+        String address = "http://localhost:8080/bookstore/{a}/simple";
+        Client client = ClientBuilder.newClient();
+        
+        final Invocation.Builder builder = client
+                .target(address)
+                .resolveTemplate("a", "bookheaders")
+                .request("application/xml")
+                .header("a", "b");
+        
+        final ExecutorService executor = Executors.newFixedThreadPool(20);
+        final CyclicBarrier barrier = new CyclicBarrier(20);
+        
+        final Collection<CompletableFuture<?>> futures = new ArrayList<>();
+        for (int i = 0; i < 20; ++i) {
+            futures.add(CompletableFuture.supplyAsync(() -> {
+                try {
+                    barrier.await(1, TimeUnit.SECONDS);
+                    return builder.buildGet();
+                } catch (final InterruptedException ex) {
+                    Thread.interrupted();
+                    throw new CompletionException(ex);
+                } catch (BrokenBarrierException | TimeoutException ex) {
+                    throw new CompletionException(ex);
+                }
+            }, executor));
+        }
+        
+        CompletableFuture
+            .allOf(futures.toArray(new CompletableFuture<?>[0]))
+            .join();
+    }
+        
 }