Fix random failures in ManualClientEndTest 16/71316/2 3.0.0-ONAP
authorJim Hahn <jrh3@att.com>
Fri, 26 Oct 2018 14:10:28 +0000 (10:10 -0400)
committerJim Hahn <jrh3@att.com>
Fri, 26 Oct 2018 14:18:33 +0000 (10:18 -0400)
Don't know if this is the cause of the intermittent failures, but it
could be, and it is certainly a bug: the classes manipulate data, that
isn't marked volatile, from more than one thread at a time.
Updated licenses.

Change-Id: Ifca84cf8f915ec703a9ce8980db2475dacf97980
Issue-ID: POLICY-1092
Signed-off-by: Jim Hahn <jrh3@att.com>
PolicyEngineAPI/src/main/java/org/onap/policy/std/AutoClientEnd.java
PolicyEngineAPI/src/main/java/org/onap/policy/std/ManualClientEnd.java
PolicyEngineAPI/src/test/java/org/onap/policy/std/test/AutoClientEndTest.java
PolicyEngineAPI/src/test/java/org/onap/policy/std/test/ManualClientEndTest.java

index aabda96..342af2c 100644 (file)
@@ -35,18 +35,18 @@ import org.onap.policy.common.logging.flexlogger.Logger;
 import org.onap.policy.xacml.api.XACMLErrorConstants;
 
 public class AutoClientEnd extends WebSocketClient {
-    private static StdPDPNotification notification = null;
-    private static StdPDPNotification oldNotification = null;
-    private static AutoClientEnd client = null;
-    private static NotificationScheme scheme = null;
-    private static NotificationHandler handler = null;
-    private static String url = null;
-    private static boolean status = false;
-    private static boolean stop = false;
-    private static boolean error = false;
-    private static boolean restartNeeded = false;
-    private static ScheduledExecutorService restartExecutorService = null;
-    private static Logger logger = FlexLogger.getLogger(AutoClientEnd.class.getName());
+    private static volatile StdPDPNotification notification = null;
+    private static volatile StdPDPNotification oldNotification = null;
+    private static volatile AutoClientEnd client = null;
+    private static volatile NotificationScheme scheme = null;
+    private static volatile NotificationHandler handler = null;
+    private static volatile String url = null;
+    private static volatile boolean status = false;
+    private static volatile boolean stop = false;
+    private static volatile boolean error = false;
+    private static volatile boolean restartNeeded = false;
+    private static volatile ScheduledExecutorService restartExecutorService = null;
+    private static final Logger logger = FlexLogger.getLogger(AutoClientEnd.class.getName());
 
     private AutoClientEnd(URI serverUri) {
         super(serverUri);
index 778acd7..b274fa1 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * PolicyEngineAPI
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -33,11 +33,11 @@ import org.onap.policy.std.StdPDPNotification;
 import org.onap.policy.xacml.api.XACMLErrorConstants;
 
 public class ManualClientEnd extends WebSocketClient {
-    private static CountDownLatch latch;
-    private static StdPDPNotification notification = null;
-    private static String resultJson = null;
-    private static Logger logger = FlexLogger.getLogger(ManualClientEnd.class.getName());
-    private static ManualClientEnd client;
+    private static volatile CountDownLatch latch;
+    private static volatile StdPDPNotification notification = null;
+    private static volatile String resultJson = null;
+    private static final Logger logger = FlexLogger.getLogger(ManualClientEnd.class.getName());
+    private static volatile ManualClientEnd client;
 
     public ManualClientEnd(URI serverUri) {
         super(serverUri);
index b10f69a..a887932 100644 (file)
@@ -1,8 +1,8 @@
-/*-
+/*
  * ============LICENSE_START=======================================================
  * PolicyEngineAPI
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 package org.onap.policy.std.test;
 
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
+
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+
 import org.java_websocket.WebSocket;
 import org.java_websocket.handshake.ClientHandshake;
 import org.java_websocket.server.WebSocketServer;
@@ -45,9 +46,8 @@ import org.springframework.util.SocketUtils;
 public class AutoClientEndTest {
     private static WebSocketServer ws;
 
-    private static int port = SocketUtils.findAvailableTcpPort();
-    private static CountDownLatch countServerDownLatch = null;
-    private static PDPNotification notification = null;
+    private static final int port = SocketUtils.findAvailableTcpPort();
+    private static volatile CountDownLatch countServerDownLatch = null;
 
     /**
      * Start server.
@@ -56,7 +56,6 @@ public class AutoClientEndTest {
      */
     @BeforeClass
     public static void startServer() throws Exception {
-        notification = null;
         ws = new WebSocketServer(new InetSocketAddress(port), 1) {
             @Override
             public void onOpen(WebSocket conn, ClientHandshake handshake) {
@@ -100,7 +99,6 @@ public class AutoClientEndTest {
 
             @Override
             public void notificationReceived(PDPNotification notify) {
-                notification = notify;
                 countServerDownLatch.countDown();
 
             }
index 7d31c24..a9fa3f5 100644 (file)
@@ -1,8 +1,8 @@
-/*-
+/*
  * ============LICENSE_START=======================================================
  * PolicyEngineAPI
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 package org.onap.policy.std.test;
 
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+
 import java.io.IOException;
 import java.net.InetSocketAddress;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
+
 import org.java_websocket.WebSocket;
 import org.java_websocket.handshake.ClientHandshake;
 import org.java_websocket.server.WebSocketServer;
@@ -44,9 +44,9 @@ import org.springframework.util.SocketUtils;
 public class ManualClientEndTest {
     private static WebSocketServer ws;
 
-    private static int port = SocketUtils.findAvailableTcpPort();
-    private static CountDownLatch countServerDownLatch = null;
-    private static String recvMsg = null;
+    private static final int port = SocketUtils.findAvailableTcpPort();
+    private static volatile String recvMsg = null;
+    private static volatile Exception webEx = null;
 
     /**
      * Start server.
@@ -57,18 +57,17 @@ public class ManualClientEndTest {
     public static void startServer() throws Exception {
         ws = new WebSocketServer(new InetSocketAddress(port), 1) {
             @Override
-            public void onOpen(WebSocket conn, ClientHandshake handshake) {
-
-            }
+            public void onOpen(WebSocket conn, ClientHandshake handshake) {}
 
             @Override
-            public void onClose(WebSocket conn, int code, String reason, boolean remote) {
-                countServerDownLatch.countDown();
-            }
+            public void onClose(WebSocket conn, int code, String reason, boolean remote) {}
 
             @Override
             public void onMessage(WebSocket conn, String message) {
+               
+               // NOTE: must copy to recvMsg BEFORE invoking conn.send()
                 recvMsg = message;
+                
                 conn.send("{\"removedPolicies\": [],\"loadedPolicies\":"
                         + "[{\"policyName\": \"Test.Config_BRMS_Param_BrmsParamTestPa.1.xml\","
                         + "\"versionNo\": \"1\",\"matches\": {\"ECOMPName\": \"DROOLS\","
@@ -79,9 +78,8 @@ public class ManualClientEndTest {
 
             @Override
             public void onError(WebSocket conn, Exception ex) {
-
+               webEx = ex;
                 ex.printStackTrace();
-                fail("There should be no exception!");
             }
 
             @Override
@@ -95,17 +93,16 @@ public class ManualClientEndTest {
 
     @Test
     public void testManualClient() throws Exception {
-        countServerDownLatch = new CountDownLatch(1);
-
+       
         ManualClientEnd.start("http://localhost:" + port + "/");
-        countServerDownLatch.await(45, TimeUnit.SECONDS);
 
+        assertNull(webEx);
         assertNotNull(ManualClientEnd.result(NotificationScheme.MANUAL_ALL_NOTIFICATIONS));
         assertTrue("Manual".equalsIgnoreCase(recvMsg));
     }
 
     @AfterClass
     public static void successTests() throws InterruptedException, IOException {
-        ws.stop(30000);
+        ws.stop(5000);
     }
 }