Refactoring Metrics test 27/56627/5
authorwaqas.ikram <waqas.ikram@ericsson.com>
Tue, 17 Jul 2018 14:35:47 +0000 (15:35 +0100)
committerwaqas.ikram <waqas.ikram@ericsson.com>
Wed, 18 Jul 2018 15:10:29 +0000 (16:10 +0100)
Change-Id: I99290a3dec61b3ce0f4d5fd33d6b429d091b48ca
Issue-ID: POLICY-954
Signed-off-by: waqas.ikram <waqas.ikram@ericsson.com>
35 files changed:
client/client-deployment/src/main/java/org/onap/policy/apex/client/deployment/rest/ApexDeploymentRestParameters.java
client/client-editor/src/main/java/org/onap/policy/apex/client/editor/rest/ApexEditorRestResource.java
client/client-monitoring/src/main/java/org/onap/policy/apex/client/monitoring/rest/ApexMonitoringRestParameters.java
context/context-test-utils/pom.xml
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/distribution/ContextInstantiation.java
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/distribution/ContextUpdate.java
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/distribution/SequentialContextInstantiation.java
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/AlbumModifier.java [new file with mode: 0644]
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/LockType.java [new file with mode: 0644]
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/NoLockAlbumModifier.java [new file with mode: 0644]
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/ReadLockAlbumModifier.java [new file with mode: 0644]
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/SingleValueWriteLockAlbumModifier.java [new file with mode: 0644]
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/WriteLockAlbumModifier.java [new file with mode: 0644]
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/locking/ConcurrentContext.java
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/locking/ConcurrentContextJVM.java
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/locking/ConcurrentContextJVMThread.java
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/locking/ConcurrentContextThread.java
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/utils/ConfigrationProvider.java [new file with mode: 0644]
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/utils/ConfigrationProviderImpl.java [new file with mode: 0644]
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/utils/Constants.java
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/utils/NetworkUtils.java [new file with mode: 0644]
context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/utils/ZooKeeperServerServiceProvider.java [new file with mode: 0644]
context/context-test-utils/src/test/java/org/onap/policy/apex/context/test/locking/TestConcurrentContext.java
core/core-infrastructure/src/test/java/org/onap/policy/apex/core/infrastructure/messaging/EndToEndStringMessagingTest.java
testsuites/integration/integration-context-test/pom.xml
testsuites/integration/integration-context-test/src/test/java/org/onap/policy/apex/plugins/context/test/locking/TestConcurrentContext.java
testsuites/integration/integration-context-test/src/test/resources/infinispan/default-jgroups-udp.xml
testsuites/performance/performance-context-metrics/src/main/java/org/onap/policy/apex/plugins/context/metrics/ConcurrentContextMetrics.java
testsuites/performance/performance-context-metrics/src/main/java/org/onap/policy/apex/plugins/context/metrics/ConcurrentContextMetricsJVM.java [deleted file]
testsuites/performance/performance-context-metrics/src/main/java/org/onap/policy/apex/plugins/context/metrics/ConcurrentContextMetricsJVMThread.java [deleted file]
testsuites/performance/performance-context-metrics/src/main/java/org/onap/policy/apex/plugins/context/metrics/ConcurrentContextMetricsThread.java [deleted file]
testsuites/performance/performance-context-metrics/src/test/java/org/onap/policy/apex/plugins/context/metrics/TestMetrics.java
testsuites/performance/performance-context-metrics/src/test/resources/hazelcast/hazelcast.xml
testsuites/performance/performance-context-metrics/src/test/resources/infinispan/default-jgroups-tcp.xml [new file with mode: 0644]
testsuites/performance/performance-context-metrics/src/test/resources/infinispan/infinispan.xml

index 6151506..952492f 100644 (file)
@@ -37,8 +37,7 @@ public class ApexDeploymentRestParameters {
     private static final String DEFAULT_STATIC_PATH = "/";
 
     // Package that will field REST requests
-    public static final String[] DEFAULT_PACKAGES =
-            new String[] { "com.ericsson.apex.services.client.deployment.rest" };
+    private static final String[] DEFAULT_PACKAGES = new String[] {"org.onap.policy.apex.client.deployment.rest"};
 
     // The services parameters
     private boolean helpSet = false;
index 08b8692..09b34eb 100644 (file)
@@ -72,30 +72,33 @@ import org.slf4j.ext.XLoggerFactory;
 /**
  * The class represents the root resource exposed at the base URL<br>
  * The url to access this resource would be in the form {@code <baseURL>/rest/<session>/....} <br>
- * For example: a PUT request to the following URL {@code http://localhost:8080/apex/rest/109/ContextSchema/Update},
- * with a JSON string payload containing the new {@code Schema} in the body, can be explained as:
+ * For example: a PUT request to the following URL
+ * {@code http://localhost:8080/apex/rest/109/ContextSchema/Update}, with a JSON string payload
+ * containing the new {@code Schema} in the body, can be explained as:
  * <ul>
  * <li>The server or servlet is running at the base URL {@code http://localhost:8080/apex}
- * <li>This resource {@code ApexRestEditorResource} is used because the path {@code rest/109} matches the {@code Path}
- * filter specification for this Resource ({@code @Path("rest/{session}")}), where the {@code int} path parameter
- * {@code session} is assigned the {@code int} value {@code 109}
- * <li>The path {@code ContextSchema/Update} redirects this call to the method {@link #updateContextSchema(String)},
- * which should be a {@link javax.ws.rs.PUT}, with a single String in the body/payload which gets mapped to the single
- * String parameter for the method.
- * <li>So, in summary, the REST request updates a {@code ContextSchema} as specified in the payload for {@code session}
- * number {@code 109}
+ * <li>This resource {@code ApexRestEditorResource} is used because the path {@code rest/109}
+ * matches the {@code Path} filter specification for this Resource
+ * ({@code @Path("rest/{session}")}), where the {@code int} path parameter {@code session} is
+ * assigned the {@code int} value {@code 109}
+ * <li>The path {@code ContextSchema/Update} redirects this call to the method
+ * {@link #updateContextSchema(String)}, which should be a {@link javax.ws.rs.PUT}, with a single
+ * String in the body/payload which gets mapped to the single String parameter for the method.
+ * <li>So, in summary, the REST request updates a {@code ContextSchema} as specified in the payload
+ * for {@code session} number {@code 109}
  * </ul>
  *
- * <b>Note:</b> An allocated {@code Session} identifier must be included in (almost) all requests. Models for different
- * {@code Session} identifiers are completely isolated from one another.
+ * <b>Note:</b> An allocated {@code Session} identifier must be included in (almost) all requests.
+ * Models for different {@code Session} identifiers are completely isolated from one another.
  *
- * <b>Note:</b> To create a new {@code Session}, and have a new session ID allocated use {@link javax.ws.rs.GET} request
- * to {@code <baseURL>/rest/-1/Session/Create} (for example: {@code http://localhost:8080/apex/rest/-1/Session/Create} )
+ * <b>Note:</b> To create a new {@code Session}, and have a new session ID allocated use
+ * {@link javax.ws.rs.GET} request to {@code <baseURL>/rest/-1/Session/Create} (for example:
+ * {@code http://localhost:8080/apex/rest/-1/Session/Create} )
  *
  */
 @Path("editor/{session}")
-@Produces({ MediaType.APPLICATION_JSON })
-@Consumes({ MediaType.APPLICATION_JSON })
+@Produces({MediaType.APPLICATION_JSON})
+@Consumes({MediaType.APPLICATION_JSON})
 
 public class ApexEditorRestResource {
     // Get a reference to the logger
@@ -115,8 +118,8 @@ public class ApexEditorRestResource {
     private ApexModel sessionApexModel = null;
 
     /**
-     * This method sets the Apex model for the current editor session. Don't forget to call {@link #commitChanges()}
-     * when finished! This makes requests atomic.
+     * This method sets the Apex model for the current editor session. Don't forget to call
+     * {@link #commitChanges()} when finished! This makes requests atomic.
      *
      * @return the result of finding the session Apex model and setting it
      */
@@ -136,7 +139,8 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * This method sets the Apex model for the current editor session. Don't make any changes to the model.
+     * This method sets the Apex model for the current editor session. Don't make any changes to the
+     * model.
      *
      * @return the result of finding the session Apex model and setting it
      */
@@ -156,8 +160,8 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * This method commits changes to the Apex model for the current editor session. This should only be called once, at
-     * the end of a successful change to the model for this session
+     * This method commits changes to the Apex model for the current editor session. This should
+     * only be called once, at the end of a successful change to the model for this session
      *
      * @return the result of committing the session Apex model
      */
@@ -174,12 +178,13 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * Creates a new session. Always call this method with sessionID -1, whereby a new sessionID will be allocated. If
-     * successful the new sessionID will be available in the first message in the result.
+     * Creates a new session. Always call this method with sessionID -1, whereby a new sessionID
+     * will be allocated. If successful the new sessionID will be available in the first message in
+     * the result.
      *
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}. This includes the session id
-     *         for this session.
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}.
+     *         This includes the session id for this session.
      */
     @GET
     @Path("Session/Create")
@@ -216,10 +221,10 @@ public class ApexEditorRestResource {
     /**
      * Load the model from a JSON string for this session.
      *
-     * @param jsonString the JSON string to be parsed. The returned value(s) will be similar to {@link AxPolicyModel},
-     *        with merged {@linkplain AxKeyInfo} for the root object.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @param jsonString the JSON string to be parsed. The returned value(s) will be similar to
+     *        {@link AxPolicyModel}, with merged {@linkplain AxKeyInfo} for the root object.
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @PUT
     @Path("/Model/Load")
@@ -247,11 +252,11 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * Analyse the model and return analysis results. If successful the analysis results will be available in the
-     * messages in the result.
+     * Analyse the model and return analysis results. If successful the analysis results will be
+     * available in the messages in the result.
      *
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("Model/Analyse")
@@ -276,11 +281,11 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * Validate the model and return validation results. If successful the validation results will be available in the
-     * messages in the result.
+     * Validate the model and return validation results. If successful the validation results will
+     * be available in the messages in the result.
      *
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("Model/Validate")
@@ -309,9 +314,10 @@ public class ApexEditorRestResource {
     /**
      * Creates the new model model for this session.
      *
-     * @param jsonString the JSON string to be parsed containing the new model. See {@linkplain BeanModel}
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @param jsonString the JSON string to be parsed containing the new model. See
+     *        {@linkplain BeanModel}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @POST
     @Path("Model/Create")
@@ -347,9 +353,10 @@ public class ApexEditorRestResource {
     /**
      * Update the model for this session.
      *
-     * @param jsonString the JSON string to be parsed containing the updated model. See {@linkplain BeanModel}
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @param jsonString the JSON string to be parsed containing the updated model. See
+     *        {@linkplain BeanModel}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @PUT
     @Path("Model/Update")
@@ -379,11 +386,11 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * Gets the key for the model for this session. If successful the model key will be available in the first message
-     * in the result. See {@linkplain AxKey}
+     * Gets the key for the model for this session. If successful the model key will be available in
+     * the first message in the result. See {@linkplain AxKey}
      *
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("Model/GetKey")
@@ -408,12 +415,12 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * Retrieve the model for this session. If successful the model will be available in the first message in the
-     * result. The returned value will be similar to a {@link AxPolicyModel}, with merged {@linkplain AxKeyInfo} for the
-     * root object.
+     * Retrieve the model for this session. If successful the model will be available in the first
+     * message in the result. The returned value will be similar to a {@link AxPolicyModel}, with
+     * merged {@linkplain AxKeyInfo} for the root object.
      *
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("Model/Get")
@@ -469,7 +476,9 @@ public class ApexEditorRestResource {
             LOGGER.catching(e);
             throw e;
         } finally {
-            LOGGER.exit(ret.isOK());
+            if (ret != null) {
+                LOGGER.exit(ret.isOK());
+            }
             LOGGER.info("Model/Download" + (ret != null && ret.isOK() ? ": OK" : ": Not OK"));
         }
     }
@@ -477,8 +486,8 @@ public class ApexEditorRestResource {
     /**
      * Delete the model for this session.
      *
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @DELETE
     @Path("Model/Delete")
@@ -506,13 +515,13 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * List key information with the given key names/versions. If successful the result(s) will be available in the
-     * result messages. See {@linkplain AxKeyInfo}
+     * List key information with the given key names/versions. If successful the result(s) will be
+     * available in the result messages. See {@linkplain AxKeyInfo}
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("KeyInformation/Get")
@@ -550,8 +559,8 @@ public class ApexEditorRestResource {
      * Creates a context schema with the information in the JSON string passed.
      *
      * @param jsonString the JSON string to be parsed. See {@linkplain BeanContextSchema}
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @POST
     @Path("ContextSchema/Create")
@@ -585,8 +594,8 @@ public class ApexEditorRestResource {
      * Update a context schema with the information in the JSON string passed.
      *
      * @param jsonString the JSON string to be parsed. See {@linkplain BeanContextSchema}
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @PUT
     @Path("ContextSchema/Update")
@@ -618,14 +627,14 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * List context schemas with the given key names/versions. If successful the result(s) will be available in the
-     * result messages. The returned value(s) will be similar to {@link AxContextSchema}, with merged
-     * {@linkplain AxKeyInfo} for the root object.
+     * List context schemas with the given key names/versions. If successful the result(s) will be
+     * available in the result messages. The returned value(s) will be similar to
+     * {@link AxContextSchema}, with merged {@linkplain AxKeyInfo} for the root object.
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("ContextSchema/Get")
@@ -669,8 +678,8 @@ public class ApexEditorRestResource {
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @DELETE
     @Path("ContextSchema/Delete")
@@ -708,13 +717,13 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * Validate context schemas with the given key names/versions. The result(s) will be available in the result
-     * messages.
+     * Validate context schemas with the given key names/versions. The result(s) will be available
+     * in the result messages.
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("Validate/ContextSchema")
@@ -757,8 +766,8 @@ public class ApexEditorRestResource {
      * Creates a context album with the information in the JSON string passed.
      *
      * @param jsonString the JSON string to be parsed. See {@linkplain BeanContextAlbum}
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @POST
     @Path("ContextAlbum/Create")
@@ -793,8 +802,8 @@ public class ApexEditorRestResource {
      * Update a context album with the information in the JSON string passed.
      *
      * @param jsonString the JSON string to be parsed. See {@linkplain BeanContextAlbum}
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @PUT
     @Path("ContextAlbum/Update")
@@ -826,14 +835,14 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * List context albums with the given key names/versions. If successful the result(s) will be available in the
-     * result messages. The returned value(s) will be similar to {@link AxContextAlbum}, with merged
-     * {@linkplain AxKeyInfo} for the root object.
+     * List context albums with the given key names/versions. If successful the result(s) will be
+     * available in the result messages. The returned value(s) will be similar to
+     * {@link AxContextAlbum}, with merged {@linkplain AxKeyInfo} for the root object.
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("ContextAlbum/Get")
@@ -877,8 +886,8 @@ public class ApexEditorRestResource {
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @DELETE
     @Path("ContextAlbum/Delete")
@@ -916,13 +925,13 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * Validate context albums with the given key names/versions. The result(s) will be available in the result
-     * messages.
+     * Validate context albums with the given key names/versions. The result(s) will be available in
+     * the result messages.
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("Validate/ContextAlbum")
@@ -965,8 +974,8 @@ public class ApexEditorRestResource {
      * Creates an event with the information in the JSON string passed.
      *
      * @param jsonString the JSON string to be parsed. See {@linkplain BeanEvent}
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @POST
     @Path("Event/Create")
@@ -1023,8 +1032,8 @@ public class ApexEditorRestResource {
      * Update an event with the information in the JSON string passed.
      *
      * @param jsonString the JSON string to be parsed. See {@linkplain BeanEvent}
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @PUT
     @Path("Event/Update")
@@ -1066,14 +1075,14 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * List events with the given key names/versions. If successful the result(s) will be available in the result
-     * messages. The returned value(s) will be similar to {@link AxEvent}, with merged {@linkplain AxKeyInfo} for the
-     * root object.
+     * List events with the given key names/versions. If successful the result(s) will be available
+     * in the result messages. The returned value(s) will be similar to {@link AxEvent}, with merged
+     * {@linkplain AxKeyInfo} for the root object.
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("Event/Get")
@@ -1116,8 +1125,8 @@ public class ApexEditorRestResource {
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @DELETE
     @Path("Event/Delete")
@@ -1155,12 +1164,13 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * Validate events with the given key names/versions. The result(s) will be available in the result messages.
+     * Validate events with the given key names/versions. The result(s) will be available in the
+     * result messages.
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("Validate/Event")
@@ -1203,8 +1213,8 @@ public class ApexEditorRestResource {
      * Creates a task with the information in the JSON string passed.
      *
      * @param jsonString the JSON string to be parsed. See {@linkplain BeanTask}
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @POST
     @Path("Task/Create")
@@ -1353,8 +1363,8 @@ public class ApexEditorRestResource {
      * Update a task with the information in the JSON string passed.
      *
      * @param jsonString the JSON string to be parsed. See {@linkplain BeanTask}
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @PUT
     @Path("Task/Update")
@@ -1396,14 +1406,14 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * List tasks with the given key names/versions. If successful the result(s) will be available in the result
-     * messages. The returned value(s) will be similar to {@link AxTask}, with merged {@linkplain AxKeyInfo} for the
-     * root object.
+     * List tasks with the given key names/versions. If successful the result(s) will be available
+     * in the result messages. The returned value(s) will be similar to {@link AxTask}, with merged
+     * {@linkplain AxKeyInfo} for the root object.
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("Task/Get")
@@ -1446,8 +1456,8 @@ public class ApexEditorRestResource {
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @DELETE
     @Path("Task/Delete")
@@ -1470,7 +1480,8 @@ public class ApexEditorRestResource {
                 version1 = null;
             }
 
-            // all input/output fields, parameters, logic, context references is "owned"/contained in the task, so
+            // all input/output fields, parameters, logic, context references is "owned"/contained
+            // in the task, so
             // deleting the task removes all of these
             ret = sessionApexModel.deleteTask(name1, version1);
             if (ret.isOK()) {
@@ -1487,12 +1498,13 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * Validate tasks with the given key names/versions. The result(s) will be available in the result messages.
+     * Validate tasks with the given key names/versions. The result(s) will be available in the
+     * result messages.
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("Validate/Task")
@@ -1536,8 +1548,8 @@ public class ApexEditorRestResource {
      * Creates a policy with the information in the JSON string passed.
      *
      * @param jsonString the JSON string to be parsed See {@linkplain BeanPolicy}
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @POST
     @Path("Policy/Create")
@@ -1623,10 +1635,11 @@ public class ApexEditorRestResource {
                 if (contexts != null) {
                     for (final BeanKeyRef c : contexts) {
                         if (c == null) {
-                            ret = new ApexAPIResult(RESULT.FAILED, "Null or invalid context reference \"" + c + "\" for"
-                                    + " state \"" + statename + "\" for policy \"" + policyname + ":" + policyversion
-                                    + "\". The policy was created, but there was an error adding the context reference for the state."
-                                    + " The policy has only been partially defined.");
+                            ret = new ApexAPIResult(RESULT.FAILED,
+                                    "Null or invalid context reference \"" + c + "\" for" + " state \"" + statename
+                                            + "\" for policy \"" + policyname + ":" + policyversion
+                                            + "\". The policy was created, but there was an error adding the context reference for the state."
+                                            + " The policy has only been partially defined.");
                             return ret;
                         }
                         tempres = sessionApexModel.createPolicyStateContextRef(policyname, policyversion, statename,
@@ -1671,21 +1684,22 @@ public class ApexEditorRestResource {
                 }
                 final Map<String, BeanStateOutput> outputs = state.getStateOutputs();
                 if (outputs == null || outputs.isEmpty()) {
-                    ret = new ApexAPIResult(RESULT.FAILED, "No state outputs have been defined in state \"" + statename
-                            + "\" for policy \"" + policyname + ":" + policyversion
-                            + "\". The policy and state were created, but there was an error adding state outputs."
-                            + " The policy has only been partially defined.");
+                    ret = new ApexAPIResult(RESULT.FAILED,
+                            "No state outputs have been defined in state \"" + statename + "\" for policy \""
+                                    + policyname + ":" + policyversion
+                                    + "\". The policy and state were created, but there was an error adding state outputs."
+                                    + " The policy has only been partially defined.");
                     return ret;
                 }
                 for (final Map.Entry<String, BeanStateOutput> o : outputs.entrySet()) {
                     final String outputname = o.getKey();
                     final BeanStateOutput output = o.getValue();
                     if (outputname == null || output == null || output.getEvent() == null) {
-                        ret = new ApexAPIResult(RESULT.FAILED, "Null or invalid output information for output named \""
-                                + outputname + "\" in state \"" + statename + "\" for policy \"" + policyname + ":"
-                                + policyversion
-                                + "\". The policy and state were created, but there was an error adding the output."
-                                + " The policy has only been partially defined.");
+                        ret = new ApexAPIResult(RESULT.FAILED,
+                                "Null or invalid output information for output named \"" + outputname + "\" in state \""
+                                        + statename + "\" for policy \"" + policyname + ":" + policyversion
+                                        + "\". The policy and state were created, but there was an error adding the output."
+                                        + " The policy has only been partially defined.");
                         return ret;
                     }
                     tempres = sessionApexModel.createPolicyStateOutput(policyname, policyversion, statename, outputname,
@@ -1713,11 +1727,11 @@ public class ApexEditorRestResource {
                     final String tasklocalname = t.getKey();
                     final BeanStateTaskRef taskref = t.getValue();
                     if (tasklocalname == null || taskref == null || taskref.getTask() == null) {
-                        ret = new ApexAPIResult(RESULT.FAILED, "Null or invalid task information for task named \""
-                                + tasklocalname + "\" in state \"" + statename + "\" for for policy \"" + policyname
-                                + ":" + policyversion
-                                + "\". The policy and state were created, but there was an error adding the task. "
-                                + "The policy has only been partially defined.");
+                        ret = new ApexAPIResult(RESULT.FAILED,
+                                "Null or invalid task information for task named \"" + tasklocalname + "\" in state \""
+                                        + statename + "\" for for policy \"" + policyname + ":" + policyversion
+                                        + "\". The policy and state were created, but there was an error adding the task. "
+                                        + "The policy has only been partially defined.");
                         return ret;
                     }
                     tempres = sessionApexModel.createPolicyStateTaskRef(policyname, policyversion, statename,
@@ -1753,8 +1767,8 @@ public class ApexEditorRestResource {
      *
      * @param firstStatePeriodic indicates if periodic event should be created and added to model
      * @param jsonString the JSON string to be parsed. See {@linkplain BeanPolicy}
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @PUT
     @Path("Policy/Update")
@@ -1807,14 +1821,14 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * List policies with the given key names/versions. If successful the result(s) will be available in the result
-     * messages. The returned value(s) will be similar to {@link AxPolicy}, with merged {@linkplain AxKey Info} for the
-     * root object.
+     * List policies with the given key names/versions. If successful the result(s) will be
+     * available in the result messages. The returned value(s) will be similar to {@link AxPolicy},
+     * with merged {@linkplain AxKey Info} for the root object.
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @GET
     @Path("Policy/Get")
@@ -1859,8 +1873,8 @@ public class ApexEditorRestResource {
      *
      * @param name the name to search for. If null or empty, then all names will be queried
      * @param version the version to search for. If null then all versions will be searched for.
-     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return true. Any
-     *         messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
+     * @return an ApexAPIResult object. If successful then {@link ApexAPIResult#isOK()} will return
+     *         true. Any messages/errors can be retrieved using {@link ApexAPIResult#getMessages()}
      */
     @DELETE
     @Path("Policy/Delete")
@@ -1883,7 +1897,8 @@ public class ApexEditorRestResource {
                 version1 = null;
             }
 
-            // all input/output fields, parameters, logic, context references is "owned"/contained in the task, so
+            // all input/output fields, parameters, logic, context references is "owned"/contained
+            // in the task, so
             // deleting the task removes all of these
             ret = sessionApexModel.deletePolicy(name1, version1);
             if (ret.isOK()) {
@@ -1900,12 +1915,14 @@ public class ApexEditorRestResource {
     }
 
     /**
-     * The json strings representing the objects listed, stored in result.messages[], does not contain the
-     * AxKeyInformation for that object. This utility method retrieves the AxKeyInfo for each object and adds it to the
-     * json for the object.
+     * The json strings representing the objects listed, stored in result.messages[], does not
+     * contain the AxKeyInformation for that object. This utility method retrieves the AxKeyInfo for
+     * each object and adds it to the json for the object.
      *
-     * @param result The list result, containing json representations of objects stored in its "messages" array
-     * @return The list result, containing json augmented representations of objects stored in its "messages" array
+     * @param result The list result, containing json representations of objects stored in its
+     *        "messages" array
+     * @return The list result, containing json augmented representations of objects stored in its
+     *         "messages" array
      */
     private ApexAPIResult addKeyInfo2Messages(final ApexAPIResult result) {
         if (result.isNOK()) {
@@ -2004,8 +2021,8 @@ public class ApexEditorRestResource {
     }
 
     /*
-     * This method is used only for testing and is used to cause an exception on calls from unit test to test exception
-     * handling.
+     * This method is used only for testing and is used to cause an exception on calls from unit
+     * test to test exception handling.
      */
     protected static int createCorruptSession() {
         final ApexEditorRestResource apexEditorRestResource = new ApexEditorRestResource();
index a1a8efc..cb6d76f 100644 (file)
@@ -37,8 +37,7 @@ public class ApexMonitoringRestParameters {
     private static final String DEFAULT_STATIC_PATH = "/";
 
     // Package that will field REST requests
-    public static final String[] DEFAULT_PACKAGES =
-            new String[] { "org.onap.policy.apex.services.client.monitoring.rest" };
+    private static final String[] DEFAULT_PACKAGES = new String[] {"org.onap.policy.apex.client.monitoring.rest"};
 
     // The services parameters
     private boolean helpSet = false;
index dc8ec6e..77ef30d 100644 (file)
             <artifactId>junit</artifactId>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-test</artifactId>
+            <version>4.0.0</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>log4j</groupId>
+                    <artifactId>log4j</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
index 03ef650..888394b 100644 (file)
@@ -44,7 +44,6 @@ import static org.onap.policy.apex.context.test.utils.Constants.STRING_GLOBAL_VA
 import static org.onap.policy.apex.context.test.utils.Constants.STRING_VAL;
 import static org.onap.policy.apex.context.test.utils.Constants.TEST_POLICY_CONTEXT_ITEM;
 import static org.onap.policy.apex.context.test.utils.Constants.TIME_ZONE;
-import static org.onap.policy.apex.context.test.utils.Constants.USED_ARTIFACT_STACK_ARRAY;
 import static org.onap.policy.apex.context.test.utils.Constants.VERSION;
 
 import java.util.Collection;
@@ -79,6 +78,7 @@ import org.onap.policy.apex.context.test.concepts.TestExternalContextItem;
 import org.onap.policy.apex.context.test.concepts.TestGlobalContextItem;
 import org.onap.policy.apex.context.test.concepts.TestPolicyContextItem;
 import org.onap.policy.apex.context.test.factory.TestContextAlbumFactory;
+import org.onap.policy.apex.context.test.utils.Constants;
 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
 import org.onap.policy.apex.model.basicmodel.concepts.AxValidationResult;
 import org.onap.policy.apex.model.contextmodel.concepts.AxContextModel;
@@ -129,7 +129,7 @@ public class ContextInstantiation {
                     contextDistributor.createContextAlbum(new AxArtifactKey(POLICY_CONTEXT_ALBUM, VERSION));
 
             assertNotNull(policyContextAlbum);
-            policyContextAlbum.setUserArtifactStack(USED_ARTIFACT_STACK_ARRAY);
+            policyContextAlbum.setUserArtifactStack(Constants.getAxArtifactKeyArray());
 
             final Date testDate = new Date();
 
@@ -204,7 +204,7 @@ public class ContextInstantiation {
             final AxArtifactKey axContextAlbumKey = new AxArtifactKey(EXTERNAL_CONTEXT_ALBUM, VERSION);
             final ContextAlbum externalContextAlbum = contextDistributor.createContextAlbum(axContextAlbumKey);
             assertNotNull(externalContextAlbum);
-            externalContextAlbum.setUserArtifactStack(USED_ARTIFACT_STACK_ARRAY);
+            externalContextAlbum.setUserArtifactStack(Constants.getAxArtifactKeyArray());
 
             externalContextAlbum.putAll(valueMap2);
             externalContextAlbum.getAlbumDefinition().setWritable(false);
@@ -363,7 +363,7 @@ public class ContextInstantiation {
         final ContextAlbum globalContextAlbum =
                 contextDistributor.createContextAlbum(new AxArtifactKey(GLOBAL_CONTEXT_ALBUM, VERSION));
         assertNotNull(globalContextAlbum);
-        globalContextAlbum.setUserArtifactStack(USED_ARTIFACT_STACK_ARRAY);
+        globalContextAlbum.setUserArtifactStack(Constants.getAxArtifactKeyArray());
         return globalContextAlbum;
     }
 
index 75d5597..3310016 100644 (file)
@@ -31,8 +31,8 @@ import static org.onap.policy.apex.context.test.utils.Constants.EXCEPTION_MESSAG
 import static org.onap.policy.apex.context.test.utils.Constants.LONG_CONTEXT_ALBUM;
 import static org.onap.policy.apex.context.test.utils.Constants.MAP_CONTEXT_ALBUM;
 import static org.onap.policy.apex.context.test.utils.Constants.TIME_ZONE;
-import static org.onap.policy.apex.context.test.utils.Constants.USED_ARTIFACT_STACK_ARRAY;
 import static org.onap.policy.apex.context.test.utils.Constants.VERSION;
+import static org.onap.policy.apex.context.test.utils.Constants.getAxArtifactKeyArray;
 
 import java.io.IOException;
 import java.util.Date;
@@ -160,7 +160,7 @@ public class ContextUpdate {
         final ContextAlbum longContextAlbum =
                 contextDistributor.createContextAlbum(new AxArtifactKey(albumKey, VERSION));
         assertNotNull(longContextAlbum);
-        longContextAlbum.setUserArtifactStack(USED_ARTIFACT_STACK_ARRAY);
+        longContextAlbum.setUserArtifactStack(getAxArtifactKeyArray());
         return longContextAlbum;
     }
 
index dbf5ab2..4041c07 100644 (file)
@@ -36,7 +36,6 @@ import static org.onap.policy.apex.context.test.utils.Constants.LONG_VAL;
 import static org.onap.policy.apex.context.test.utils.Constants.PI_VAL;
 import static org.onap.policy.apex.context.test.utils.Constants.STRING_GLOBAL_VAL;
 import static org.onap.policy.apex.context.test.utils.Constants.TIME_ZONE;
-import static org.onap.policy.apex.context.test.utils.Constants.USED_ARTIFACT_STACK_ARRAY;
 import static org.onap.policy.apex.context.test.utils.Constants.VERSION;
 
 import java.util.Collection;
@@ -63,6 +62,7 @@ import org.onap.policy.apex.context.test.concepts.TestContextIntItem;
 import org.onap.policy.apex.context.test.concepts.TestContextLongItem;
 import org.onap.policy.apex.context.test.concepts.TestContextLongObjectItem;
 import org.onap.policy.apex.context.test.concepts.TestContextStringItem;
+import org.onap.policy.apex.context.test.utils.Constants;
 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
 import org.slf4j.ext.XLogger;
 import org.slf4j.ext.XLoggerFactory;
@@ -351,7 +351,7 @@ public class SequentialContextInstantiation {
             throws ContextException {
         final ContextAlbum dateAlbum = contextDistributor.createContextAlbum(new AxArtifactKey(albumName, VERSION));
         assertNotNull(dateAlbum);
-        dateAlbum.setUserArtifactStack(USED_ARTIFACT_STACK_ARRAY);
+        dateAlbum.setUserArtifactStack(Constants.getAxArtifactKeyArray());
         return dateAlbum;
     }
 
diff --git a/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/AlbumModifier.java b/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/AlbumModifier.java
new file mode 100644 (file)
index 0000000..24e6331
--- /dev/null
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. 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.
+ * 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.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.apex.context.test.lock.modifier;
+
+import org.onap.policy.apex.context.ContextAlbum;
+import org.onap.policy.apex.context.ContextException;
+
+public interface AlbumModifier {
+
+    void modifyAlbum(final ContextAlbum contextAlbum, final int loopSize, final int arraySize) throws ContextException;
+
+}
diff --git a/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/LockType.java b/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/LockType.java
new file mode 100644 (file)
index 0000000..0dd0e72
--- /dev/null
@@ -0,0 +1,77 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. 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.
+ * 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.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.apex.context.test.lock.modifier;
+
+import org.onap.policy.apex.context.ContextRuntimeException;
+
+public enum LockType {
+
+    NO_LOCK(0) {
+        @Override
+        public AlbumModifier getAlbumModifier() {
+            return NO_LOCK_MODIFER;
+        }
+    },
+    READ_LOCK(1) {
+        @Override
+        public AlbumModifier getAlbumModifier() {
+            return READ_LOCK_MODIFER;
+        }
+    },
+    WRITE_LOCK(2) {
+        @Override
+        public AlbumModifier getAlbumModifier() {
+            return WRITE_LOCK_MODIFER;
+        }
+    },
+    WRITE_LOCK_SINGLE_VALUE_UPDATE(3) {
+        @Override
+        public AlbumModifier getAlbumModifier() {
+            return WRITE_LOCK_SINGLE_VALUE_MODIFER;
+        }
+    };
+
+    private static final AlbumModifier NO_LOCK_MODIFER = new NoLockAlbumModifier();
+    private static final AlbumModifier READ_LOCK_MODIFER = new ReadLockAlbumModifier();
+    private static final AlbumModifier WRITE_LOCK_MODIFER = new WriteLockAlbumModifier();
+    private static final AlbumModifier WRITE_LOCK_SINGLE_VALUE_MODIFER = new SingleValueWriteLockAlbumModifier();
+
+    private final int value;
+
+    private LockType(final int value) {
+        this.value = value;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public static LockType getLockType(final int value) {
+        for (final LockType lockType : LockType.values()) {
+            if (lockType.getValue() == value) {
+                return lockType;
+            }
+        }
+        throw new ContextRuntimeException("Invalid Lock type value: " + value);
+    }
+
+    public abstract AlbumModifier getAlbumModifier();
+
+}
diff --git a/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/NoLockAlbumModifier.java b/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/NoLockAlbumModifier.java
new file mode 100644 (file)
index 0000000..b6ee1b8
--- /dev/null
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. 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.
+ * 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.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.apex.context.test.lock.modifier;
+
+import java.util.Random;
+
+import org.onap.policy.apex.context.ContextAlbum;
+import org.onap.policy.apex.context.test.concepts.TestContextLongItem;
+import org.slf4j.ext.XLogger;
+import org.slf4j.ext.XLoggerFactory;
+
+public class NoLockAlbumModifier implements AlbumModifier {
+    private static final XLogger LOGGER = XLoggerFactory.getXLogger(NoLockAlbumModifier.class);
+
+    @Override
+    public void modifyAlbum(final ContextAlbum contextAlbum, final int loopSize, final int arraySize) {
+        final Random rand = new Random();
+        for (int i = 0; i < loopSize; i++) {
+            final String nextLongKey = Integer.toString(rand.nextInt(arraySize));
+            final TestContextLongItem item = (TestContextLongItem) contextAlbum.get(nextLongKey);
+            final long value = item.getLongValue();
+            if (LOGGER.isTraceEnabled()) {
+                LOGGER.trace("lock type={}, value={}", LockType.NO_LOCK, value);
+            }
+        }
+    }
+
+}
diff --git a/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/ReadLockAlbumModifier.java b/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/ReadLockAlbumModifier.java
new file mode 100644 (file)
index 0000000..57c6b75
--- /dev/null
@@ -0,0 +1,60 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. 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.
+ * 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.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.apex.context.test.lock.modifier;
+
+import java.util.Random;
+
+import org.onap.policy.apex.context.ContextAlbum;
+import org.onap.policy.apex.context.ContextException;
+import org.onap.policy.apex.context.test.concepts.TestContextLongItem;
+import org.slf4j.ext.XLogger;
+import org.slf4j.ext.XLoggerFactory;
+
+public class ReadLockAlbumModifier implements AlbumModifier {
+    private static final XLogger LOGGER = XLoggerFactory.getXLogger(ReadLockAlbumModifier.class);
+
+    @Override
+    public void modifyAlbum(final ContextAlbum contextAlbum, final int loopSize, final int arraySize) {
+        final Random rand = new Random();
+        for (int i = 0; i < loopSize; i++) {
+            final String nextLongKey = Integer.toString(rand.nextInt(arraySize));
+            try {
+                contextAlbum.lockForReading(nextLongKey);
+            } catch (final ContextException e) {
+                LOGGER.error("could not acquire read lock on context album, key=" + nextLongKey, e);
+                continue;
+            }
+
+            final TestContextLongItem item = (TestContextLongItem) contextAlbum.get(nextLongKey);
+            final long value = item.getLongValue();
+            if (LOGGER.isTraceEnabled()) {
+                LOGGER.trace("lock type={}, value={}", LockType.READ_LOCK, value);
+            }
+
+            try {
+                contextAlbum.unlockForReading(nextLongKey);
+            } catch (final ContextException e) {
+                LOGGER.error("could not release read lock on context album, key=" + nextLongKey, e);
+            }
+        }
+
+    }
+
+}
diff --git a/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/SingleValueWriteLockAlbumModifier.java b/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/SingleValueWriteLockAlbumModifier.java
new file mode 100644 (file)
index 0000000..a41de8d
--- /dev/null
@@ -0,0 +1,65 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. 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.
+ * 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.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.apex.context.test.lock.modifier;
+
+import static org.onap.policy.apex.context.test.utils.Constants.TEST_VALUE;
+
+import org.onap.policy.apex.context.ContextAlbum;
+import org.onap.policy.apex.context.ContextException;
+import org.onap.policy.apex.context.test.concepts.TestContextLongItem;
+import org.slf4j.ext.XLogger;
+import org.slf4j.ext.XLoggerFactory;
+
+public class SingleValueWriteLockAlbumModifier implements AlbumModifier {
+    private static final XLogger LOGGER = XLoggerFactory.getXLogger(SingleValueWriteLockAlbumModifier.class);
+
+
+    @Override
+    public void modifyAlbum(final ContextAlbum contextAlbum, final int loopSize, final int arraySize)
+            throws ContextException {
+        for (int i = 0; i < loopSize; i++) {
+            try {
+                contextAlbum.lockForWriting(TEST_VALUE);
+                TestContextLongItem item = (TestContextLongItem) contextAlbum.get(TEST_VALUE);
+                if (item != null) {
+                    long value = item.getLongValue();
+                    item.setLongValue(++value);
+                } else {
+                    item = new TestContextLongItem(0L);
+                }
+                contextAlbum.put(TEST_VALUE, item);
+            } finally {
+                contextAlbum.unlockForWriting(TEST_VALUE);
+            }
+        }
+
+        try {
+            contextAlbum.lockForWriting(TEST_VALUE);
+            final TestContextLongItem item = (TestContextLongItem) contextAlbum.get(TEST_VALUE);
+            final long value = item.getLongValue();
+            LOGGER.info("Value after modification: ", value);
+        } catch (final Exception e) {
+            LOGGER.error("could not read the value in the test context album", e);
+        } finally {
+            contextAlbum.unlockForWriting(TEST_VALUE);
+        }
+    }
+
+}
diff --git a/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/WriteLockAlbumModifier.java b/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/lock/modifier/WriteLockAlbumModifier.java
new file mode 100644 (file)
index 0000000..09e2800
--- /dev/null
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. 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.
+ * 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.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.apex.context.test.lock.modifier;
+
+import java.util.Random;
+
+import org.onap.policy.apex.context.ContextAlbum;
+import org.onap.policy.apex.context.ContextException;
+import org.onap.policy.apex.context.test.concepts.TestContextLongItem;
+import org.slf4j.ext.XLogger;
+import org.slf4j.ext.XLoggerFactory;
+
+public class WriteLockAlbumModifier implements AlbumModifier {
+    private static final XLogger LOGGER = XLoggerFactory.getXLogger(WriteLockAlbumModifier.class);
+
+
+    @Override
+    public void modifyAlbum(final ContextAlbum contextAlbum, final int loopSize, final int arraySize) {
+        final Random rand = new Random();
+        for (int i = 0; i < loopSize; i++) {
+            final String nextLongKey = Integer.toString(rand.nextInt(arraySize));
+            try {
+                contextAlbum.lockForWriting(nextLongKey);
+            } catch (final ContextException e) {
+                LOGGER.error("could not acquire write lock on context album, key=" + nextLongKey, e);
+                continue;
+            }
+
+            final TestContextLongItem item = (TestContextLongItem) contextAlbum.get(nextLongKey);
+            long value = item.getLongValue();
+            if (LOGGER.isTraceEnabled()) {
+                LOGGER.trace("lock type={}, value={}", LockType.WRITE_LOCK, value);
+            }
+            item.setLongValue(++value);
+            contextAlbum.put(nextLongKey, item);
+
+            try {
+                contextAlbum.unlockForWriting(nextLongKey);
+            } catch (final ContextException e) {
+                LOGGER.error("could not release write lock on context album, key=" + nextLongKey, e);
+            }
+        }
+
+    }
+
+}
index b62364e..b373e9f 100644 (file)
@@ -23,22 +23,20 @@ package org.onap.policy.apex.context.test.locking;
 import java.io.Closeable;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
 import org.onap.policy.apex.context.ContextAlbum;
 import org.onap.policy.apex.context.ContextException;
 import org.onap.policy.apex.context.Distributor;
-import org.onap.policy.apex.context.impl.distribution.DistributorFactory;
 import org.onap.policy.apex.context.test.concepts.TestContextLongItem;
-import org.onap.policy.apex.context.test.factory.TestContextAlbumFactory;
-import org.onap.policy.apex.context.test.utils.IntegrationThreadFactory;
+import org.onap.policy.apex.context.test.utils.ConfigrationProvider;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
-import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
 import org.onap.policy.apex.model.basicmodel.handling.ApexModelException;
-import org.onap.policy.apex.model.contextmodel.concepts.AxContextModel;
 import org.slf4j.ext.XLogger;
 import org.slf4j.ext.XLoggerFactory;
 
@@ -55,24 +53,17 @@ public class ConcurrentContext {
     private Distributor contextDistributor = null;
     private ContextAlbum lTypeAlbum = null;
 
-    /**
-     * Test concurrent context.
-     *
-     * @param testType the test type
-     * @param jvmCount the jvm count
-     * @param threadCount the thread count
-     * @param threadLoops the thread loops
-     * @return the long
-     * @throws ApexModelException the apex model exception
-     * @throws IOException the IO exception
-     * @throws ApexException the apex exception
-     */
-    public long testConcurrentContext(final String testType, final int jvmCount, final int threadCount,
-            final int threadLoops) throws ApexModelException, IOException, ApexException {
-        final ConcurrentContext concurrentContext = new ConcurrentContext();
+    private final ConfigrationProvider configrationProvider;
+
+    public ConcurrentContext(final ConfigrationProvider configrationProvider) {
+        this.configrationProvider = configrationProvider;
+    }
+
+    public Map<String, TestContextLongItem> testConcurrentContext()
+            throws ApexModelException, IOException, ApexException {
 
         try {
-            concurrentContext.setupAndVerifyContext();
+            setupAndVerifyContext();
         } catch (final Exception exception) {
             LOGGER.error("Error occured while setting up and verifying concurrent context", exception);
             throw exception;
@@ -80,28 +71,25 @@ public class ConcurrentContext {
 
         LOGGER.debug("starting JVMs and threads . . .");
 
-        final String name = getThreadFactoryName(jvmCount, testType);
-        final IntegrationThreadFactory threadFactory = new IntegrationThreadFactory(name);
-        final ExecutorService executorService = Executors.newFixedThreadPool(threadCount, threadFactory);
+        final ExecutorService executorService = configrationProvider.getExecutorService();
 
-        final List<Closeable> tasks = new ArrayList<>(threadCount);
+        final List<Closeable> tasks = new ArrayList<>(configrationProvider.getThreadCount());
 
         addShutDownHook(tasks);
 
         // Check if we have a single JVM or multiple JVMs
-        if (jvmCount == 1) {
+        if (configrationProvider.getJvmCount() == 1) {
             // Run everything in this JVM
-            for (int t = 0; t < threadCount; t++) {
-                final ConcurrentContextThread task = new ConcurrentContextThread(0, t, threadLoops);
+            for (int t = 0; t < configrationProvider.getThreadCount(); t++) {
+                final ConcurrentContextThread task = new ConcurrentContextThread(0, t, configrationProvider);
                 tasks.add(task);
                 executorService.execute(task);
             }
 
         } else {
             // Spawn JVMs to run the tests
-            for (int j = 0; j < jvmCount; j++) {
-                final ConcurrentContextJVMThread task =
-                        new ConcurrentContextJVMThread(testType, j, threadCount, threadLoops);
+            for (int j = 0; j < configrationProvider.getJvmCount(); j++) {
+                final ConcurrentContextJVMThread task = new ConcurrentContextJVMThread(j, configrationProvider);
                 tasks.add(task);
                 executorService.execute(task);
             }
@@ -120,7 +108,7 @@ public class ConcurrentContext {
         LOGGER.info("Shutting down now ...");
         executorService.shutdownNow();
 
-        return concurrentContext.verifyAndClearContext(jvmCount, threadCount, threadLoops);
+        return verifyAndClearContext();
     }
 
 
@@ -140,85 +128,34 @@ public class ConcurrentContext {
         });
     }
 
-
-    private String getThreadFactoryName(final int jvmCount, final String testType) {
-        return jvmCount == 1 ? testType + ":TestConcurrentContextThread_0_"
-                : testType + ":TestConcurrentContextJVMThread_";
-    }
-
     /**
      * Setup and verify context.
      *
      * @throws ContextException the context exception
      */
     private void setupAndVerifyContext() throws ContextException {
-        final AxArtifactKey distributorKey = new AxArtifactKey("ApexDistributor", "0.0.1");
-        contextDistributor = new DistributorFactory().getDistributor(distributorKey);
-
-        // @formatter:off
-        final AxArtifactKey[] usedArtifactStackArray = {
-                new AxArtifactKey("testC-top", "0.0.1"),
-                new AxArtifactKey("testC-next", "0.0.1"),
-                new AxArtifactKey("testC-bot", "0.0.1")
-                };
-        // @formatter:on
-
-        final AxContextModel albumsModel = TestContextAlbumFactory.createMultiAlbumsContextModel();
-        contextDistributor.registerModel(albumsModel);
-
-        lTypeAlbum = contextDistributor.createContextAlbum(new AxArtifactKey("LTypeContextAlbum", "0.0.1"));
-        assert (lTypeAlbum != null);
-        lTypeAlbum.setUserArtifactStack(usedArtifactStackArray);
-
-        // CHECKSTYLE:OFF: checkstyle:magicNumber
-        lTypeAlbum.put("lTypeValue0", new TestContextLongItem(0xFFFFFFFFFFFFFFFFL));
-        lTypeAlbum.put("lTypeValue1", new TestContextLongItem(0xFFFFFFFFFFFFFFFEL));
-        lTypeAlbum.put("lTypeValue2", new TestContextLongItem(0xFFFFFFFFFFFFFFFDL));
-        lTypeAlbum.put("lTypeValue3", new TestContextLongItem(0xFFFFFFFFFFFFFFFCL));
-        lTypeAlbum.put("lTypeValue4", new TestContextLongItem(0xFFFFFFFFFFFFFFFBL));
-        lTypeAlbum.put("lTypeValue5", new TestContextLongItem(0xFFFFFFFFFFFFFFFAL));
-        lTypeAlbum.put("lTypeValue6", new TestContextLongItem(0xFFFFFFFFFFFFFFF9L));
-        lTypeAlbum.put("lTypeValue7", new TestContextLongItem(0xFFFFFFFFFFFFFFF8L));
-        lTypeAlbum.put("lTypeValue8", new TestContextLongItem(0xFFFFFFFFFFFFFFF7L));
-        lTypeAlbum.put("lTypeValue9", new TestContextLongItem(0xFFFFFFFFFFFFFFF6L));
-        lTypeAlbum.put("lTypeValueA", new TestContextLongItem(0xFFFFFFFFFFFFFFF5L));
-        lTypeAlbum.put("lTypeValueB", new TestContextLongItem(0xFFFFFFFFFFFFFFF4L));
-        lTypeAlbum.put("lTypeValueC", new TestContextLongItem(0xFFFFFFFFFFFFFFF3L));
-        lTypeAlbum.put("lTypeValueD", new TestContextLongItem(0xFFFFFFFFFFFFFFF2L));
-        lTypeAlbum.put("lTypeValueE", new TestContextLongItem(0xFFFFFFFFFFFFFFF1L));
-        lTypeAlbum.put("lTypeValueF", new TestContextLongItem(0xFFFFFFFFFFFFFFF0L));
-        LOGGER.debug(lTypeAlbum.toString());
-        assert (lTypeAlbum.size() >= 16);
-        // CHECKSTYLE:ON: checkstyle:magicNumber
-
-        // The initial value for concurrent testing
-        final TestContextLongItem item = new TestContextLongItem(0L);
-        lTypeAlbum.put("testValue", item);
+        contextDistributor = configrationProvider.getDistributor();
+        lTypeAlbum = configrationProvider.getContextAlbum(contextDistributor);
+        final Map<String, Object> initValues = configrationProvider.getContextAlbumInitValues();
 
+        for (final Entry<String, Object> entry : initValues.entrySet()) {
+            lTypeAlbum.put(entry.getKey(), entry.getValue());
+        }
     }
 
-    /**
-     * Verify and clear context.
-     *
-     * @param jvmCount the jvm count
-     * @param threadCount the thread count
-     * @param threadLoops the thread loops
-     * @return the long
-     * @throws ContextException the context exception
-     */
-    private long verifyAndClearContext(final int jvmCount, final int threadCount, final int threadLoops)
-            throws ContextException {
+    private Map<String, TestContextLongItem> verifyAndClearContext() throws ContextException {
+        final Map<String, TestContextLongItem> values = new HashMap<>();
         try {
-            LOGGER.debug("threads finished, end value is {}",
-                    ((TestContextLongItem) lTypeAlbum.get("testValue")).getLongValue());
+
+            for (Entry<String, Object> entry : lTypeAlbum.entrySet()) {
+                values.put(entry.getKey(), (TestContextLongItem) entry.getValue());
+            }
         } catch (final Exception exception) {
             LOGGER.error("Error: ", exception);
         }
-        final long total = ((TestContextLongItem) lTypeAlbum.get("testValue")).getLongValue();
-
         contextDistributor.clear();
         contextDistributor = null;
 
-        return total;
+        return values;
     }
 }
index e2a6b0d..fc1c830 100644 (file)
@@ -30,20 +30,19 @@ import java.util.List;
 import java.util.Map.Entry;
 import java.util.TreeSet;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
 import org.onap.policy.apex.context.ContextAlbum;
 import org.onap.policy.apex.context.Distributor;
-import org.onap.policy.apex.context.impl.distribution.DistributorFactory;
-import org.onap.policy.apex.context.test.factory.TestContextAlbumFactory;
-import org.onap.policy.apex.context.test.utils.IntegrationThreadFactory;
+import org.onap.policy.apex.context.test.utils.ConfigrationProvider;
+import org.onap.policy.apex.context.test.utils.ConfigrationProviderImpl;
+import org.onap.policy.apex.context.test.utils.Constants;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
+import org.onap.policy.apex.model.basicmodel.concepts.ApexRuntimeException;
 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
 import org.onap.policy.apex.model.basicmodel.service.AbstractParameters;
 import org.onap.policy.apex.model.basicmodel.service.ParameterService;
-import org.onap.policy.apex.model.contextmodel.concepts.AxContextModel;
 import org.slf4j.ext.XLogger;
 import org.slf4j.ext.XLoggerFactory;
 
@@ -62,55 +61,29 @@ public final class ConcurrentContextJVM {
 
     private final int jvmNo;
 
-    private final int threadCount;
-
-    private final int threadLoops;
-
     private final ExecutorService executorService;
 
-    /**
-     * The Constructor.
-     *
-     * @param testType the test type
-     * @param jvmNo the jvm no
-     * @param threadCount the thread count
-     * @param threadLoops the thread loops
-     * @throws ApexException the apex exception
-     */
-    private ConcurrentContextJVM(final String testType, final int jvmNo, final int threadCount, final int threadLoops) {
+    private final ConfigrationProvider configrationProvider;
+
+    private ConcurrentContextJVM(final int jvmNo, final ConfigrationProvider configrationProvider) {
         this.jvmNo = jvmNo;
-        this.threadCount = threadCount;
-        this.threadLoops = threadLoops;
-        final String name = testType + ":ConcurrentContextThread_" + jvmNo;
-        this.executorService = Executors.newFixedThreadPool(threadCount, new IntegrationThreadFactory(name));
+        this.configrationProvider = configrationProvider;
+        final String name = configrationProvider.getTestName() + ":ConcurrentContextThread_" + jvmNo;
+        this.executorService = configrationProvider.getExecutorService(name, configrationProvider.getThreadCount());
     }
 
     public void execute() throws ApexException {
         LOGGER.debug("starting JVMs and threads . . .");
 
         final AxArtifactKey distributorKey = new AxArtifactKey("ApexDistributor" + jvmNo, "0.0.1");
-        final Distributor contextDistributor = new DistributorFactory().getDistributor(distributorKey);
-
-        // @formatter:off
-        final AxArtifactKey[] usedArtifactStackArray = {
-                new AxArtifactKey("testC-top", "0.0.1"),
-                new AxArtifactKey("testC-next", "0.0.1"),
-                new AxArtifactKey("testC-bot", "0.0.1")
-                };
-        // @formatter:on
-
-        final AxContextModel albumsModel = TestContextAlbumFactory.createMultiAlbumsContextModel();
-        contextDistributor.registerModel(albumsModel);
+        final Distributor distributor = configrationProvider.getDistributor(distributorKey);
+        final ContextAlbum contextAlbum = configrationProvider.getContextAlbum(distributor);
+        assert (contextAlbum != null);
 
-        final ContextAlbum lTypeAlbum =
-                contextDistributor.createContextAlbum(new AxArtifactKey("LTypeContextAlbum", "0.0.1"));
-        assert (lTypeAlbum != null);
-        lTypeAlbum.setUserArtifactStack(usedArtifactStackArray);
+        final List<Future<?>> tasks = new ArrayList<>(configrationProvider.getThreadCount());
 
-        final List<Future<?>> tasks = new ArrayList<>(threadCount);
-
-        for (int t = 0; t < threadCount; t++) {
-            tasks.add(executorService.submit(new ConcurrentContextThread(jvmNo, t, threadLoops)));
+        for (int t = 0; t < configrationProvider.getThreadCount(); t++) {
+            tasks.add(executorService.submit(new ConcurrentContextThread(jvmNo, t, configrationProvider)));
         }
 
         try {
@@ -123,8 +96,8 @@ public final class ConcurrentContextJVM {
             Thread.currentThread().interrupt();
         }
 
-        LOGGER.debug("threads finished, end value is {}", lTypeAlbum.get("testValue"));
-        contextDistributor.clear();
+        LOGGER.debug("threads finished, end value is {}", contextAlbum.get(Constants.TEST_VALUE));
+        distributor.clear();
         LOGGER.info("Shutting down now ... ");
         executorService.shutdownNow();
     }
@@ -145,49 +118,25 @@ public final class ConcurrentContextJVM {
         // CHECKSTYLE:OFF: checkstyle:magicNumber
 
         // An even number of arguments greater than 3
-        if (args.length < 7) {
+        if (args.length < 9) {
             LOGGER.error("invalid arguments: " + Arrays.toString(args));
             LOGGER.error(
-                    "usage: TestConcurrentContextJVM testType jvmNo threadCount threadLoops [parameterKey parameterJson].... ");
-            return;
-        }
-
-        int jvmNo = -1;
-        int threadCount = -1;
-        int threadLoops = -1;
-        String hazelCastfileLocation = null;
-
-        try {
-            jvmNo = Integer.parseInt(args[1]);
-        } catch (final Exception e) {
-            LOGGER.error("invalid argument jvmNo", e);
-            return;
-        }
-
-        try {
-            threadCount = Integer.parseInt(args[2]);
-        } catch (final Exception e) {
-            LOGGER.error("invalid argument threadCount", e);
+                    "usage: TestConcurrentContextJVM testType jvmNo threadCount threadLoops albumSize lockType [parameterKey parameterJson].... ");
             return;
         }
 
-        try {
-            threadLoops = Integer.parseInt(args[3]);
-        } catch (final Exception e) {
-            LOGGER.error("invalid argument threadLoops", e);
-            return;
-        }
 
-        try {
-            hazelCastfileLocation = args[4].trim();
-        } catch (final Exception e) {
-            LOGGER.error("invalid argument hazelcast file location", e);
-            return;
-        }
+        final String testName = getStringValue("testType", args, 0);
+        final int jvmNo = getIntValue("jvmNo", args, 1);
+        final int threadCount = getIntValue("threadCount", args, 2);
+        final int threadLoops = getIntValue("threadLoops", args, 3);
+        final int albumSize = getIntValue("albumSize", args, 4);
+        final int lockType = getIntValue("lockType", args, 5);
+        final String hazelCastfileLocation = getStringValue("hazelcast file location", args, 6);;
 
         System.setProperty("hazelcast.config", hazelCastfileLocation);
 
-        for (int p = 5; p < args.length - 1; p += 2) {
+        for (int p = 7; p < args.length - 1; p += 2) {
             @SuppressWarnings("rawtypes")
             final Class parametersClass = Class.forName(args[p]);
             final AbstractParameters parameters =
@@ -201,8 +150,9 @@ public final class ConcurrentContextJVM {
         }
 
         try {
-            final ConcurrentContextJVM concurrentContextJVM =
-                    new ConcurrentContextJVM(args[0], jvmNo, threadCount, threadLoops);
+            final ConfigrationProvider configrationProvider =
+                    new ConfigrationProviderImpl(testName, 1, threadCount, threadLoops, albumSize, lockType);
+            final ConcurrentContextJVM concurrentContextJVM = new ConcurrentContextJVM(jvmNo, configrationProvider);
             concurrentContextJVM.execute();
 
         } catch (final Exception e) {
@@ -211,9 +161,30 @@ public final class ConcurrentContextJVM {
         }
         // CHECKSTYLE:ON: checkstyle:magicNumber
 
+    }
 
+    private static String getStringValue(final String key, final String[] args, final int position) {
+        try {
+            return args[position];
+        } catch (final Exception e) {
+            final String msg = "invalid argument " + key;
+            LOGGER.error(msg, e);
+            throw new ApexRuntimeException(msg, e);
+        }
     }
 
+    private static int getIntValue(final String key, final String[] args, final int position) {
+        final String value = getStringValue(key, args, position);
+        try {
+            return Integer.parseInt(value);
+        } catch (final Exception e) {
+            final String msg = "Expects number found " + value;
+            LOGGER.error(msg, e);
+            throw new ApexRuntimeException(msg, e);
+        }
+    }
+
+
     /**
      * This method setus up any static configuration required by the JVM.
      *
index 995772f..0497548 100644 (file)
@@ -22,14 +22,13 @@ package org.onap.policy.apex.context.test.locking;
 
 import java.io.BufferedReader;
 import java.io.Closeable;
-import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map.Entry;
 
-import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
+import org.onap.policy.apex.context.test.utils.ConfigrationProvider;
 import org.onap.policy.apex.model.basicmodel.service.AbstractParameters;
 import org.onap.policy.apex.model.basicmodel.service.ParameterService;
 import org.slf4j.ext.XLogger;
@@ -46,27 +45,13 @@ public class ConcurrentContextJVMThread implements Runnable, Closeable {
     // Logger for this class
     private static final XLogger LOGGER = XLoggerFactory.getXLogger(ConcurrentContextJVMThread.class);
 
-    private final String testType;
     private final int jvm;
-    private final int threadCount;
-    private final int target;
+    private final ConfigrationProvider configrationProvider;
     private Process process = null;
 
-    /**
-     * The Constructor.
-     *
-     * @param testType the test type
-     * @param jvm the jvm
-     * @param threadCount the thread count
-     * @param target the target
-     * @throws ApexException the apex exception
-     */
-    public ConcurrentContextJVMThread(final String testType, final int jvm, final int threadCount, final int target)
-            throws ApexException {
-        this.testType = testType;
+    public ConcurrentContextJVMThread(final int jvm, final ConfigrationProvider configrationProvider) {
         this.jvm = jvm;
-        this.threadCount = threadCount;
-        this.target = target;
+        this.configrationProvider = configrationProvider;
     }
 
     /*
@@ -84,11 +69,13 @@ public class ConcurrentContextJVMThread implements Runnable, Closeable {
         commandList.add("-cp");
         commandList.add(System.getProperty("java.class.path"));
         commandList.add(ConcurrentContextJVM.class.getCanonicalName());
-        commandList.add(testType);
+        commandList.add(configrationProvider.getTestName());
         commandList.add(new Integer(jvm).toString());
-        commandList.add(new Integer(threadCount).toString());
-        commandList.add(new Integer(target).toString());
-        commandList.add(System.getProperty("hazelcast.config"));
+        commandList.add(new Integer(configrationProvider.getThreadCount()).toString());
+        commandList.add(new Integer(configrationProvider.getLoopSize()).toString());
+        commandList.add(new Integer(configrationProvider.getAlbumSize()).toString());
+        commandList.add(new Integer(configrationProvider.getLockType().getValue()).toString());
+        commandList.add(System.getProperty("hazelcast.config", ""));
 
         for (final Entry<Class<?>, AbstractParameters> parameterServiceEntry : ParameterService.getAll()) {
             commandList.add(parameterServiceEntry.getKey().getCanonicalName());
@@ -101,7 +88,6 @@ public class ConcurrentContextJVMThread implements Runnable, Closeable {
         final ProcessBuilder processBuilder = new ProcessBuilder(commandList);
         processBuilder.redirectErrorStream(true);
 
-
         try {
             process = processBuilder.start();
 
@@ -122,7 +108,7 @@ public class ConcurrentContextJVMThread implements Runnable, Closeable {
                 LOGGER.warn("Thread was interrupted");
                 Thread.currentThread().interrupt();
             }
-        } catch (final IOException ioException) {
+        } catch (final Exception ioException) {
             LOGGER.error("Error occured while writing JVM Output for command ", ioException);
         }
     }
index 75a7045..726880f 100644 (file)
@@ -25,13 +25,10 @@ import java.io.Closeable;
 import org.onap.policy.apex.context.ContextAlbum;
 import org.onap.policy.apex.context.ContextException;
 import org.onap.policy.apex.context.Distributor;
-import org.onap.policy.apex.context.impl.distribution.DistributorFactory;
 import org.onap.policy.apex.context.parameters.ContextParameters;
-import org.onap.policy.apex.context.test.concepts.TestContextLongItem;
-import org.onap.policy.apex.context.test.factory.TestContextAlbumFactory;
-import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
+import org.onap.policy.apex.context.test.lock.modifier.AlbumModifier;
+import org.onap.policy.apex.context.test.utils.ConfigrationProvider;
 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
-import org.onap.policy.apex.model.contextmodel.concepts.AxContextModel;
 import org.slf4j.ext.XLogger;
 import org.slf4j.ext.XLoggerFactory;
 
@@ -41,33 +38,25 @@ import org.slf4j.ext.XLoggerFactory;
  * @author Liam Fallon (liam.fallon@ericsson.com)
  */
 public class ConcurrentContextThread implements Runnable, Closeable {
-    private static final String VALUE = "testValue";
     // Logger for this class
     private static final XLogger LOGGER = XLoggerFactory.getXLogger(ConcurrentContextThread.class);
-    private final Distributor distributor;
     private final int jvm;
     private final int instance;
-    private final int threadLoops;
+    private final ConfigrationProvider configrationProvider;
 
     /**
      * The Constructor.
      *
      * @param jvm the jvm
      * @param instance the instance
-     * @param threadLoops the thread loops
-     * @throws ApexException the apex exception
+     * @param configrationProvider the configuration provider
      */
-    public ConcurrentContextThread(final int jvm, final int instance, final int threadLoops) throws ApexException {
+    public ConcurrentContextThread(final int jvm, final int instance, final ConfigrationProvider configrationProvider) {
         this.jvm = jvm;
         this.instance = instance;
-        this.threadLoops = threadLoops;
-
-        final AxArtifactKey distributorKey = new AxArtifactKey("ApexDistributor_" + jvm + "_" + instance, "0.0.1");
+        this.configrationProvider = configrationProvider;
 
         new ContextParameters();
-        distributor = new DistributorFactory().getDistributor(distributorKey);
-        final AxContextModel albumsModel = TestContextAlbumFactory.createMultiAlbumsContextModel();
-        distributor.registerModel(albumsModel);
     }
 
     /*
@@ -79,72 +68,30 @@ public class ConcurrentContextThread implements Runnable, Closeable {
     public void run() {
         LOGGER.info("running TestConcurrentContextThread_" + jvm + "_" + instance + " . . .");
 
-        ContextAlbum lTypeAlbum = null;
-
-        try {
-            lTypeAlbum = distributor.createContextAlbum(new AxArtifactKey("LTypeContextAlbum", "0.0.1"));
-        } catch (final Exception e) {
-            LOGGER.error("could not get the test context album", e);
-            LOGGER.error("failed TestConcurrentContextThread_" + jvm + "_" + instance);
-            return;
-        }
-
-        if (lTypeAlbum == null) {
-            LOGGER.error("could not find the test context album");
-            LOGGER.error("failed TestConcurrentContextThread_" + jvm + "_" + instance);
-            return;
-        }
-
-        // @formatter:off
-        final AxArtifactKey[] usedArtifactStackArray = {new AxArtifactKey("testC-top", "0.0.1"),
-                new AxArtifactKey("testC-next", "0.0.1"), new AxArtifactKey("testC-bot", "0.0.1")};
-        // @formatter:on
 
-        lTypeAlbum.setUserArtifactStack(usedArtifactStackArray);
+        final AxArtifactKey distributorKey = new AxArtifactKey("ApexDistributor_" + jvm + "_" + instance, "0.0.1");
+        final Distributor distributor = configrationProvider.getDistributor(distributorKey);
 
         try {
-            updateAlbum(lTypeAlbum);
-        } catch (final Exception exception) {
-            LOGGER.error("could not set the value in the test context album", exception);
-            LOGGER.error("failed TestConcurrentContextThread_" + jvm + "_" + instance);
-            return;
-        }
+            final long startTime = System.currentTimeMillis();
+            final ContextAlbum contextAlbum = configrationProvider.getContextAlbum(distributor);
+
+            final AlbumModifier albumModifier = configrationProvider.getAlbumModifier();
+            albumModifier.modifyAlbum(contextAlbum, configrationProvider.getLoopSize(),
+                    configrationProvider.getAlbumSize());
+            LOGGER.info("Took {} ms to modify album", (System.currentTimeMillis() - startTime));
 
-        try {
-            lTypeAlbum.lockForWriting(VALUE);
-            final TestContextLongItem item = (TestContextLongItem) lTypeAlbum.get(VALUE);
-            final long value = item.getLongValue();
-            LOGGER.info("completed TestConcurrentContextThread_" + jvm + "_" + instance + ", value=" + value);
         } catch (final Exception e) {
-            LOGGER.error("could not read the value in the test context album", e);
-            LOGGER.error("failed TestConcurrentContextThread_" + jvm + "_" + instance);
+            LOGGER.error("Unexpected error occured while processing", e);
         } finally {
             try {
-                lTypeAlbum.unlockForWriting(VALUE);
                 distributor.shutdown();
             } catch (final ContextException e) {
-                LOGGER.error("could not unlock test context album item", e);
-                LOGGER.error("failed TestConcurrentContextThread_" + jvm + "_" + instance);
+                LOGGER.error("Unable to shutdown distributor", e);
             }
         }
-    }
+        LOGGER.info("finished TestConcurrentContextThread_" + jvm + "_" + instance + " . . .");
 
-    private void updateAlbum(final ContextAlbum lTypeAlbum) throws Exception {
-        for (int i = 0; i < threadLoops; i++) {
-            try {
-                lTypeAlbum.lockForWriting(VALUE);
-                TestContextLongItem item = (TestContextLongItem) lTypeAlbum.get(VALUE);
-                if (item != null) {
-                    long value = item.getLongValue();
-                    item.setLongValue(++value);
-                } else {
-                    item = new TestContextLongItem(0L);
-                }
-                lTypeAlbum.put(VALUE, item);
-            } finally {
-                lTypeAlbum.unlockForWriting(VALUE);
-            }
-        }
     }
 
     @Override
diff --git a/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/utils/ConfigrationProvider.java b/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/utils/ConfigrationProvider.java
new file mode 100644 (file)
index 0000000..d17f322
--- /dev/null
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. 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.
+ * 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.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.apex.context.test.utils;
+
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+
+import org.onap.policy.apex.context.ContextAlbum;
+import org.onap.policy.apex.context.ContextException;
+import org.onap.policy.apex.context.Distributor;
+import org.onap.policy.apex.context.test.lock.modifier.AlbumModifier;
+import org.onap.policy.apex.context.test.lock.modifier.LockType;
+import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
+
+public interface ConfigrationProvider {
+
+    String getTestName();
+
+    int getLoopSize();
+
+    int getThreadCount();
+
+    int getJvmCount();
+
+    int getAlbumSize();
+
+    ExecutorService getExecutorService();
+
+    ExecutorService getExecutorService(final String threadFactoryName, final int threadPoolSize);
+
+    Distributor getDistributor(final AxArtifactKey key);
+
+    Distributor getDistributor();
+
+    ContextAlbum getContextAlbum(final Distributor distributor);
+
+    ContextAlbum getContextAlbum(final Distributor distributor, AxArtifactKey axContextAlbumKey,
+            AxArtifactKey[] artifactKeys) throws ContextException;
+
+    Map<String, Object> getContextAlbumInitValues();
+
+    AlbumModifier getAlbumModifier();
+
+    LockType getLockType();
+
+}
diff --git a/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/utils/ConfigrationProviderImpl.java b/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/utils/ConfigrationProviderImpl.java
new file mode 100644 (file)
index 0000000..5042909
--- /dev/null
@@ -0,0 +1,166 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. 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.
+ * 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.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.apex.context.test.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import org.onap.policy.apex.context.ContextAlbum;
+import org.onap.policy.apex.context.ContextException;
+import org.onap.policy.apex.context.ContextRuntimeException;
+import org.onap.policy.apex.context.Distributor;
+import org.onap.policy.apex.context.impl.distribution.DistributorFactory;
+import org.onap.policy.apex.context.test.concepts.TestContextLongItem;
+import org.onap.policy.apex.context.test.factory.TestContextAlbumFactory;
+import org.onap.policy.apex.context.test.lock.modifier.AlbumModifier;
+import org.onap.policy.apex.context.test.lock.modifier.LockType;
+import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
+import org.onap.policy.apex.model.contextmodel.concepts.AxContextModel;
+import org.onap.policy.apex.model.utilities.Assertions;
+
+public class ConfigrationProviderImpl implements ConfigrationProvider {
+
+    private final String testType;
+    private final int jvmCount;
+    private final int threadCount;
+    private final int loopSize;
+    private final int albumSize;
+    private final LockType lockType;
+
+    public ConfigrationProviderImpl(final String testType, final int jvmCount, final int threadCount,
+            final int loopSize, final int albumSize, final int lockType) {
+        this.testType = testType;
+        this.jvmCount = jvmCount;
+        this.threadCount = threadCount;
+        this.loopSize = loopSize;
+        this.albumSize = albumSize;
+        this.lockType = LockType.getLockType(lockType);
+    }
+
+    @Override
+    public String getTestName() {
+        return testType;
+    }
+
+    @Override
+    public int getLoopSize() {
+        return loopSize;
+    }
+
+    @Override
+    public int getThreadCount() {
+        return threadCount;
+    }
+
+    @Override
+    public int getJvmCount() {
+        return jvmCount;
+    }
+
+    @Override
+    public int getAlbumSize() {
+        return albumSize;
+    }
+
+    @Override
+    public ExecutorService getExecutorService() {
+        final String name = getThreadFactoryName(jvmCount, testType);
+        final IntegrationThreadFactory threadFactory = new IntegrationThreadFactory(name);
+        final ExecutorService executorService = Executors.newFixedThreadPool(threadCount, threadFactory);
+        return executorService;
+    }
+
+    @Override
+    public ExecutorService getExecutorService(final String threadFactoryName, final int threadPoolSize) {
+        final IntegrationThreadFactory threadFactory = new IntegrationThreadFactory(threadFactoryName);
+        final ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize, threadFactory);
+        return executorService;
+    }
+
+    @Override
+    public Distributor getDistributor(final AxArtifactKey key) {
+        try {
+            return new DistributorFactory().getDistributor(key);
+        } catch (ContextException e) {
+            throw new ContextRuntimeException("Unable to create Distributor", e);
+        }
+    }
+
+    @Override
+    public Distributor getDistributor() {
+        final AxArtifactKey distributorKey = new AxArtifactKey("ApexDistributor", "0.0.1");
+        return getDistributor(distributorKey);
+    }
+
+    @Override
+    public ContextAlbum getContextAlbum(final Distributor distributor) {
+        return getContextAlbum(distributor, Constants.L_TYPE_CONTEXT_ALBUM, Constants.getAxArtifactKeyArray());
+    }
+
+    @Override
+    public ContextAlbum getContextAlbum(final Distributor distributor, final AxArtifactKey axContextAlbumKey,
+            final AxArtifactKey[] artifactKeys) {
+        final AxContextModel axContextModel = TestContextAlbumFactory.createMultiAlbumsContextModel();
+        try {
+            distributor.registerModel(axContextModel);
+            final ContextAlbum contextAlbum = distributor.createContextAlbum(axContextAlbumKey);
+            Assertions.argumentNotNull(contextAlbum, "ContextAlbum should not be null");
+            contextAlbum.setUserArtifactStack(artifactKeys);
+            return contextAlbum;
+        } catch (ContextException e) {
+            throw new ContextRuntimeException("Unable to create ContextAlbum", e);
+        }
+    }
+
+    @Override
+    public Map<String, Object> getContextAlbumInitValues() {
+        final Map<String, Object> values = new HashMap<>();
+        for (int i = 0; i < albumSize; i++) {
+            values.put(Integer.toString(i), new TestContextLongItem(0l));
+        }
+        return values;
+    }
+
+    @Override
+    public AlbumModifier getAlbumModifier() {
+        return lockType.getAlbumModifier();
+    }
+
+    @Override
+    public LockType getLockType() {
+        return lockType;
+    }
+
+
+    private String getThreadFactoryName(final int jvmCount, final String testType) {
+        return jvmCount == 1 ? testType + ":TestConcurrentContextThread_0_"
+                : testType + ":TestConcurrentContextJVMThread_";
+    }
+
+    @Override
+    public String toString() {
+        return "ConfigrationProviderImpl [testType=" + testType + ", jvmCount=" + jvmCount + ", threadCount="
+                + threadCount + ", loopSize=" + loopSize + ", albumSize=" + albumSize + ", lockType=" + lockType + "]";
+    }
+
+
+}
index 7968713..933c68b 100644 (file)
@@ -52,14 +52,17 @@ public class Constants {
     public static final String TEST_POLICY_CONTEXT_ITEM = TestPolicyContextItem.class.getName();
     public static final TimeZone TIME_ZONE = TimeZone.getTimeZone("Europe/Dublin");
 
+    public static final AxArtifactKey L_TYPE_CONTEXT_ALBUM = new AxArtifactKey("LTypeContextAlbum", VERSION);
+    public static final String TEST_VALUE = "testValue";
+
     private static final AxArtifactKey KEY = new AxArtifactKey("testC-top", VERSION);
     private static final AxArtifactKey KEY3 = new AxArtifactKey("testC-bot", VERSION);
     private static final AxArtifactKey KEY2 = new AxArtifactKey("testC-next", VERSION);
 
-    public static final AxArtifactKey[] USED_ARTIFACT_STACK_ARRAY = getAxArtifactKeyArray();
+    private static final AxArtifactKey[] USED_ARTIFACT_STACK_ARRAY = new AxArtifactKey[] {KEY, KEY2, KEY3};;
 
-    private static AxArtifactKey[] getAxArtifactKeyArray() {
-        return new AxArtifactKey[] {KEY, KEY2, KEY3};
+    public static final AxArtifactKey[] getAxArtifactKeyArray() {
+        return USED_ARTIFACT_STACK_ARRAY;
     }
 
     private Constants() {}
diff --git a/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/utils/NetworkUtils.java b/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/utils/NetworkUtils.java
new file mode 100644 (file)
index 0000000..01331f2
--- /dev/null
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. 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.
+ * 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.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.apex.context.test.utils;
+
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.TreeSet;
+
+public class NetworkUtils {
+
+    private NetworkUtils() {}
+
+    /**
+     * The JGroups IP address must be set to a real (not loopback) IP address for Infinispan to
+     * work. In order to ensure that all the JVMs in a test pick up the same IP address, this
+     * function sets the address to be the first non-loopback IPv4 address on a host
+     * 
+     * @return Set of IPv4 addresses
+     * @throws SocketException
+     */
+    public static TreeSet<String> getIPv4NonLoopAddresses() throws SocketException {
+        final TreeSet<String> ipAddressSet = new TreeSet<String>();
+
+        final Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
+        for (final NetworkInterface netint : Collections.list(nets)) {
+            final Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
+            for (final InetAddress inetAddress : Collections.list(inetAddresses)) {
+                // Look for real IPv4 internet addresses
+                if (!inetAddress.isLoopbackAddress() && inetAddress.getAddress().length == 4) {
+                    ipAddressSet.add(inetAddress.getHostAddress());
+                }
+            }
+        }
+        return ipAddressSet;
+    }
+
+
+}
diff --git a/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/utils/ZooKeeperServerServiceProvider.java b/context/context-test-utils/src/main/java/org/onap/policy/apex/context/test/utils/ZooKeeperServerServiceProvider.java
new file mode 100644 (file)
index 0000000..67bb887
--- /dev/null
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. 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.
+ * 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.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.apex.context.test.utils;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+import org.apache.zookeeper.server.NIOServerCnxnFactory;
+import org.apache.zookeeper.server.ZooKeeperServer;
+import org.slf4j.ext.XLogger;
+import org.slf4j.ext.XLoggerFactory;
+
+public class ZooKeeperServerServiceProvider {
+    private static final XLogger LOGGER = XLoggerFactory.getXLogger(ZooKeeperServerServiceProvider.class);
+
+    private NIOServerCnxnFactory zookeeperFactory;
+    private File zookeeperDirectory;
+    private InetSocketAddress addr;
+
+    public ZooKeeperServerServiceProvider(final File zookeeperDirectory, final InetSocketAddress addr) {
+        this.zookeeperDirectory = zookeeperDirectory;
+        this.addr = addr;
+    }
+
+    public ZooKeeperServerServiceProvider(final File zookeeperDirectory, final String addr, final int port) {
+        this.zookeeperDirectory = zookeeperDirectory;
+        this.addr = new InetSocketAddress(addr, port);
+    }
+
+    public void startZookeeperServer() throws IOException, InterruptedException {
+        LOGGER.info("Starting up ZooKeeperServer using address: {} and port: {}", addr.getAddress(), addr.getPort());
+        final ZooKeeperServer server = new ZooKeeperServer(zookeeperDirectory, zookeeperDirectory, 5000);
+        zookeeperFactory = new NIOServerCnxnFactory();
+        zookeeperFactory.configure(addr, 100);
+        zookeeperFactory.startup(server);
+    }
+
+    public void stopZookeeperServer() {
+        LOGGER.info("Stopping ZooKeeperServer for address: {} and port: {}", addr.getAddress(), addr.getPort());
+        if (zookeeperFactory != null) {
+            zookeeperFactory.shutdown();
+        }
+    }
+
+}
index 7788fb4..c29353c 100644 (file)
@@ -22,15 +22,21 @@ package org.onap.policy.apex.context.test.locking;
 
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.onap.policy.apex.context.test.lock.modifier.LockType.WRITE_LOCK_SINGLE_VALUE_UPDATE;
+import static org.onap.policy.apex.context.test.utils.Constants.TEST_VALUE;
 
-import java.io.IOException;
+import java.util.Map;
 
 import org.junit.Test;
 import org.onap.policy.apex.context.impl.distribution.jvmlocal.JVMLocalDistributor;
 import org.onap.policy.apex.context.impl.locking.jvmlocal.JVMLocalLockManager;
 import org.onap.policy.apex.context.parameters.ContextParameters;
-import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
-import org.onap.policy.apex.model.basicmodel.handling.ApexModelException;
+import org.onap.policy.apex.context.test.concepts.TestContextLongItem;
+import org.onap.policy.apex.context.test.utils.ConfigrationProvider;
+import org.onap.policy.apex.context.test.utils.ConfigrationProviderImpl;
+import org.onap.policy.apex.context.test.utils.Constants;
 import org.slf4j.ext.XLogger;
 import org.slf4j.ext.XLoggerFactory;
 
@@ -40,10 +46,12 @@ import org.slf4j.ext.XLoggerFactory;
  * @author Liam Fallon (liam.fallon@ericsson.com)
  */
 public class TestConcurrentContext {
+
     // Logger for this class
     private static final XLogger logger = XLoggerFactory.getXLogger(TestConcurrentContext.class);
 
     // Test parameters
+    private static final int ALBUM_SIZE = 16;
     private static final int TEST_JVM_COUNT_SINGLE_JVM = 1;
     private static final int TEST_JVM_COUNT_MULTI_JVM = 3;
     private static final int TEST_THREAD_COUNT_SINGLE_JVM = 64;
@@ -51,46 +59,81 @@ public class TestConcurrentContext {
     private static final int TEST_THREAD_LOOPS = 100;
 
     @Test
-    public void testConcurrentContextJVMLocalVarSet() throws ApexModelException, IOException, ApexException {
+    public void testConcurrentContextJVMLocalVarSet() throws Exception {
         logger.debug("Running testConcurrentContextJVMLocalVarSet test . . .");
 
         final ContextParameters contextParameters = new ContextParameters();
         contextParameters.getLockManagerParameters().setPluginClass(JVMLocalLockManager.class.getCanonicalName());
-        final long result = new ConcurrentContext().testConcurrentContext("JVMLocalVarSet", TEST_JVM_COUNT_SINGLE_JVM,
-                TEST_THREAD_COUNT_SINGLE_JVM, TEST_THREAD_LOOPS);
 
-        assertEquals(TEST_JVM_COUNT_SINGLE_JVM * TEST_THREAD_COUNT_SINGLE_JVM * TEST_THREAD_LOOPS, result);
+        final ConfigrationProvider configrationProvider = getConfigrationProvider("JVMLocalVarSet",
+                TEST_JVM_COUNT_SINGLE_JVM, TEST_THREAD_COUNT_SINGLE_JVM, TEST_THREAD_LOOPS);
+
+        final ConcurrentContext concurrentContext = new ConcurrentContext(configrationProvider);
+        final Map<String, TestContextLongItem> result = concurrentContext.testConcurrentContext();
+
+        assertFalse(result.isEmpty());
+        final int expected = TEST_JVM_COUNT_SINGLE_JVM * TEST_THREAD_COUNT_SINGLE_JVM * TEST_THREAD_LOOPS;
+        final TestContextLongItem actual = result.get(TEST_VALUE);
+        assertNotNull(actual);
+        assertEquals(expected, actual.getLongValue());
+
 
         logger.debug("Ran testConcurrentContextJVMLocalVarSet test");
     }
 
     @Test
-    public void testConcurrentContextJVMLocalNoVarSet() throws ApexModelException, IOException, ApexException {
+    public void testConcurrentContextJVMLocalNoVarSet() throws Exception {
         logger.debug("Running testConcurrentContextJVMLocalNoVarSet test . . .");
 
         new ContextParameters();
-        final long result = new ConcurrentContext().testConcurrentContext("JVMLocalNoVarSet", TEST_JVM_COUNT_SINGLE_JVM,
-                TEST_THREAD_COUNT_SINGLE_JVM, TEST_THREAD_LOOPS);
+        final ConfigrationProvider configrationProvider = getConfigrationProvider("JVMLocalNoVarSet",
+                TEST_JVM_COUNT_SINGLE_JVM, TEST_THREAD_COUNT_SINGLE_JVM, TEST_THREAD_LOOPS);
 
-        assertEquals(TEST_JVM_COUNT_SINGLE_JVM * TEST_THREAD_COUNT_SINGLE_JVM * TEST_THREAD_LOOPS, result);
+        final ConcurrentContext concurrentContext = new ConcurrentContext(configrationProvider);
+        final Map<String, TestContextLongItem> result = concurrentContext.testConcurrentContext();
+
+        assertFalse(result.isEmpty());
+        final int expected = TEST_JVM_COUNT_SINGLE_JVM * TEST_THREAD_COUNT_SINGLE_JVM * TEST_THREAD_LOOPS;
+        final TestContextLongItem actual = result.get(TEST_VALUE);
+        assertNotNull(actual);
+        assertEquals(expected, actual.getLongValue());
 
         logger.debug("Ran testConcurrentContextJVMLocalNoVarSet test");
     }
 
     @Test
-    public void testConcurrentContextMultiJVMNoLock() throws ApexModelException, IOException, ApexException {
+    public void testConcurrentContextMultiJVMNoLock() throws Exception {
         logger.debug("Running testConcurrentContextMultiJVMNoLock test . . .");
 
         final ContextParameters contextParameters = new ContextParameters();
         contextParameters.getDistributorParameters().setPluginClass(JVMLocalDistributor.class.getCanonicalName());
         contextParameters.getLockManagerParameters().setPluginClass(JVMLocalLockManager.class.getCanonicalName());
 
-        final long result = new ConcurrentContext().testConcurrentContext("testConcurrentContextMultiJVMNoLock",
+        final ConfigrationProvider configrationProvider = getConfigrationProvider("testConcurrentContextMultiJVMNoLock",
                 TEST_JVM_COUNT_MULTI_JVM, TEST_THREAD_COUNT_MULTI_JVM, TEST_THREAD_LOOPS);
 
+        final ConcurrentContext concurrentContext = new ConcurrentContext(configrationProvider);
+        final Map<String, TestContextLongItem> result = concurrentContext.testConcurrentContext();
+
         // No concurrent map so result will be zero
-        assertEquals(0, result);
+        assertFalse(result.isEmpty());
+        final TestContextLongItem actual = result.get(TEST_VALUE);
+        assertNotNull(actual);
+        assertEquals(0, actual.getLongValue());
 
         logger.debug("Ran testConcurrentContextMultiJVMNoLock test");
     }
+
+    private ConfigrationProvider getConfigrationProvider(final String testType, final int jvmCount,
+            final int threadCount, final int threadLoops) {
+        return new ConfigrationProviderImpl(testType, jvmCount, threadCount, threadLoops, ALBUM_SIZE,
+                WRITE_LOCK_SINGLE_VALUE_UPDATE.getValue()) {
+            @Override
+            public Map<String, Object> getContextAlbumInitValues() {
+                final Map<String, Object> initValues = super.getContextAlbumInitValues();
+                initValues.put(Constants.TEST_VALUE, new TestContextLongItem(0l));
+                return initValues;
+            }
+        };
+    }
 }
index e18c327..21c5ee9 100644 (file)
@@ -52,18 +52,25 @@ public class EndToEndStringMessagingTest {
         assertNotNull(server);
         server.start(new WSStringServerMessageListener());
 
-        client = new WSStringMessageClient("localhost", 44441);
-        assertNotNull(client);
-        client.start(new WSStringClientMessageListener());
+        try {
+            client = new WSStringMessageClient("localhost", 44441);
+            assertNotNull(client);
+            client.start(new WSStringClientMessageListener());
 
-        client.sendString("Hello, client here");
+            client.sendString("Hello, client here");
 
-        while (!finished) {
-            ThreadUtilities.sleep(50);
-        }
-        client.stop();
+            while (!finished) {
+                ThreadUtilities.sleep(50);
+            }
+        } finally {
+            if (client != null) {
+                client.stop();
+            }
+            if (server != null) {
+                server.stop();
+            }
 
-        server.stop();
+        }
         logger.debug("end to end messaging test finished");
     }
 
index 6454a8c..95e2c6b 100644 (file)
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>org.apache.curator</groupId>
-            <artifactId>curator-test</artifactId>
-            <version>4.0.0</version>
-            <scope>test</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>log4j</groupId>
-                    <artifactId>log4j</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
     </dependencies>
 
-</project>
+</project>
\ No newline at end of file
index e2c2de9..5c13292 100644 (file)
 package org.onap.policy.apex.plugins.context.test.locking;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.onap.policy.apex.context.parameters.DistributorParameters.DEFAULT_DISTRIBUTOR_PLUGIN_CLASS;
+import static org.onap.policy.apex.context.test.utils.Constants.TEST_VALUE;
 
 import java.io.File;
 import java.io.IOException;
-import java.net.InetAddress;
 import java.net.InetSocketAddress;
-import java.net.NetworkInterface;
-import java.util.Collections;
-import java.util.Enumeration;
+import java.util.Map;
 import java.util.TreeSet;
 
-import org.apache.zookeeper.server.NIOServerCnxnFactory;
-import org.apache.zookeeper.server.ZooKeeperServer;
-import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
@@ -44,7 +41,15 @@ import org.onap.policy.apex.context.impl.locking.jvmlocal.JVMLocalLockManager;
 import org.onap.policy.apex.context.parameters.ContextParameters;
 import org.onap.policy.apex.context.parameters.DistributorParameters;
 import org.onap.policy.apex.context.parameters.LockManagerParameters;
+import org.onap.policy.apex.context.test.concepts.TestContextLongItem;
+import org.onap.policy.apex.context.test.lock.modifier.LockType;
 import org.onap.policy.apex.context.test.locking.ConcurrentContext;
+import org.onap.policy.apex.context.test.utils.ConfigrationProvider;
+import org.onap.policy.apex.context.test.utils.ConfigrationProviderImpl;
+import org.onap.policy.apex.context.test.utils.Constants;
+import org.onap.policy.apex.context.test.utils.NetworkUtils;
+import org.onap.policy.apex.context.test.utils.ZooKeeperServerServiceProvider;
+import org.onap.policy.apex.core.infrastructure.messaging.util.MessagingUtils;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
 import org.onap.policy.apex.model.basicmodel.handling.ApexModelException;
 import org.onap.policy.apex.model.basicmodel.service.ParameterService;
@@ -58,8 +63,6 @@ import org.onap.policy.apex.plugins.context.locking.hazelcast.HazelcastLockManag
 import org.slf4j.ext.XLogger;
 import org.slf4j.ext.XLoggerFactory;
 
-import com.hazelcast.config.Config;
-
 /**
  * The Class TestConcurrentContext tests concurrent use of context.
  *
@@ -67,7 +70,7 @@ import com.hazelcast.config.Config;
  */
 public class TestConcurrentContext {
     private static final String HAZELCAST_CONFIG = "hazelcast.config";
-   
+
     private static final String JAVA_NET_PREFER_IPV4_STACK = "java.net.preferIPv4Stack";
     private static final String HAZELCAST_XML_FILE = "src/test/resources/hazelcast/hazelcast.xml";
 
@@ -83,8 +86,6 @@ public class TestConcurrentContext {
     private static final int TEST_THREAD_COUNT_MULTI_JVM = 20;
     private static final int TEST_THREAD_LOOPS = 100;
 
-    private NIOServerCnxnFactory zookeeperFactory;
-
     // We need to increment the Zookeeper port because sometimes the port is not released at the end
     // of the test for a few seconds.
     private static int nextZookeeperPort = ZOOKEEPER_START_PORT;
@@ -93,157 +94,175 @@ public class TestConcurrentContext {
     @Rule
     public final TemporaryFolder folder = new TemporaryFolder();
 
+    private ZooKeeperServerServiceProvider zooKeeperServerServiceProvider;
+
     @BeforeClass
     public static void configure() throws Exception {
         System.setProperty(JAVA_NET_PREFER_IPV4_STACK, "true");
         final String hazelCastfileLocation = ResourceUtils.getFilePath4Resource(HAZELCAST_XML_FILE);
         System.setProperty(HAZELCAST_CONFIG, hazelCastfileLocation);
 
-        // The JGroups IP address must be set to a real (not loopback) IP address for Infinispan to
-        // work. IN order to ensure that all
-        // the JVMs in a test pick up the same IP address, this function sets the address to be the
-        // first non-loopback IPv4 address
-        // on a host
-        final TreeSet<String> ipAddressSet = new TreeSet<String>();
-
-        final Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
-        for (final NetworkInterface netint : Collections.list(nets)) {
-            final Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
-            for (final InetAddress inetAddress : Collections.list(inetAddresses)) {
-                // Look for real IPv4 internet addresses
-                if (!inetAddress.isLoopbackAddress() && inetAddress.getAddress().length == 4) {
-                    ipAddressSet.add(inetAddress.getHostAddress());
-                }
-            }
-        }
+        final TreeSet<String> ipAddressSet = NetworkUtils.getIPv4NonLoopAddresses();
 
         if (ipAddressSet.size() == 0) {
             throw new Exception("cound not find real IP address for test");
         }
-        System.out.println("For Infinispan, setting jgroups.tcp.address to: " + ipAddressSet.first());
+        logger.info("For Infinispan, setting jgroups.tcp.address to: {}", ipAddressSet.first());
         System.setProperty("jgroups.tcp.address", ipAddressSet.first());
 
-        final Config config = new Config();
-        config.getNetworkConfig().setPublicAddress(ipAddressSet.first());
-        config.getNetworkConfig().getInterfaces().addInterface(ipAddressSet.first());
     }
 
-    @AfterClass
-    public static void teardown() throws IOException {}
-
-    private void startZookeeperServer() throws IOException, InterruptedException {
+    private void startZookeeperServer() throws Exception {
         final File zookeeperDirectory = folder.newFolder("zookeeperDirectory");
 
         zookeeperPort = nextZookeeperPort++;
-
-        final ZooKeeperServer server = new ZooKeeperServer(zookeeperDirectory, zookeeperDirectory, 5000);
-        zookeeperFactory = new NIOServerCnxnFactory();
-        zookeeperFactory.configure(new InetSocketAddress(zookeeperPort), 100);
-
-        zookeeperFactory.startup(server);
+        final InetSocketAddress addr = new InetSocketAddress(MessagingUtils.findPort(zookeeperPort));
+        zooKeeperServerServiceProvider = new ZooKeeperServerServiceProvider(zookeeperDirectory, addr);
+        zooKeeperServerServiceProvider.startZookeeperServer();
     }
 
     private void stopZookeeperServer() {
-        zookeeperFactory.shutdown();
+        if (zooKeeperServerServiceProvider != null) {
+            zooKeeperServerServiceProvider.stopZookeeperServer();
+        }
     }
 
     @Test
-    public void testConcurrentContextJVMLocalVarSet() throws ApexModelException, IOException, ApexException {
+    public void testConcurrentContextJVMLocalVarSet() throws Exception {
         logger.debug("Running testConcurrentContextJVMLocalVarSet test . . .");
 
         final ContextParameters contextParameters = new ContextParameters();
         contextParameters.getLockManagerParameters().setPluginClass(JVMLocalLockManager.class.getCanonicalName());
-        final long result = new ConcurrentContext().testConcurrentContext("JVMLocalVarSet", TEST_JVM_COUNT_SINGLE_JVM,
-                TEST_THREAD_COUNT_SINGLE_JVM, TEST_THREAD_LOOPS);
 
-        assertEquals(TEST_JVM_COUNT_SINGLE_JVM * TEST_THREAD_COUNT_SINGLE_JVM * TEST_THREAD_LOOPS, result);
+        final ConfigrationProvider configrationProvider = getConfigrationProvider("JVMLocalVarSet",
+                TEST_JVM_COUNT_SINGLE_JVM, TEST_THREAD_COUNT_SINGLE_JVM, TEST_THREAD_LOOPS);
+
+        final ConcurrentContext concurrentContext = new ConcurrentContext(configrationProvider);
+        final Map<String, TestContextLongItem> result = concurrentContext.testConcurrentContext();
+
+        assertFalse(result.isEmpty());
+
+        final int expected = TEST_JVM_COUNT_SINGLE_JVM * TEST_THREAD_COUNT_SINGLE_JVM * TEST_THREAD_LOOPS;
+        final TestContextLongItem actual = result.get(TEST_VALUE);
+        assertNotNull(actual);
+        assertEquals(expected, actual.getLongValue());
 
         logger.debug("Ran testConcurrentContextJVMLocalVarSet test");
     }
 
     @Test
-    public void testConcurrentContextJVMLocalNoVarSet() throws ApexModelException, IOException, ApexException {
+    public void testConcurrentContextJVMLocalNoVarSet() throws Exception {
         logger.debug("Running testConcurrentContextJVMLocalNoVarSet test . . .");
 
         new ContextParameters();
-        final long result = new ConcurrentContext().testConcurrentContext("JVMLocalNoVarSet", TEST_JVM_COUNT_SINGLE_JVM,
-                TEST_THREAD_COUNT_SINGLE_JVM, TEST_THREAD_LOOPS);
+        final ConfigrationProvider configrationProvider = getConfigrationProvider("JVMLocalNoVarSet",
+                TEST_JVM_COUNT_SINGLE_JVM, TEST_THREAD_COUNT_SINGLE_JVM, TEST_THREAD_LOOPS);
 
-        assertEquals(TEST_JVM_COUNT_SINGLE_JVM * TEST_THREAD_COUNT_SINGLE_JVM * TEST_THREAD_LOOPS, result);
+        final ConcurrentContext concurrentContext = new ConcurrentContext(configrationProvider);
+        final Map<String, TestContextLongItem> result = concurrentContext.testConcurrentContext();
+
+        final int expected = TEST_JVM_COUNT_SINGLE_JVM * TEST_THREAD_COUNT_SINGLE_JVM * TEST_THREAD_LOOPS;
+        final TestContextLongItem actual = result.get(Constants.TEST_VALUE);
+        assertNotNull(actual);
+        assertEquals(expected, actual.getLongValue());
 
         logger.debug("Ran testConcurrentContextJVMLocalNoVarSet test");
     }
 
     @Test
-    public void testConcurrentContextMultiJVMNoLock() throws ApexModelException, IOException, ApexException {
+    public void testConcurrentContextMultiJVMNoLock() throws Exception {
         logger.debug("Running testConcurrentContextMultiJVMNoLock test . . .");
 
         final ContextParameters contextParameters = new ContextParameters();
         contextParameters.getDistributorParameters().setPluginClass(JVMLocalDistributor.class.getCanonicalName());
         contextParameters.getLockManagerParameters().setPluginClass(JVMLocalLockManager.class.getCanonicalName());
 
-        final long result = new ConcurrentContext().testConcurrentContext("testConcurrentContextMultiJVMNoLock",
+        final ConfigrationProvider configrationProvider = getConfigrationProvider("testConcurrentContextMultiJVMNoLock",
                 TEST_JVM_COUNT_MULTI_JVM, TEST_THREAD_COUNT_MULTI_JVM, TEST_THREAD_LOOPS);
 
+        final ConcurrentContext concurrentContext = new ConcurrentContext(configrationProvider);
+        final Map<String, TestContextLongItem> result = concurrentContext.testConcurrentContext();
+
         // No concurrent map so result will be zero
-        assertEquals(0, result);
+        final TestContextLongItem actual = result.get(TEST_VALUE);
+        assertNotNull(actual);
+        assertEquals(0, actual.getLongValue());
 
         logger.debug("Ran testConcurrentContextMultiJVMNoLock test");
     }
 
     @Test
-    public void testConcurrentContextHazelcastLock() throws ApexModelException, IOException, ApexException {
+    public void testConcurrentContextHazelcastLock() throws Exception {
         logger.debug("Running testConcurrentContextHazelcastLock test . . .");
 
         final ContextParameters contextParameters = new ContextParameters();
         contextParameters.getDistributorParameters().setPluginClass(DEFAULT_DISTRIBUTOR_PLUGIN_CLASS);
         contextParameters.getLockManagerParameters().setPluginClass(HazelcastLockManager.class.getCanonicalName());
-        final long result = new ConcurrentContext().testConcurrentContext("HazelcastLock", TEST_JVM_COUNT_SINGLE_JVM,
-                TEST_THREAD_COUNT_SINGLE_JVM, TEST_THREAD_LOOPS);
 
-        assertEquals(TEST_JVM_COUNT_SINGLE_JVM * TEST_THREAD_COUNT_SINGLE_JVM * TEST_THREAD_LOOPS, result);
+        final ConfigrationProvider configrationProvider = getConfigrationProvider("HazelcastLock",
+                TEST_JVM_COUNT_SINGLE_JVM, TEST_THREAD_COUNT_SINGLE_JVM, TEST_THREAD_LOOPS);
+
+        final ConcurrentContext concurrentContext = new ConcurrentContext(configrationProvider);
+        final Map<String, TestContextLongItem> result = concurrentContext.testConcurrentContext();
+
+        final int expected = TEST_JVM_COUNT_SINGLE_JVM * TEST_THREAD_COUNT_SINGLE_JVM * TEST_THREAD_LOOPS;
+        final TestContextLongItem actual = result.get(TEST_VALUE);
+        assertNotNull(actual);
+        assertEquals(expected, actual.getLongValue());
+
         logger.debug("Ran testConcurrentContextHazelcastLock test");
     }
 
     @Test
-    public void testConcurrentContextCuratorLock()
-            throws ApexModelException, IOException, ApexException, InterruptedException {
+    public void testConcurrentContextCuratorLock() throws Exception {
         logger.debug("Running testConcurrentContextCuratorLock test . . .");
-
-        startZookeeperServer();
-
-        final ContextParameters contextParameters = new ContextParameters();
-        contextParameters.getDistributorParameters()
-                .setPluginClass(DistributorParameters.DEFAULT_DISTRIBUTOR_PLUGIN_CLASS);
-
-        final CuratorLockManagerParameters curatorParameters = new CuratorLockManagerParameters();
-        curatorParameters.setPluginClass(CuratorLockManager.class.getCanonicalName());
-        curatorParameters.setZookeeperAddress(ZOOKEEPER_ADDRESS + ":" + zookeeperPort);
-        contextParameters.setLockManagerParameters(curatorParameters);
-        ParameterService.registerParameters(LockManagerParameters.class, curatorParameters);
-
-        final long result = new ConcurrentContext().testConcurrentContext("CuratorLock", TEST_JVM_COUNT_SINGLE_JVM,
-                TEST_THREAD_COUNT_SINGLE_JVM, TEST_THREAD_LOOPS);
-
-        assertEquals(TEST_JVM_COUNT_SINGLE_JVM * TEST_THREAD_COUNT_SINGLE_JVM * TEST_THREAD_LOOPS, result);
-
-        stopZookeeperServer();
-        logger.debug("Ran testConcurrentContextCuratorLock test");
+        try {
+            startZookeeperServer();
+            final ContextParameters contextParameters = new ContextParameters();
+            final DistributorParameters distributorParameters = contextParameters.getDistributorParameters();
+            distributorParameters.setPluginClass(DEFAULT_DISTRIBUTOR_PLUGIN_CLASS);
+
+            final CuratorLockManagerParameters curatorParameters = new CuratorLockManagerParameters();
+            curatorParameters.setPluginClass(CuratorLockManager.class.getCanonicalName());
+            curatorParameters.setZookeeperAddress(ZOOKEEPER_ADDRESS + ":" + zookeeperPort);
+            contextParameters.setLockManagerParameters(curatorParameters);
+            ParameterService.registerParameters(LockManagerParameters.class, curatorParameters);
+
+            final ConfigrationProvider configrationProvider = getConfigrationProvider("CuratorLock",
+                    TEST_JVM_COUNT_SINGLE_JVM, TEST_THREAD_COUNT_SINGLE_JVM, TEST_THREAD_LOOPS);
+
+            final ConcurrentContext concurrentContext = new ConcurrentContext(configrationProvider);
+            final Map<String, TestContextLongItem> result = concurrentContext.testConcurrentContext();
+
+            final int expected = TEST_JVM_COUNT_SINGLE_JVM * TEST_THREAD_COUNT_SINGLE_JVM * TEST_THREAD_LOOPS;
+            final TestContextLongItem actual = result.get(TEST_VALUE);
+            assertNotNull(actual);
+            assertEquals(expected, actual.getLongValue());
+            logger.debug("Ran testConcurrentContextCuratorLock test");
+        } finally {
+            stopZookeeperServer();
+        }
     }
 
     @Test
-    public void testConcurrentContextHazelcastMultiJVMHazelcastLock()
-            throws ApexModelException, IOException, ApexException {
+    public void testConcurrentContextHazelcastMultiJVMHazelcastLock() throws Exception {
         logger.debug("Running testConcurrentContextHazelcastMultiJVMHazelcastLock test . . .");
 
         final ContextParameters contextParameters = new ContextParameters();
-        contextParameters.getDistributorParameters()
-                .setPluginClass(HazelcastContextDistributor.class.getCanonicalName());
+        final DistributorParameters distributorParameters = contextParameters.getDistributorParameters();
+        distributorParameters.setPluginClass(HazelcastContextDistributor.class.getCanonicalName());
         contextParameters.getLockManagerParameters().setPluginClass(HazelcastLockManager.class.getCanonicalName());
-        final long result = new ConcurrentContext().testConcurrentContext("HazelcastMultiHazelcastlock",
+
+        final ConfigrationProvider configrationProvider = getConfigrationProvider("HazelcastMultiHazelcastlock",
                 TEST_JVM_COUNT_MULTI_JVM, TEST_THREAD_COUNT_MULTI_JVM, TEST_THREAD_LOOPS);
 
-        assertEquals(TEST_JVM_COUNT_MULTI_JVM * TEST_THREAD_COUNT_MULTI_JVM * TEST_THREAD_LOOPS, result);
+        final ConcurrentContext concurrentContext = new ConcurrentContext(configrationProvider);
+        final Map<String, TestContextLongItem> result = concurrentContext.testConcurrentContext();
+
+        final int expected = TEST_JVM_COUNT_MULTI_JVM * TEST_THREAD_COUNT_MULTI_JVM * TEST_THREAD_LOOPS;
+        final TestContextLongItem actual = result.get(TEST_VALUE);
+        assertNotNull(actual);
+        assertEquals(expected, actual.getLongValue());
         logger.debug("Ran testConcurrentContextHazelcastMultiJVMHazelcastLock test");
     }
 
@@ -259,65 +278,98 @@ public class TestConcurrentContext {
         contextParameters.setDistributorParameters(infinispanParameters);
         contextParameters.getLockManagerParameters().setPluginClass(HazelcastLockManager.class.getCanonicalName());
 
-        final long result = new ConcurrentContext().testConcurrentContext("InfinispanMultiHazelcastlock",
+        final ConfigrationProvider configrationProvider = getConfigrationProvider("InfinispanMultiHazelcastlock",
                 TEST_JVM_COUNT_MULTI_JVM, TEST_THREAD_COUNT_MULTI_JVM, TEST_THREAD_LOOPS);
 
-        assertEquals(TEST_JVM_COUNT_MULTI_JVM * TEST_THREAD_COUNT_MULTI_JVM * TEST_THREAD_LOOPS, result);
+        final ConcurrentContext concurrentContext = new ConcurrentContext(configrationProvider);
+        final Map<String, TestContextLongItem> result = concurrentContext.testConcurrentContext();
+
+        final int expected = TEST_JVM_COUNT_MULTI_JVM * TEST_THREAD_COUNT_MULTI_JVM * TEST_THREAD_LOOPS;
+        final TestContextLongItem actual = result.get(TEST_VALUE);
+        assertNotNull(actual);
+        assertEquals(expected, actual.getLongValue());
         logger.debug("Ran testConcurrentContextInfinispanMultiJVMHazelcastlock test");
     }
 
     @Test
-    public void testConcurrentContextInfinispanMultiJVMCuratorLock()
-            throws ApexModelException, IOException, ApexException, InterruptedException {
+    public void testConcurrentContextInfinispanMultiJVMCuratorLock() throws Exception {
         logger.debug("Running testConcurrentContextInfinispanMultiJVMCuratorLock test . . .");
 
-        startZookeeperServer();
-
-        final ContextParameters contextParameters = new ContextParameters();
-        final InfinispanDistributorParameters infinispanParameters = new InfinispanDistributorParameters();
-        infinispanParameters.setPluginClass(InfinispanContextDistributor.class.getCanonicalName());
-        infinispanParameters.setConfigFile("infinispan/infinispan-context-test.xml");
-        contextParameters.setDistributorParameters(infinispanParameters);
-
-        final CuratorLockManagerParameters curatorParameters = new CuratorLockManagerParameters();
-        curatorParameters.setPluginClass(CuratorLockManager.class.getCanonicalName());
-        curatorParameters.setZookeeperAddress(ZOOKEEPER_ADDRESS + ":" + zookeeperPort);
-        contextParameters.setLockManagerParameters(curatorParameters);
-        ParameterService.registerParameters(LockManagerParameters.class, curatorParameters);
-
-        final long result = new ConcurrentContext().testConcurrentContext("InfinispanMultiCuratorLock",
-                TEST_JVM_COUNT_MULTI_JVM, TEST_THREAD_COUNT_MULTI_JVM, TEST_THREAD_LOOPS);
-
-        assertEquals(TEST_JVM_COUNT_MULTI_JVM * TEST_THREAD_COUNT_MULTI_JVM * TEST_THREAD_LOOPS, result);
-
-        stopZookeeperServer();
+        try {
+            startZookeeperServer();
+
+            final ContextParameters contextParameters = new ContextParameters();
+            final InfinispanDistributorParameters infinispanParameters = new InfinispanDistributorParameters();
+            infinispanParameters.setPluginClass(InfinispanContextDistributor.class.getCanonicalName());
+            infinispanParameters.setConfigFile("infinispan/infinispan-context-test.xml");
+            contextParameters.setDistributorParameters(infinispanParameters);
+
+            final CuratorLockManagerParameters curatorParameters = new CuratorLockManagerParameters();
+            curatorParameters.setPluginClass(CuratorLockManager.class.getCanonicalName());
+            curatorParameters.setZookeeperAddress(ZOOKEEPER_ADDRESS + ":" + zookeeperPort);
+            contextParameters.setLockManagerParameters(curatorParameters);
+            ParameterService.registerParameters(LockManagerParameters.class, curatorParameters);
+
+            final ConfigrationProvider configrationProvider = getConfigrationProvider("InfinispanMultiCuratorLock",
+                    TEST_JVM_COUNT_MULTI_JVM, TEST_THREAD_COUNT_MULTI_JVM, TEST_THREAD_LOOPS);
+
+            final ConcurrentContext concurrentContext = new ConcurrentContext(configrationProvider);
+            final Map<String, TestContextLongItem> result = concurrentContext.testConcurrentContext();
+
+            final int expected = TEST_JVM_COUNT_MULTI_JVM * TEST_THREAD_COUNT_MULTI_JVM * TEST_THREAD_LOOPS;
+            final TestContextLongItem actual = result.get(TEST_VALUE);
+            assertNotNull(actual);
+            assertEquals(expected, actual.getLongValue());
+        } finally {
+            stopZookeeperServer();
+        }
 
         logger.debug("Ran testConcurrentContextInfinispanMultiJVMCuratorLock test");
     }
 
     @Test
-    public void testConcurrentContextHazelcastMultiJVMCuratorLock()
-            throws ApexModelException, IOException, ApexException, InterruptedException {
+    public void testConcurrentContextHazelcastMultiJVMCuratorLock() throws Exception {
         logger.debug("Running testConcurrentContextHazelcastMultiJVMCuratorLock test . . .");
 
-        startZookeeperServer();
-
-        final ContextParameters contextParameters = new ContextParameters();
-        contextParameters.getDistributorParameters()
-                .setPluginClass(HazelcastContextDistributor.class.getCanonicalName());
-
-        final CuratorLockManagerParameters curatorParameters = new CuratorLockManagerParameters();
-        curatorParameters.setPluginClass(CuratorLockManager.class.getCanonicalName());
-        curatorParameters.setZookeeperAddress(ZOOKEEPER_ADDRESS + ":" + zookeeperPort);
-        contextParameters.setLockManagerParameters(curatorParameters);
-        ParameterService.registerParameters(LockManagerParameters.class, curatorParameters);
-
-        final long result = new ConcurrentContext().testConcurrentContext("HazelcastMultiCuratorLock",
-                TEST_JVM_COUNT_MULTI_JVM, TEST_THREAD_COUNT_MULTI_JVM, TEST_THREAD_LOOPS);
+        try {
+            startZookeeperServer();
+
+            final ContextParameters contextParameters = new ContextParameters();
+            contextParameters.getDistributorParameters()
+                    .setPluginClass(HazelcastContextDistributor.class.getCanonicalName());
+
+            final CuratorLockManagerParameters curatorParameters = new CuratorLockManagerParameters();
+            curatorParameters.setPluginClass(CuratorLockManager.class.getCanonicalName());
+            curatorParameters.setZookeeperAddress(ZOOKEEPER_ADDRESS + ":" + zookeeperPort);
+            contextParameters.setLockManagerParameters(curatorParameters);
+            ParameterService.registerParameters(LockManagerParameters.class, curatorParameters);
+
+            final ConfigrationProvider configrationProvider = getConfigrationProvider("HazelcastMultiCuratorLock",
+                    TEST_JVM_COUNT_MULTI_JVM, TEST_THREAD_COUNT_MULTI_JVM, TEST_THREAD_LOOPS);
+            final Map<String, TestContextLongItem> result =
+                    new ConcurrentContext(configrationProvider).testConcurrentContext();
+
+            final int expected = TEST_JVM_COUNT_MULTI_JVM * TEST_THREAD_COUNT_MULTI_JVM * TEST_THREAD_LOOPS;
+            final TestContextLongItem actual = result.get(TEST_VALUE);
+            assertNotNull(actual);
+            assertEquals(expected, actual.getLongValue());
+        } finally {
+            stopZookeeperServer();
+        }
+        logger.debug("Ran testConcurrentContextHazelcastMultiJVMCuratorLock test");
+    }
 
-        assertEquals(TEST_JVM_COUNT_MULTI_JVM * TEST_THREAD_COUNT_MULTI_JVM * TEST_THREAD_LOOPS, result);
+    ConfigrationProvider getConfigrationProvider(final String testType, final int jvmCount, final int threadCount,
+            final int threadLoops) {
+        return new ConfigrationProviderImpl(testType, jvmCount, threadCount, threadLoops, 16,
+                LockType.WRITE_LOCK_SINGLE_VALUE_UPDATE.getValue()) {
+            @Override
+            public Map<String, Object> getContextAlbumInitValues() {
+                final Map<String, Object> initValues = super.getContextAlbumInitValues();
+                initValues.put(TEST_VALUE, new TestContextLongItem(0l));
+                return initValues;
+            }
 
-        stopZookeeperServer();
-        logger.debug("Ran testConcurrentContextHazelcastMultiJVMCuratorLock test");
+        };
     }
 }
index 17ba5ea..a84a737 100644 (file)
@@ -24,6 +24,8 @@
         xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/jgroups-4.0.xsd">
    <UDP mcast_addr="${jgroups.udp.mcast_addr:228.6.7.8}"
         mcast_port="${jgroups.udp.mcast_port:46655}"
+        bind_port="${jgroups.udp.mcast.bind_port:63005}"
+        bind_addr="${jgroups.udp.mcast.bind_addr:127.0.0.1}"
         ucast_send_buf_size="1m"
         mcast_send_buf_size="1m"
         ucast_recv_buf_size="20m"
            max_interval="30000" 
    />
    <FD_SOCK />
+   <FD_SOCK bind_addr="${jgroups.udp.mcast.bind_addr:127.0.0.1}" sock_conn_timeout="60000" start_port="${jgroups.udp.fd.sock.start_port:63010}" port_range="1000"/>
+   
    <FD_ALL timeout="60000" 
            interval="15000" 
            timeout_check_interval="5000" 
    />
-   <VERIFY_SUSPECT timeout="5000" 
-   />
+   <VERIFY_SUSPECT timeout="5000"  />
    <pbcast.NAKACK2 xmit_interval="100"
                    xmit_table_num_rows="50"
                    xmit_table_msgs_per_row="1024"
index cbe06ed..3d257f8 100644 (file)
 
 package org.onap.policy.apex.plugins.context.metrics;
 
+import static org.onap.policy.apex.context.parameters.DistributorParameters.DEFAULT_DISTRIBUTOR_PLUGIN_CLASS;
+import static org.onap.policy.apex.context.parameters.LockManagerParameters.DEFAULT_LOCK_MANAGER_PLUGIN_CLASS;
+
+import java.io.File;
 import java.io.IOException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import org.onap.policy.apex.context.ContextAlbum;
-import org.onap.policy.apex.context.ContextException;
-import org.onap.policy.apex.context.Distributor;
-import org.onap.policy.apex.context.impl.distribution.DistributorFactory;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Map.Entry;
+
 import org.onap.policy.apex.context.parameters.ContextParameters;
 import org.onap.policy.apex.context.parameters.DistributorParameters;
-import org.onap.policy.apex.context.parameters.LockManagerParameters;
 import org.onap.policy.apex.context.test.concepts.TestContextLongItem;
-import org.onap.policy.apex.context.test.factory.TestContextAlbumFactory;
-import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
+import org.onap.policy.apex.context.test.locking.ConcurrentContext;
+import org.onap.policy.apex.context.test.utils.ConfigrationProvider;
+import org.onap.policy.apex.context.test.utils.ConfigrationProviderImpl;
+import org.onap.policy.apex.context.test.utils.ZooKeeperServerServiceProvider;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
-import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
 import org.onap.policy.apex.model.basicmodel.handling.ApexModelException;
-import org.onap.policy.apex.model.contextmodel.concepts.AxContextModel;
+import org.onap.policy.apex.plugins.context.distribution.hazelcast.HazelcastContextDistributor;
+import org.onap.policy.apex.plugins.context.distribution.infinispan.InfinispanContextDistributor;
 import org.onap.policy.apex.plugins.context.distribution.infinispan.InfinispanDistributorParameters;
+import org.onap.policy.apex.plugins.context.locking.curator.CuratorLockManager;
 import org.onap.policy.apex.plugins.context.locking.curator.CuratorLockManagerParameters;
+import org.onap.policy.apex.plugins.context.locking.hazelcast.HazelcastLockManager;
 import org.slf4j.ext.XLogger;
 import org.slf4j.ext.XLoggerFactory;
 
@@ -50,7 +53,7 @@ import org.slf4j.ext.XLoggerFactory;
  * @author Liam Fallon (liam.fallon@ericsson.com)
  */
 public class ConcurrentContextMetrics {
-    private static final int NUM_ARGS = 8;
+    private static final int NUM_ARGS = 9;
     private static final int ARG_LABEL = 0;
     private static final int ARG_JVM_COUNT = 1;
     private static final int ARG_THREAD_COUNT = 2;
@@ -58,55 +61,38 @@ public class ConcurrentContextMetrics {
     private static final int ARG_ARRAY_SIZE = 4;
     private static final int ARG_LOCK_TYPE = 5;
     private static final int ARG_ZOOKEEPER_ADDRESS = 6;
-    private static final int ARG_INTERACTIVE = 7;
-
-    private static final int TIME_10_MS = 10;
+    private static final int ARG_ZOOKEEPER_PORT = 7;
+    private static final int ARG_ZOOKEEPER_DIRECTORY = 8;
 
     // Logger for this class
     private static final XLogger LOGGER = XLoggerFactory.getXLogger(ConcurrentContextMetrics.class);
 
-    // Test parameters
-    private String testLabel = null;
-    private int jvmCount = -1;
-    private int threadCount = -1;
-    private int threadLoops = -1;
-    private int longArraySize = -1;
-    private int lockType = -1;
     private String zookeeperAddress = null;
-    private long total = -1;
-    private boolean interactive = false;
-
-    // The context distributor and map used by each test
-    private Distributor contextDistributor = null;
-    private ContextAlbum lTypeAlbum = null;
-
-    private final DateFormat dateFormat = new SimpleDateFormat("yyyy,MM,dd,HH,mm,ss,S");
+    private final ConfigrationProvider configrationProvider;
+    private final File zookeeperDirectory;
+    private final int zookeeperPort;
 
     /**
      * The main method.
      *
      * @param args the args
-     * @throws ApexModelException the apex model exception
-     * @throws IOException the IO exception
-     * @throws ApexException the apex exception
+     * @throws Exception the exception
      */
-    public static void main(final String[] args) throws ApexModelException, IOException, ApexException {
+    public static void main(final String[] args) throws Exception {
         if (args.length != NUM_ARGS) {
+            System.err.println("Args: " + Arrays.toString(args));
             System.err.println(
-                    "usage: ConcurrentContextMetrics testLabel jvmCount threadCount threadLoops longArraySize lockType zookeeperAddress interactive");
+                    "usage: testLabel jvmCount threadCount threadLoops longArraySize lockType zookeeperAddress zookeeperPort zookeeperDirectory");
             return;
         }
-        // @formatter:off
-        final ConcurrentContextMetrics concurrentContextMetrics = new ConcurrentContextMetrics(
-                args[ARG_LABEL],
-                Integer.valueOf(args[ARG_JVM_COUNT]),
-                Integer.valueOf(args[ARG_THREAD_COUNT]),
-                Integer.valueOf(args[ARG_ITERATIONS]),
-                Integer.valueOf(args[ARG_ARRAY_SIZE]),
-                Integer.valueOf(args[ARG_LOCK_TYPE]),
-                args[ARG_ZOOKEEPER_ADDRESS],
-                Boolean.valueOf(args[ARG_INTERACTIVE]));
-        // @formatter:on
+
+        final ConfigrationProvider configrationProvider =
+                new ConfigrationProviderImpl(args[ARG_LABEL], Integer.valueOf(args[ARG_JVM_COUNT]),
+                        Integer.valueOf(args[ARG_THREAD_COUNT]), Integer.valueOf(args[ARG_ITERATIONS]),
+                        Integer.valueOf(args[ARG_ARRAY_SIZE]), Integer.valueOf(args[ARG_LOCK_TYPE]));
+
+        final ConcurrentContextMetrics concurrentContextMetrics = new ConcurrentContextMetrics(configrationProvider,
+                args[ARG_ZOOKEEPER_ADDRESS], Integer.valueOf(args[ARG_ZOOKEEPER_PORT]), args[ARG_ZOOKEEPER_DIRECTORY]);
 
         concurrentContextMetrics.concurrentContextMetricsJVMLocal();
         concurrentContextMetrics.concurrentContextMetricsCurator();
@@ -119,30 +105,18 @@ public class ConcurrentContextMetrics {
 
     /**
      * The Constructor.
-     *
-     * @param testLabel the test label
-     * @param jvmCount the jvm count
-     * @param threadCount the thread count
-     * @param threadLoops the thread loops
-     * @param longArraySize the long array size
-     * @param lockType the lock type
-     * @param zookeeperAddress the zookeeper address
-     * @param interactive the interactive
+     * 
+     * @param configrationProvider
+     * @param zookeeperAddress
+     * @param zookeeperPort
+     * @param zookeeperDirectory
      */
-    // CHECKSTYLE:OFF: checkstyle:parameterNumber
-    public ConcurrentContextMetrics(final String testLabel, final int jvmCount, final int threadCount,
-            final int threadLoops, final int longArraySize, final int lockType, final String zookeeperAddress,
-            final boolean interactive) {
-        // CHECKSTYLE:ON: checkstyle:parameterNumber
-        super();
-        this.testLabel = testLabel;
-        this.jvmCount = jvmCount;
-        this.threadCount = threadCount;
-        this.threadLoops = threadLoops;
-        this.longArraySize = longArraySize;
-        this.lockType = lockType;
+    public ConcurrentContextMetrics(final ConfigrationProvider configrationProvider, final String zookeeperAddress,
+            final int zookeeperPort, final String zookeeperDirectory) {
+        this.configrationProvider = configrationProvider;
         this.zookeeperAddress = zookeeperAddress;
-        this.interactive = interactive;
+        this.zookeeperPort = zookeeperPort;
+        this.zookeeperDirectory = new File(zookeeperDirectory);
     }
 
     /**
@@ -153,17 +127,15 @@ public class ConcurrentContextMetrics {
      * @throws ApexException the apex exception
      */
     private void concurrentContextMetricsJVMLocal() throws ApexModelException, IOException, ApexException {
-        if (jvmCount != 1) {
+        if (configrationProvider.getJvmCount() != 1) {
             return;
         }
 
         LOGGER.debug("Running concurrentContextMetricsJVMLocalVarSet metrics . . .");
 
         final ContextParameters contextParameters = new ContextParameters();
-        contextParameters.getDistributorParameters()
-                .setPluginClass(DistributorParameters.DEFAULT_DISTRIBUTOR_PLUGIN_CLASS);
-        contextParameters.getLockManagerParameters()
-                .setPluginClass(LockManagerParameters.DEFAULT_LOCK_MANAGER_PLUGIN_CLASS);
+        contextParameters.getDistributorParameters().setPluginClass(DEFAULT_DISTRIBUTOR_PLUGIN_CLASS);
+        contextParameters.getLockManagerParameters().setPluginClass(DEFAULT_LOCK_MANAGER_PLUGIN_CLASS);
         runConcurrentContextMetrics("JVMLocal");
 
         LOGGER.debug("Ran concurrentContextMetricsJVMLocalVarSet metrics");
@@ -172,22 +144,19 @@ public class ConcurrentContextMetrics {
     /**
      * Concurrent context metrics hazelcast.
      *
-     * @throws ApexModelException the apex model exception
      * @throws IOException the IO exception
      * @throws ApexException the apex exception
      */
-    private void concurrentContextMetricsHazelcast() throws ApexModelException, IOException, ApexException {
-        if (jvmCount != 1) {
+    private void concurrentContextMetricsHazelcast() throws IOException, ApexException {
+        if (configrationProvider.getJvmCount() != 1) {
             return;
         }
 
         LOGGER.debug("Running concurrentContextMetricsHazelcast metrics . . .");
 
         final ContextParameters contextParameters = new ContextParameters();
-        contextParameters.getDistributorParameters()
-                .setPluginClass(DistributorParameters.DEFAULT_DISTRIBUTOR_PLUGIN_CLASS);
-        contextParameters.getLockManagerParameters()
-                .setPluginClass("org.onap.policy.apex.plugins.context.locking.hazelcast.HazelcastLockManager");
+        contextParameters.getDistributorParameters().setPluginClass(DEFAULT_DISTRIBUTOR_PLUGIN_CLASS);
+        contextParameters.getLockManagerParameters().setPluginClass(HazelcastLockManager.class.getCanonicalName());
         runConcurrentContextMetrics("Hazelcast");
 
         LOGGER.debug("Ran concurrentContextMetricsHazelcast metrics");
@@ -196,23 +165,21 @@ public class ConcurrentContextMetrics {
     /**
      * Concurrent context metrics curator.
      *
-     * @throws ApexModelException the apex model exception
      * @throws IOException the IO exception
      * @throws ApexException the apex exception
      */
-    private void concurrentContextMetricsCurator() throws ApexModelException, IOException, ApexException {
-        if (jvmCount != 1) {
+    private void concurrentContextMetricsCurator() throws IOException, ApexException {
+        if (configrationProvider.getJvmCount() != 1) {
             return;
         }
 
         LOGGER.debug("Running concurrentContextMetricsCurator metrics . . .");
 
         final ContextParameters contextParameters = new ContextParameters();
-        contextParameters.getDistributorParameters()
-                .setPluginClass(DistributorParameters.DEFAULT_DISTRIBUTOR_PLUGIN_CLASS);
+        contextParameters.getDistributorParameters().setPluginClass(DEFAULT_DISTRIBUTOR_PLUGIN_CLASS);
 
         final CuratorLockManagerParameters curatorParameters = new CuratorLockManagerParameters();
-        curatorParameters.setPluginClass("org.onap.policy.apex.plugins.context.locking.curator.CuratorLockManager");
+        curatorParameters.setPluginClass(CuratorLockManager.class.getCanonicalName());
         contextParameters.setLockManagerParameters(curatorParameters);
         curatorParameters.setZookeeperAddress(zookeeperAddress);
 
@@ -224,19 +191,16 @@ public class ConcurrentContextMetrics {
     /**
      * Concurrent context metrics hazelcast multi JVM hazelcast lock.
      *
-     * @throws ApexModelException the apex model exception
      * @throws IOException the IO exception
      * @throws ApexException the apex exception
      */
-    private void concurrentContextMetricsHazelcastMultiJVMHazelcastLock()
-            throws ApexModelException, IOException, ApexException {
+    private void concurrentContextMetricsHazelcastMultiJVMHazelcastLock() throws IOException, ApexException {
         LOGGER.debug("Running concurrentContextMetricsHazelcastMultiJVMHazelcastLock metrics . . .");
 
         final ContextParameters contextParameters = new ContextParameters();
-        contextParameters.getDistributorParameters().setPluginClass(
-                "org.onap.policy.apex.plugins.context.distribution.hazelcast.HazelcastContextDistributor");
-        contextParameters.getLockManagerParameters()
-                .setPluginClass("org.onap.policy.apex.plugins.context.locking.hazelcast.HazelcastLockManager");
+        final DistributorParameters distributorParameters = contextParameters.getDistributorParameters();
+        distributorParameters.setPluginClass(HazelcastContextDistributor.class.getCanonicalName());
+        contextParameters.getLockManagerParameters().setPluginClass(HazelcastLockManager.class.getCanonicalName());
         runConcurrentContextMetrics("HazelcastMultiJVMHazelcastLock");
 
         LOGGER.debug("Ran concurrentContextMetricsHazelcastMultiJVMHazelcastLock metrics");
@@ -245,19 +209,16 @@ public class ConcurrentContextMetrics {
     /**
      * Concurrent context metrics infinispan multi JVM hazelcastlock.
      *
-     * @throws ApexModelException the apex model exception
      * @throws IOException the IO exception
      * @throws ApexException the apex exception
      */
-    private void concurrentContextMetricsInfinispanMultiJVMHazelcastlock()
-            throws ApexModelException, IOException, ApexException {
+    private void concurrentContextMetricsInfinispanMultiJVMHazelcastlock() throws IOException, ApexException {
         LOGGER.debug("Running concurrentContextMetricsInfinispanMultiJVMHazelcastlock metrics . . .");
 
         final ContextParameters contextParameters = new ContextParameters();
-        contextParameters.getDistributorParameters().setPluginClass(
-                "org.onap.policy.apex.plugins.context.distribution.infinispan.InfinispanContextDistributor");
-        contextParameters.getLockManagerParameters()
-                .setPluginClass("org.onap.policy.apex.plugins.context.locking.hazelcast.HazelcastLockManager");
+        final DistributorParameters distributorParameters = contextParameters.getDistributorParameters();
+        distributorParameters.setPluginClass(InfinispanContextDistributor.class.getCanonicalName());
+        contextParameters.getLockManagerParameters().setPluginClass(HazelcastLockManager.class.getCanonicalName());
 
         final InfinispanDistributorParameters infinispanParameters = new InfinispanDistributorParameters();
         contextParameters.setDistributorParameters(infinispanParameters);
@@ -270,53 +231,67 @@ public class ConcurrentContextMetrics {
     /**
      * Concurrent context metrics infinispan multi JVM curator lock.
      *
-     * @throws ApexModelException the apex model exception
      * @throws IOException the IO exception
      * @throws ApexException the apex exception
+     * @throws InterruptedException
      */
     private void concurrentContextMetricsInfinispanMultiJVMCuratorLock()
-            throws ApexModelException, IOException, ApexException {
-        LOGGER.debug("Running concurrentContextMetricsInfinispanMultiJVMCuratorLock metrics . . .");
-
-        final ContextParameters contextParameters = new ContextParameters();
-        contextParameters.getDistributorParameters().setPluginClass(
-                "org.onap.policy.apex.plugins.context.distribution.infinispan.InfinispanContextDistributor");
+            throws IOException, ApexException, InterruptedException {
 
-        final CuratorLockManagerParameters curatorParameters = new CuratorLockManagerParameters();
-        curatorParameters.setPluginClass("org.onap.policy.apex.plugins.context.locking.curator.CuratorLockManager");
-        contextParameters.setLockManagerParameters(curatorParameters);
-        curatorParameters.setZookeeperAddress(zookeeperAddress);
-
-        final InfinispanDistributorParameters infinispanParameters = new InfinispanDistributorParameters();
-        contextParameters.setDistributorParameters(infinispanParameters);
-
-        runConcurrentContextMetrics("InfinispanMultiJVMCuratorLock");
+        LOGGER.debug("Running concurrentContextMetricsInfinispanMultiJVMCuratorLock metrics . . .");
 
+        final ZooKeeperServerServiceProvider zooKeeperServerServiceProvider =
+                new ZooKeeperServerServiceProvider(zookeeperDirectory, zookeeperAddress, zookeeperPort);
+        try {
+            zooKeeperServerServiceProvider.startZookeeperServer();
+            final ContextParameters contextParameters = new ContextParameters();
+            final DistributorParameters distributorParameters = contextParameters.getDistributorParameters();
+            distributorParameters.setPluginClass(InfinispanContextDistributor.class.getCanonicalName());
+
+            final CuratorLockManagerParameters curatorParameters = new CuratorLockManagerParameters();
+            curatorParameters.setPluginClass(CuratorLockManager.class.getCanonicalName());
+            contextParameters.setLockManagerParameters(curatorParameters);
+            curatorParameters.setZookeeperAddress(zookeeperAddress);
+
+            final InfinispanDistributorParameters infinispanParameters = new InfinispanDistributorParameters();
+            contextParameters.setDistributorParameters(infinispanParameters);
+
+            runConcurrentContextMetrics("InfinispanMultiJVMCuratorLock");
+        } finally {
+            zooKeeperServerServiceProvider.stopZookeeperServer();
+        }
         LOGGER.debug("Ran concurrentContextMetricsInfinispanMultiJVMCuratorLock metrics");
     }
 
     /**
      * Concurrent context metrics hazelcast multi JVM curator lock.
      *
-     * @throws ApexModelException the apex model exception
      * @throws IOException the IO exception
      * @throws ApexException the apex exception
+     * @throws InterruptedException
      */
     private void concurrentContextMetricsHazelcastMultiJVMCuratorLock()
-            throws ApexModelException, IOException, ApexException {
+            throws IOException, ApexException, InterruptedException {
         LOGGER.debug("Running concurrentContextMetricsHazelcastMultiJVMCuratorLock metrics . . .");
 
-        final ContextParameters contextParameters = new ContextParameters();
-        contextParameters.getDistributorParameters().setPluginClass(
-                "org.onap.policy.apex.plugins.context.distribution.hazelcast.HazelcastContextDistributor");
-
-        final CuratorLockManagerParameters curatorParameters = new CuratorLockManagerParameters();
-        curatorParameters.setPluginClass("org.onap.policy.apex.plugins.context.locking.curator.CuratorLockManager");
-        contextParameters.setLockManagerParameters(curatorParameters);
-        curatorParameters.setZookeeperAddress(zookeeperAddress);
-
-        runConcurrentContextMetrics("HazelcastMultiJVMCuratorLock");
+        final ZooKeeperServerServiceProvider zooKeeperServerServiceProvider =
+                new ZooKeeperServerServiceProvider(zookeeperDirectory, zookeeperAddress, zookeeperPort);
 
+        try {
+            zooKeeperServerServiceProvider.startZookeeperServer();
+            final ContextParameters contextParameters = new ContextParameters();
+            final DistributorParameters distributorParameters = contextParameters.getDistributorParameters();
+            distributorParameters.setPluginClass(HazelcastContextDistributor.class.getCanonicalName());
+
+            final CuratorLockManagerParameters curatorParameters = new CuratorLockManagerParameters();
+            curatorParameters.setPluginClass(CuratorLockManager.class.getCanonicalName());
+            contextParameters.setLockManagerParameters(curatorParameters);
+            curatorParameters.setZookeeperAddress(zookeeperAddress);
+
+            runConcurrentContextMetrics("HazelcastMultiJVMCuratorLock");
+        } finally {
+            zooKeeperServerServiceProvider.stopZookeeperServer();
+        }
         LOGGER.debug("Ran concurrentContextMetricsHazelcastMultiJVMCuratorLock metrics");
     }
 
@@ -324,202 +299,24 @@ public class ConcurrentContextMetrics {
      * Run concurrent context metrics.
      *
      * @param testName the test name
-     * @throws ApexModelException the apex model exception
      * @throws IOException the IO exception
      * @throws ApexException the apex exception
      */
-    private void runConcurrentContextMetrics(final String testName)
-            throws ApexModelException, IOException, ApexException {
-        total = -1;
-        outMetricLine(testName, "Init");
-
-        try {
-            setupContext();
-        } catch (final Exception e) {
-            e.printStackTrace();
-            throw e;
-        }
-
-        outMetricLine(testName, "Start");
-
-        Thread[] threadArray;
-
-        // Check if we have a single JVM or multiple JVMs
-        int runningThreadCount = -1;
-        if (jvmCount == 1) {
-            threadArray = new Thread[threadCount];
-
-            // Run everything in this JVM
-            for (int t = 0; t < threadCount; t++) {
-                threadArray[t] =
-                        new Thread(new ConcurrentContextMetricsThread(0, t, threadLoops, longArraySize, lockType));
-                threadArray[t].setName(testLabel + "_" + testName + ":concurrentContextMetricsThread_0_" + t);
-                threadArray[t].start();
-            }
-
-            outMetricLine(testName, "Running");
-            runningThreadCount = threadCount;
-        } else {
-            threadArray = new Thread[jvmCount];
-
-            final ConcurrentContextMetricsJVMThread[] jvmArray = new ConcurrentContextMetricsJVMThread[jvmCount];
-            // Spawn JVMs to run the tests
-            for (int j = 0; j < jvmCount; j++) {
-                jvmArray[j] = new ConcurrentContextMetricsJVMThread(testLabel + "_" + testName, j, threadCount,
-                        threadLoops, longArraySize, lockType);
-                threadArray[j] = new Thread(jvmArray[j]);
-                threadArray[j].setName(testLabel + "_" + testName + ":concurrentContextMetricsJVMThread_" + j);
-                threadArray[j].start();
-            }
-
-            boolean allReadyToGo;
-            do {
-                ThreadUtilities.sleep(TIME_10_MS);
-                allReadyToGo = true;
-                for (int j = 0; j < jvmCount; j++) {
-                    if (!jvmArray[j].isReadyToGo()) {
-                        allReadyToGo = false;
-                        break;
-                    }
-                }
-            } while (!allReadyToGo);
-
-            outMetricLine(testName, "Ready");
-            if (interactive) {
-                System.in.read();
-            }
-            outMetricLine(testName, "Running");
-
-            for (int j = 0; j < jvmCount; j++) {
-                jvmArray[j].offYouGo();
-            }
-
-            boolean allFinished;
-            do {
-                ThreadUtilities.sleep(TIME_10_MS);
-                allFinished = true;
-                for (int j = 0; j < jvmCount; j++) {
-                    if (!jvmArray[j].isAllFinished()) {
-                        allFinished = false;
-                        break;
-                    }
-                }
-            } while (!allFinished);
-
-            outMetricLine(testName, "Completed");
-
-            verifyContext(testName);
-
-            for (int j = 0; j < jvmCount; j++) {
-                jvmArray[j].finishItOut();
-            }
-
-            runningThreadCount = jvmCount;
-        }
-
-        boolean allFinished;
-        do {
-            ThreadUtilities.sleep(TIME_10_MS);
-            allFinished = true;
-            for (int i = 0; i < runningThreadCount; i++) {
-                if (threadArray[i].isAlive()) {
-                    allFinished = false;
-                    break;
-                }
-            }
-        } while (!allFinished);
-
-        if (jvmCount == 1) {
-            outMetricLine(testName, "Completed");
-            verifyContext(testName);
-        }
-
-        clearContext(testName);
-    }
-
-    /**
-     * Setup context.
-     *
-     * @throws ContextException the context exception
-     */
-    private void setupContext() throws ContextException {
-        final AxArtifactKey distributorKey = new AxArtifactKey("ApexDistributor", "0.0.1");
-        contextDistributor = new DistributorFactory().getDistributor(distributorKey);
-
-        final AxArtifactKey[] usedArtifactStackArray = {new AxArtifactKey("testC-top", "0.0.1"),
-                new AxArtifactKey("testC-next", "0.0.1"), new AxArtifactKey("testC-bot", "0.0.1")};
-
-        final AxContextModel albumsModel = TestContextAlbumFactory.createMultiAlbumsContextModel();
-        contextDistributor.registerModel(albumsModel);
-
-        lTypeAlbum = contextDistributor.createContextAlbum(new AxArtifactKey("LTypeContextAlbum", "0.0.1"));
-        assert (lTypeAlbum != null);
-        lTypeAlbum.setUserArtifactStack(usedArtifactStackArray);
-
-        for (int i = 0; i < longArraySize; i++) {
-            final String longKey = Integer.toString(i);
-            final TestContextLongItem longItem = new TestContextLongItem();
-            longItem.setLongValue(0);
-            lTypeAlbum.put(longKey, longItem);
-        }
-    }
-
-    /**
-     * Verify context.
-     *
-     * @param testName the test name
-     * @throws ContextException the context exception
-     */
-    private void verifyContext(final String testName) throws ContextException {
-        total = 0;
+    private void runConcurrentContextMetrics(final String testName) throws IOException, ApexException {
+        final ConcurrentContext concurrentContext = new ConcurrentContext(configrationProvider);
 
-        try {
-            for (int i = 0; i < longArraySize; i++) {
-                total += ((TestContextLongItem) lTypeAlbum.get(Integer.toString(i))).getLongValue();
-            }
+        LOGGER.info("Running {} ...", testName);
+        final Map<String, TestContextLongItem> result = concurrentContext.testConcurrentContext();
 
-            outMetricLine(testName, "Totaled");
-        } catch (final Exception e) {
-            e.printStackTrace();
+        long total = 0;
+        for (final Entry<String, TestContextLongItem> entry : result.entrySet()) {
+            LOGGER.trace("Album key: {}, value: {}", entry.getKey(), entry.getValue());
+            total += entry.getValue().getLongValue();
         }
+        LOGGER.info("Album total value after execution: {}", total);
 
-        if (lockType == 2) {
-            if (total == jvmCount * threadCount * threadLoops) {
-                outMetricLine(testName, "VerifiedOK");
-            } else {
-                outMetricLine(testName, "VerifiedFail");
-            }
-        } else {
-            if (total == 0) {
-                outMetricLine(testName, "VerifiedOK");
-            } else {
-                outMetricLine(testName, "VerifiedFail");
-            }
-        }
+        LOGGER.info("Completed {} ...", testName);
     }
 
-    /**
-     * Clear context.
-     *
-     * @param testName the test name
-     * @throws ContextException the context exception
-     */
-    private void clearContext(final String testName) throws ContextException {
-        contextDistributor.clear();
-        contextDistributor = null;
 
-        outMetricLine(testName, "Cleared");
-    }
-
-    /**
-     * Out metric line.
-     *
-     * @param testName the test name
-     * @param testPhase the test phase
-     */
-    public void outMetricLine(final String testName, final String testPhase) {
-        System.out.println("ContextMetrics," + dateFormat.format(new Date()) + "," + System.currentTimeMillis() + ","
-                + testLabel + "," + testName + "," + testPhase + "," + jvmCount + "," + threadCount + "," + threadLoops
-                + "," + longArraySize + "," + lockType + "," + total);
-    }
 }
diff --git a/testsuites/performance/performance-context-metrics/src/main/java/org/onap/policy/apex/plugins/context/metrics/ConcurrentContextMetricsJVM.java b/testsuites/performance/performance-context-metrics/src/main/java/org/onap/policy/apex/plugins/context/metrics/ConcurrentContextMetricsJVM.java
deleted file mode 100644 (file)
index ed81e39..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- *  Copyright (C) 2016-2018 Ericsson. 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.
- * 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.
- * 
- * SPDX-License-Identifier: Apache-2.0
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.apex.plugins.context.metrics;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.Arrays;
-
-import org.onap.policy.apex.context.ContextAlbum;
-import org.onap.policy.apex.context.Distributor;
-import org.onap.policy.apex.context.impl.distribution.DistributorFactory;
-import org.onap.policy.apex.context.test.factory.TestContextAlbumFactory;
-import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
-import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
-import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
-import org.onap.policy.apex.model.basicmodel.service.AbstractParameters;
-import org.onap.policy.apex.model.basicmodel.service.ParameterService;
-import org.onap.policy.apex.model.contextmodel.concepts.AxContextModel;
-import org.onap.policy.apex.model.utilities.Assertions;
-import org.slf4j.ext.XLogger;
-import org.slf4j.ext.XLoggerFactory;
-
-import com.google.gson.Gson;
-import com.google.gson.JsonSyntaxException;
-
-/**
- * The Class ConcurrentContextMetricsJVM rins in its own JVM to test concurrent context updates and
- * lockings across JVMs.
- *
- * @author Liam Fallon (liam.fallon@ericsson.com)
- */
-public final class ConcurrentContextMetricsJVM {
-    // Logger for this class
-    private static final XLogger LOGGER = XLoggerFactory.getXLogger(ConcurrentContextMetricsJVM.class);
-
-    private static final int NUM_ARGS = 6;
-    private static final int ARG_JVM_NO = 1;
-    private static final int ARG_THREAD_COUNT = 2;
-    private static final int ARG_ITERATIONS = 3;
-    private static final int ARG_ARRAY_SIZE = 4;
-    private static final int ARG_LOCK_TYPE = 5;
-
-    private static final int WAIT_10_MS = 10;
-
-    /**
-     * The Constructor for this class.
-     *
-     * @param testType the test type
-     * @param jvmNo the jvm no
-     * @param threadCount the thread count
-     * @param threadLoops the thread loops
-     * @param longArraySize the long array size
-     * @param lockType the lock type
-     * @throws ApexException the apex exception
-     * @throws IOException the IO exception
-     */
-    private ConcurrentContextMetricsJVM(final String testType, final int jvmNo, final int threadCount,
-            final int threadLoops, final int longArraySize, final int lockType) throws ApexException, IOException {
-        LOGGER.debug("starting JVMs and threads . . .");
-
-        final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
-
-        // Set up the distributor for this JVM
-        final AxArtifactKey distributorKey = new AxArtifactKey("ApexDistributor", "0.0.1");
-        final Distributor contextDistributor = new DistributorFactory().getDistributor(distributorKey);
-
-        final AxArtifactKey[] usedArtifactStackArray = {new AxArtifactKey("testC-top_" + jvmNo, "0.0.1"),
-                new AxArtifactKey("testC-next_" + jvmNo, "0.0.1"), new AxArtifactKey("testC-bot_" + jvmNo, "0.0.1")};
-
-        final AxContextModel testAxContextModel = TestContextAlbumFactory.createLongContextModel();
-        contextDistributor.registerModel(testAxContextModel);
-        final ContextAlbum testContextAlbum =
-                contextDistributor.createContextAlbum(new AxArtifactKey("LongSameTypeContextAlbum", "0.0.1"));
-        Assertions.argumentNotNull(testContextAlbum, "testContextAlbum may not be null");
-        testContextAlbum.setUserArtifactStack(usedArtifactStackArray);
-
-        final Thread[] threadArray = new Thread[threadCount];
-
-        for (int t = 0; t < threadCount; t++) {
-            threadArray[t] =
-                    new Thread(new ConcurrentContextMetricsThread(jvmNo, t, threadLoops, longArraySize, lockType));
-            threadArray[t].setName(testType + ":ConcurrentContextMetricsThread_" + jvmNo + "_" + t);
-            threadArray[t].start();
-            LOGGER.debug("started thread " + threadArray[t].getName());
-        }
-
-        System.out.println("ReadyToGo");
-        while (true) {
-            final String goLine = bufferedReader.readLine();
-            if (!goLine.trim().equals("OffYouGo")) {
-                throw new IOException("Expected OffYouGo");
-            }
-            break;
-        }
-
-        boolean allFinished;
-        do {
-            allFinished = true;
-            for (int t = 0; t < threadCount; t++) {
-                if (threadArray[t].isAlive()) {
-                    allFinished = false;
-                    ThreadUtilities.sleep(WAIT_10_MS);
-                    break;
-                }
-            }
-        } while (!allFinished);
-
-        System.out.println("AllFinished");
-        while (true) {
-            final String goLine = bufferedReader.readLine();
-            if (!goLine.trim().equals("FinishItOut")) {
-                throw new IOException("Expected FinishItOut");
-            }
-            break;
-        }
-
-        LOGGER.debug("threads finished");
-        contextDistributor.clear();
-    }
-
-    /**
-     * The main method.
-     *
-     * @param args the args
-     * @throws JsonSyntaxException the json syntax exception
-     * @throws ClassNotFoundException the class not found exception
-     */
-    @SuppressWarnings("unchecked")
-    public static void main(final String[] args) throws JsonSyntaxException, ClassNotFoundException {
-        if (args.length < NUM_ARGS || (args.length % 2 != 0)) {
-            LOGGER.error("invalid arguments: " + Arrays.toString(args));
-            LOGGER.error(
-                    "usage: ConcurrentContextMetricsJVM testLabel jvmNo threadCount threadLoops longArraySize lockType [parameterKey parameterJson].... ");
-            return;
-        }
-
-        int jvmNo = -1;
-        int threadCount = -1;
-        int threadLoops = -1;
-        int longArraySize = -1;
-        int lockType = -1;
-
-        try {
-            jvmNo = Integer.parseInt(args[ARG_JVM_NO]);
-        } catch (final Exception e) {
-            LOGGER.error("invalid argument jvmNo", e);
-            return;
-        }
-
-        try {
-            threadCount = Integer.parseInt(args[ARG_THREAD_COUNT]);
-        } catch (final Exception e) {
-            LOGGER.error("invalid argument threadCount", e);
-            return;
-        }
-
-        try {
-            threadLoops = Integer.parseInt(args[ARG_ITERATIONS]);
-        } catch (final Exception e) {
-            LOGGER.error("invalid argument threadLoops", e);
-            return;
-        }
-
-        try {
-            longArraySize = Integer.parseInt(args[ARG_ARRAY_SIZE]);
-        } catch (final Exception e) {
-            LOGGER.error("invalid argument longArraySize", e);
-            return;
-        }
-
-        try {
-            lockType = Integer.parseInt(args[ARG_LOCK_TYPE]);
-        } catch (final Exception e) {
-            LOGGER.error("invalid argument lockType", e);
-            return;
-        }
-
-        for (int p = NUM_ARGS; p < args.length - 1; p += 2) {
-            @SuppressWarnings("rawtypes")
-            final Class parametersClass = Class.forName(args[p]);
-            final AbstractParameters parameters =
-                    (AbstractParameters) new Gson().fromJson(args[p + 1], parametersClass);
-            ParameterService.registerParameters(parametersClass, parameters);
-        }
-
-        try {
-            new ConcurrentContextMetricsJVM(args[0], jvmNo, threadCount, threadLoops, longArraySize, lockType);
-        } catch (final Exception e) {
-            LOGGER.error("error running test in JVM", e);
-            return;
-        }
-    }
-}
diff --git a/testsuites/performance/performance-context-metrics/src/main/java/org/onap/policy/apex/plugins/context/metrics/ConcurrentContextMetricsJVMThread.java b/testsuites/performance/performance-context-metrics/src/main/java/org/onap/policy/apex/plugins/context/metrics/ConcurrentContextMetricsJVMThread.java
deleted file mode 100644 (file)
index 64bc0ca..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- *  Copyright (C) 2016-2018 Ericsson. 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.
- * 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.
- * 
- * SPDX-License-Identifier: Apache-2.0
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.apex.plugins.context.metrics;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map.Entry;
-
-import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
-import org.onap.policy.apex.model.basicmodel.service.AbstractParameters;
-import org.onap.policy.apex.model.basicmodel.service.ParameterService;
-import org.slf4j.ext.XLogger;
-import org.slf4j.ext.XLoggerFactory;
-
-import com.google.gson.Gson;
-
-/**
- * The Class ConcurrentContextMetricsJVMThread gets metrics for concurrent use of context.
- *
- * @author Liam Fallon (liam.fallon@ericsson.com)
- */
-public class ConcurrentContextMetricsJVMThread implements Runnable {
-    // Logger for this class
-    private static final XLogger LOGGER = XLoggerFactory.getXLogger(ConcurrentContextMetricsJVMThread.class);
-
-    private final String testType;
-    private final int jvm;
-    private final int threadCount;
-    private final int threadLoops;
-    private final int longArraySize;
-    private final int lockType;
-
-    private boolean readyToGo = false;
-    private boolean allFinished = false;
-
-    private PrintWriter processWriter;
-
-    /**
-     * The Constructor.
-     *
-     * @param testType the test type
-     * @param jvm the jvm
-     * @param threadCount the thread count
-     * @param threadLoops the thread loops
-     * @param longArraySize the long array size
-     * @param lockType the lock type
-     * @throws ApexException the apex exception
-     */
-    public ConcurrentContextMetricsJVMThread(final String testType, final int jvm, final int threadCount,
-            final int threadLoops, final int longArraySize, final int lockType) throws ApexException {
-        this.testType = testType;
-        this.jvm = jvm;
-        this.threadCount = threadCount;
-        this.threadLoops = threadLoops;
-        this.longArraySize = longArraySize;
-        this.lockType = lockType;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see java.lang.Runnable#run()
-     */
-    @Override
-    public void run() {
-        final List<String> commandList = new ArrayList<>();
-        commandList.add(System.getProperty("java.home") + System.getProperty("file.separator") + "bin"
-                + System.getProperty("file.separator") + "java");
-        commandList.add("-cp");
-        commandList.add(System.getProperty("java.class.path"));
-        for (final Entry<Object, Object> property : System.getProperties().entrySet()) {
-            if (property.getKey().toString().startsWith("APEX")
-                    || property.getKey().toString().equals("java.net.preferIPv4Stack")
-                    || property.getKey().toString().equals("jgroups.bind_addr")) {
-                commandList.add("-D" + property.getKey().toString() + "=" + property.getValue().toString());
-            }
-        }
-        commandList.add("org.onap.policy.apex.plugins.context.metrics.ConcurrentContextMetricsJVM");
-        commandList.add(testType);
-        commandList.add(new Integer(jvm).toString());
-        commandList.add(new Integer(threadCount).toString());
-        commandList.add(new Integer(threadLoops).toString());
-        commandList.add(new Integer(longArraySize).toString());
-        commandList.add(new Integer(lockType).toString());
-
-        for (final Entry<Class<?>, AbstractParameters> parameterServiceEntry : ParameterService.getAll()) {
-            commandList.add(parameterServiceEntry.getKey().getCanonicalName());
-            commandList.add(new Gson().toJson(parameterServiceEntry.getValue()));
-        }
-
-        LOGGER.info("starting JVM " + jvm);
-
-        // Run the JVM
-        final ProcessBuilder processBuilder = new ProcessBuilder(commandList);
-        processBuilder.redirectErrorStream(true);
-        Process process;
-
-        try {
-            process = processBuilder.start();
-
-            final InputStream is = process.getInputStream();
-            processWriter = new PrintWriter(process.getOutputStream());
-            final InputStreamReader isr = new InputStreamReader(is);
-            final BufferedReader br = new BufferedReader(isr);
-
-            String line;
-
-            LOGGER.info("JVM Output for command " + commandList + "\n");
-            while ((line = br.readLine()) != null) {
-                LOGGER.info(line);
-
-                if (line.trim().equals("ReadyToGo")) {
-                    readyToGo = true;
-                } else if (line.trim().equals("AllFinished")) {
-                    allFinished = true;
-                }
-            }
-
-            // Wait to get exit value
-            try {
-                final int exitValue = process.waitFor();
-                LOGGER.info("\n\nJVM " + jvm + " finished, exit value is " + exitValue);
-            } catch (final InterruptedException e) {
-                e.printStackTrace();
-            }
-        } catch (final IOException e1) {
-            e1.printStackTrace();
-        }
-    }
-
-    /**
-     * Checks if is ready to go.
-     *
-     * @return true, if checks if is ready to go
-     */
-    public boolean isReadyToGo() {
-        return readyToGo;
-    }
-
-    /**
-     * Checks if is all finished.
-     *
-     * @return true, if checks if is all finished
-     */
-    public boolean isAllFinished() {
-        return allFinished;
-    }
-
-    /**
-     * Off you go.
-     */
-    public void offYouGo() {
-        processWriter.println("OffYouGo");
-        processWriter.flush();
-    }
-
-    /**
-     * Finish it out.
-     */
-    public void finishItOut() {
-        processWriter.println("FinishItOut");
-        processWriter.flush();
-    }
-}
diff --git a/testsuites/performance/performance-context-metrics/src/main/java/org/onap/policy/apex/plugins/context/metrics/ConcurrentContextMetricsThread.java b/testsuites/performance/performance-context-metrics/src/main/java/org/onap/policy/apex/plugins/context/metrics/ConcurrentContextMetricsThread.java
deleted file mode 100644 (file)
index e207832..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- *  Copyright (C) 2016-2018 Ericsson. 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.
- * 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.
- * 
- * SPDX-License-Identifier: Apache-2.0
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.apex.plugins.context.metrics;
-
-import java.util.Random;
-
-import org.onap.policy.apex.context.ContextAlbum;
-import org.onap.policy.apex.context.ContextException;
-import org.onap.policy.apex.context.Distributor;
-import org.onap.policy.apex.context.impl.distribution.DistributorFactory;
-import org.onap.policy.apex.context.test.concepts.TestContextLongItem;
-import org.onap.policy.apex.context.test.factory.TestContextAlbumFactory;
-import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
-import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
-import org.onap.policy.apex.model.contextmodel.concepts.AxContextModel;
-import org.slf4j.ext.XLogger;
-import org.slf4j.ext.XLoggerFactory;
-
-/**
- * The Class ConcurrentContextMetricsThread gets metrics for concurrent use of context.
- *
- * @author Liam Fallon (liam.fallon@ericsson.com)
- */
-public class ConcurrentContextMetricsThread implements Runnable {
-    // Logger for this class
-    private static final XLogger LOGGER = XLoggerFactory.getXLogger(ConcurrentContextMetricsThread.class);
-    private final Distributor contextDistributor;
-    private final int jvm;
-    private final int instance;
-    private final int threadLoops;
-    private final int longArraySize;
-    private final int lockType;
-
-    /**
-     * The Constructor.
-     *
-     * @param jvm the jvm
-     * @param instance the instance
-     * @param threadLoops the thread loops
-     * @param longArraySize the long array size
-     * @param lockType the lock type
-     * @throws ApexException the apex exception
-     */
-    public ConcurrentContextMetricsThread(final int jvm, final int instance, final int threadLoops,
-            final int longArraySize, final int lockType) throws ApexException {
-        this.jvm = jvm;
-        this.instance = instance;
-        this.threadLoops = threadLoops;
-        this.longArraySize = longArraySize;
-        this.lockType = lockType;
-
-        final AxArtifactKey distributorKey = new AxArtifactKey("ApexDistributor_" + jvm + "_" + instance, "0.0.1");
-        contextDistributor = new DistributorFactory().getDistributor(distributorKey);
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see java.lang.Runnable#run()
-     */
-    @Override
-    public void run() {
-        LOGGER.info("running ConcurrentContextMetricsThread_" + jvm + "_" + instance + " . . .");
-
-        ContextAlbum lTypeAlbum = null;
-        try {
-            final AxContextModel axTestContextModel = TestContextAlbumFactory.createMultiAlbumsContextModel();
-            contextDistributor.registerModel(axTestContextModel);
-            lTypeAlbum = contextDistributor.createContextAlbum(new AxArtifactKey("LTypeContextAlbum", "0.0.1"));
-        } catch (final Exception e) {
-            LOGGER.error("could not get the test context album", e);
-            LOGGER.error("failed ConcurrentContextMetricsThread_" + jvm + "_" + instance);
-            return;
-        }
-
-        if (lTypeAlbum == null) {
-            LOGGER.error("could not find the test context album");
-            LOGGER.error("failed ConcurrentContextMetricsThread_" + jvm + "_" + instance);
-            return;
-        }
-
-        final AxArtifactKey[] usedArtifactStackArray =
-                {new AxArtifactKey("testCC-top", "0.0.1"), new AxArtifactKey("testCC-" + instance, "0.0.1")};
-
-        lTypeAlbum.setUserArtifactStack(usedArtifactStackArray);
-
-        final Random rand = new Random();
-
-        for (int i = 0; i < threadLoops; i++) {
-            // Get the next random entry to use
-            final String nextLongKey = Integer.toString(rand.nextInt(longArraySize));
-
-            if (lockType == 0) {
-                final TestContextLongItem item = (TestContextLongItem) lTypeAlbum.get(nextLongKey);
-                final long value = item.getLongValue();
-                if (LOGGER.isTraceEnabled()) {
-                    LOGGER.trace("lock type=" + lockType + ", value=" + value);
-                }
-                continue;
-            }
-
-            if (lockType == 1) {
-                try {
-                    lTypeAlbum.lockForReading(nextLongKey);
-                } catch (final ContextException e) {
-                    LOGGER.error("could not acquire read lock on context album, key=" + nextLongKey, e);
-                    continue;
-                }
-
-                final TestContextLongItem item = (TestContextLongItem) lTypeAlbum.get(nextLongKey);
-                final long value = item.getLongValue();
-                if (LOGGER.isTraceEnabled()) {
-                    LOGGER.trace("lock type=" + lockType + ", value=" + value);
-                }
-
-                try {
-                    lTypeAlbum.unlockForReading(nextLongKey);
-                } catch (final ContextException e) {
-                    LOGGER.error("could not release read lock on context album, key=" + nextLongKey, e);
-                }
-
-                continue;
-            }
-
-            if (lockType == 2) {
-                try {
-                    lTypeAlbum.lockForWriting(nextLongKey);
-                } catch (final ContextException e) {
-                    LOGGER.error("could not acquire write lock on context album, key=" + nextLongKey, e);
-                    continue;
-                }
-
-                final TestContextLongItem item = (TestContextLongItem) lTypeAlbum.get(nextLongKey);
-                long value = item.getLongValue();
-                if (LOGGER.isTraceEnabled()) {
-                    LOGGER.trace("lock type=" + lockType + ", value=" + value);
-                }
-                item.setLongValue(++value);
-                lTypeAlbum.put(nextLongKey, item);
-
-                try {
-                    lTypeAlbum.unlockForWriting(nextLongKey);
-                } catch (final ContextException e) {
-                    LOGGER.error("could not release write lock on context album, key=" + nextLongKey, e);
-                }
-                continue;
-            }
-        }
-
-        LOGGER.info("completed ConcurrentContextMetricsThread_" + jvm + "_" + instance);
-    }
-}
index 5607f87..9f051eb 100644 (file)
@@ -22,36 +22,59 @@ package org.onap.policy.apex.plugins.context.metrics;
 
 import static org.junit.Assert.fail;
 
+import java.io.File;
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.TreeSet;
 
-import org.apache.curator.test.TestingServer;
-import org.junit.After;
-import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.onap.policy.apex.context.test.utils.NetworkUtils;
+import org.onap.policy.apex.model.utilities.ResourceUtils;
+import org.slf4j.ext.XLogger;
+import org.slf4j.ext.XLoggerFactory;
 
 public class TestMetrics {
-    // Zookeeper test server
-    TestingServer zkTestServer;
+    // Logger for this class
+    private static final XLogger LOGGER = XLoggerFactory.getXLogger(TestMetrics.class);
+    private static final String HAZELCAST_CONFIG = "hazelcast.config";
 
-    @Before
-    public void beforeTest() throws Exception {
-        zkTestServer = new TestingServer(62181);
-    }
+    private static final String JAVA_NET_PREFER_IPV4_STACK = "java.net.preferIPv4Stack";
+    private static final String HAZELCAST_XML_FILE = "src/test/resources/hazelcast/hazelcast.xml";
+
+    @Rule
+    public final TemporaryFolder folder = new TemporaryFolder();
+
+    @BeforeClass
+    public static void configure() throws Exception {
+        System.setProperty(JAVA_NET_PREFER_IPV4_STACK, "true");
+        final String hazelCastfileLocation = ResourceUtils.getFilePath4Resource(HAZELCAST_XML_FILE);
+        System.setProperty(HAZELCAST_CONFIG, hazelCastfileLocation);
+
+        final TreeSet<String> ipAddressSet = NetworkUtils.getIPv4NonLoopAddresses();
+
+        if (ipAddressSet.size() == 0) {
+            throw new Exception("cound not find real IP address for test");
+        }
+        LOGGER.info("For Infinispan, setting jgroups.tcp.address to: {}", ipAddressSet.first());
+        System.setProperty("jgroups.tcp.address", ipAddressSet.first());
 
-    @After
-    public void afterTest() throws IOException {
-        zkTestServer.stop();
     }
 
     @Test
-    public void getSingleJVMMetrics() {
-        final String[] args = {"singleJVMTestNL", "1", "32", "1000", "65536", "0", "localhost:62181", "false"};
+    public void getSingleJVMMetrics() throws IOException {
+        final File zookeeperDirectory = folder.newFolder("zookeeperDirectory");
+        final String[] args = {"singleJVMTestNL", "1", "32", "1000", "65536", "0", "localhost", "62181",
+                zookeeperDirectory.getAbsolutePath()};
 
+        LOGGER.info("Starting with args: {}", Arrays.toString(args));
         try {
             ConcurrentContextMetrics.main(args);
-        } catch (final Exception e) {
+        } catch (final Exception exception) {
+            LOGGER.error("Unexpected error", exception);
             fail("Metrics test failed");
-            e.printStackTrace();
         }
     }
 }
index 84da495..b70bdc3 100644 (file)
   ============LICENSE_END=========================================================
 -->
 
-<hazelcast xmlns="http://www.hazelcast.com/schema/config"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-       <group>
-               <name>HazelcastGroup3.0EVAL</name>
-               <password>password3.0EVAL</password>
-       </group>
-       <network>
-               <port auto-increment="true">5706</port>
-               <join>
-                       <multicast enabled="false">
-                               <multicast-group>224.2.2.10</multicast-group>
-                               <multicast-port>54327</multicast-port>
-                       </multicast>
-                       <tcp-ip enabled="true">
-                               <members>10.0.0.0</members>
-                               <!-- members>192.168.219.141</members-->
-                       </tcp-ip>
-               </join>
-               <interfaces enabled="false">
+<hazelcast xmlns="http://www.hazelcast.com/schema/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <group>
+        <name>HazelcastGroup3.0EVAL</name>
+        <password>password3.0EVAL</password>
+    </group>
+    <network>
+        <port auto-increment="true">5706</port>
+        <join>
+            <multicast enabled="false">
+                <multicast-group>224.2.2.10</multicast-group>
+                <multicast-port>54327</multicast-port>
+            </multicast>
+            <tcp-ip enabled="true">
+                <members>127.0.0.1</members>
+            </tcp-ip>
+        </join>
+        <interfaces enabled="false">
                        <!-- This value will allow hazelcast to run locally from the IDE -->
-                       <interface>127.0.0.*</interface>
-               </interfaces>
-       </network>
-       <properties>
-               <property name="hazelcast.icmp.enabled">true</property>
-               <property name="hazelcast.logging.type">slf4j</property>
+            <interface>127.0.0.*</interface>
+        </interfaces>
+    </network>
+    <properties>
+        <property name="hazelcast.icmp.enabled">false</property>
+        <property name="hazelcast.logging.type">slf4j</property>
                <!-- disable the hazelcast shutdown hook - prefer to control the shutdown 
                        in code -->
-               <property name="hazelcast.shutdownhook.enabled">false</property>
-               <property name="hazelcast.graceful.shutdown.max.wait">60</property>
-       </properties>
-       <executor-service>
-               <pool-size>16</pool-size>
-       </executor-service>
-       <queue name="default">
-               <!-- Maximum size of the queue. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>100000</max-size>
-               <!-- Maximum number of seconds for each item to stay in the queue. Items 
-                       that are not consumed in <time-to-live-seconds> will automatically get evicted 
-                       from the queue. Any integer between 0 and Integer.MAX_VALUE. 0 means infinite. 
-                       Default is 0. -->
-       </queue>
-       <map name="default">
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>1</backup-count>
-               <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), LFU 
-                       (Least Frequiently Used). NONE is the default. -->
-               <eviction-policy>NONE</eviction-policy>
-               <!-- Maximum size of the map. When max size is reached, map is evicted 
-                       based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>0</max-size>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>25</eviction-percentage>
-       </map>
-       <map name="L_ATTACH-Map">
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>1</backup-count>
-               <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), LFU 
-                       (Least Frequiently Used). NONE is the default. -->
-               <eviction-policy>LRU</eviction-policy>
-               <!-- Maximum size of the map. When max size is reached, map is evicted 
-                       based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>1000000</max-size>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>5</eviction-percentage>
-
-               <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                       that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                       will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means infinite. Default is 0. -->
-               <time-to-live-seconds>0</time-to-live-seconds>
-
-               <!-- <map-store enabled="true"> Name of the class implementing MapLoader 
-                       and/or MapStore. The class should implement at least of these interfaces 
-                       and contain no-argument constructor. Note that the inner classes are not 
-                       supported. <class-name>com.ericsson.xstream.loading.service.buffer.L_ATTACHLoader</class-name> 
-                       Number of seconds to delay to call the MapStore.store(key, value). If the 
-                       value is zero then it is write-through so MapStore.store(key, value) will 
-                       be called as soon as the entry is updated. Otherwise it is write-behind so 
-                       updates will be stored after write-delay-seconds value by calling Hazelcast.storeAll(map). 
-                       Default value is 0. <write-delay-seconds>60000</write-delay-seconds> </map-store> -->
-
-
-       </map>
-       <map name="CTUM-Map">
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>1</backup-count>
-               <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), LFU 
-                       (Least Frequiently Used). NONE is the default. -->
-               <eviction-policy>LRU</eviction-policy>
-               <!-- Maximum size of the map. When max size is reached, map is evicted 
-                       based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>1000000</max-size>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>5</eviction-percentage>
-
-               <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                       that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                       will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means infinite. Default is 0. -->
-               <time-to-live-seconds>7200</time-to-live-seconds>
-
-               <!-- <map-store enabled="true"> Name of the class implementing MapLoader 
-                       and/or MapStore. The class should implement at least of these interfaces 
-                       and contain no-argument constructor. Note that the inner classes are not 
-                       supported. <class-name>com.ericsson.xstream.loading.service.buffer.CTUMLoader</class-name> 
-                       Number of seconds to delay to call the MapStore.store(key, value). If the 
-                       value is zero then it is write-through so MapStore.store(key, value) will 
-                       be called as soon as the entry is updated. Otherwise it is write-behind so 
-                       updates will be stored after write-delay-seconds value by calling Hazelcast.storeAll(map). 
-                       Default value is 0. <write-delay-seconds>3600</write-delay-seconds> </map-store> -->
-
-       </map>
-       <map name="L_HANDOVER-Map">
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>1</backup-count>
-               <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), LFU 
-                       (Least Frequiently Used). NONE is the default. -->
-               <eviction-policy>LRU</eviction-policy>
-               <!-- Maximum size of the map. When max size is reached, map is evicted 
-                       based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>1000000</max-size>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>5</eviction-percentage>
-
-               <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                       that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                       will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means infinite. Default is 0. -->
-               <time-to-live-seconds>3600</time-to-live-seconds>
-
-               <!-- <map-store enabled="true"> Name of the class implementing MapLoader 
-                       and/or MapStore. The class should implement at least of these interfaces 
-                       and contain no-argument constructor. Note that the inner classes are not 
-                       supported. <class-name>com.ericsson.xstream.base.publishing.hazelcast.L_ATTACHStore</class-name> 
-                       Number of seconds to delay to call the MapStore.store(key, value). If the 
-                       value is zero then it is write-through so MapStore.store(key, value) will 
-                       be called as soon as the entry is updated. Otherwise it is write-behind so 
-                       updates will be stored after write-delay-seconds value by calling Hazelcast.storeAll(map). 
-                       Default value is 0. <write-delay-seconds>5</write-delay-seconds> </map-store> -->
-
-
-       </map>
-
-       <map name="L_SERVICE_REQUEST-Map">
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>1</backup-count>
-               <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), LFU 
-                       (Least Frequiently Used). NONE is the default. -->
-               <eviction-policy>LRU</eviction-policy>
-               <!-- Maximum size of the map. When max size is reached, map is evicted 
-                       based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>1000000</max-size>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>5</eviction-percentage>
-
-               <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                       that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                       will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means infinite. Default is 0. -->
-               <time-to-live-seconds>7200</time-to-live-seconds>
-
-               <!-- <map-store enabled="true"> Name of the class implementing MapLoader 
-                       and/or MapStore. The class should implement at least of these interfaces 
-                       and contain no-argument constructor. Note that the inner classes are not 
-                       supported. <class-name>com.ericsson.xstream.base.publishing.hazelcast.L_HandoverStore</class-name> 
-                       Number of seconds to delay to call the MapStore.store(key, value). If the 
-                       value is zero then it is write-through so MapStore.store(key, value) will 
-                       be called as soon as the entry is updated. Otherwise it is write-behind so 
-                       updates will be stored after write-delay-seconds value by calling Hazelcast.storeAll(map). 
-                       Default value is 0. <write-delay-seconds>5</write-delay-seconds> </map-store> -->
-
-
-       </map>
-       <map name="CommonCache">
-
-
-               <!-- Number of async-backups. If 1 is set as the backup-count for example, 
-                       then all entries of the map will be copied to another JVM for fail-safety. 
-                       Valid numbers are 0 (no backup), 1, 2, 3. -->
-               <async-backup-count>1</async-backup-count>
-
-               <!-- Can we read the local backup entries? Default value is false for strong 
-                       consistency. Being able to read backup data will give you greater performance. -->
-               <read-backup-data>true</read-backup-data>
-               <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), LFU 
-                       (Least Frequiently Used). NONE is the default. -->
-               <eviction-policy>LRU</eviction-policy>
-               <!-- Maximum size of the map. When max size is reached, map is evicted 
-                       based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>3000000</max-size>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>5</eviction-percentage>
-
-               <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                       that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                       will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means infinite. Default is 0. -->
-               <time-to-live-seconds>7200</time-to-live-seconds>
-
-               <!-- <map-store enabled="true"> Name of the class implementing MapLoader 
-                       and/or MapStore. The class should implement at least of these interfaces 
-                       and contain no-argument constructor. Note that the inner classes are not 
-                       supported. <class-name>com.ericsson.xstream.base.publishing.hazelcast.L_HandoverStore</class-name> 
-                       Number of seconds to delay to call the MapStore.store(key, value). If the 
-                       value is zero then it is write-through so MapStore.store(key, value) will 
-                       be called as soon as the entry is updated. Otherwise it is write-behind so 
-                       updates will be stored after write-delay-seconds value by calling Hazelcast.storeAll(map). 
-                       Default value is 0. <write-delay-seconds>5</write-delay-seconds> </map-store> -->
-
-
-       </map>
-
-
-       <map name="Topology-Map">
-
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>2</backup-count>
-               <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), LFU 
-                       (Least Frequiently Used). NONE is the default. -->
-               <eviction-policy>NONE</eviction-policy>
-               <!-- Maximum size of the map. When max size is reached, map is evicted 
-                       based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>10000000</max-size>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>0</eviction-percentage>
-
-
-               <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                       that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                       will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means infinite. Default is 0. -->
-               <time-to-live-seconds>0</time-to-live-seconds>
-
-               <!-- <map-store enabled="true"> Name of the class implementing MapLoader 
-                       and/or MapStore. The class should implement at least of these interfaces 
-                       and contain no-argument constructor. Note that the inner classes are not 
-                       supported. <class-name>com.ericsson.xstream.loading.service.buffer.TopologyCacheLoader</class-name> 
-                       Number of seconds to delay to call the MapStore.store(key, value). If the 
-                       value is zero then it is write-through so MapStore.store(key, value) will 
-                       be called as soon as the entry is updated. Otherwise it is write-behind so 
-                       updates will be stored after write-delay-seconds value by calling Hazelcast.storeAll(map). 
-                       Default value is 0. <write-delay-seconds>5</write-delay-seconds> </map-store> -->
-
-
-
-       </map>
-       <map name="Protocol-cause-code-Map">
-               <near-cache>
-                       <!-- Maximum number of seconds for each entry to stay in the near cache. 
-                               Entries that are older than <time-to-live-seconds> will get automatically 
-                               evicted from the near cache. Any integer between 0 and Integer.MAX_VALUE. 
-                               0 means infinite. Default is 0. -->
-                       <time-to-live-seconds>0</time-to-live-seconds>
-
-                       <!-- Maximum number of seconds each entry can stay in the near cache as 
-                               untouched (not-read). Entries that are not read (touched) more than <max-idle-seconds> 
-                               value will get removed from the near cache. Any integer between 0 and Integer.MAX_VALUE. 
-                               0 means Integer.MAX_VALUE. Default is 0. -->
-                       <max-idle-seconds>0</max-idle-seconds>
-
-                       <!-- Valid values are: NONE (no extra eviction, <time-to-live-seconds> 
-                               may still apply), LRU (Least Recently Used), LFU (Least Frequently Used). 
-                               NONE is the default. Regardless of the eviction policy used, <time-to-live-seconds> 
-                               will still apply. -->
-                       <eviction-policy>NONE</eviction-policy>
-
-                       <!-- Maximum size of the near cache. When max size is reached, cache is 
-                               evicted based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                               0 means Integer.MAX_VALUE. Default is 0. -->
-                       <max-size>2000</max-size>
-
-                       <!-- Should the cached entries get evicted if the entries are changed 
-                               (updated or removed). true of false. Default is true. -->
-                       <invalidate-on-change>true</invalidate-on-change>
-
-               </near-cache>
-
-
-
-       </map>
-       <map name="SessionId_Map">
-
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>1</backup-count>
-               <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), LFU 
-                       (Least Frequiently Used). NONE is the default. -->
-               <eviction-policy>NONE</eviction-policy>
-               <!-- Maximum size of the map. When max size is reached, map is evicted 
-                       based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>10000000</max-size>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>0</eviction-percentage>
-
-
-               <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                       that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                       will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means infinite. Default is 0. -->
-               <time-to-live-seconds>60</time-to-live-seconds>
-               <!-- <map-store enabled="true"> Name of the class implementing MapLoader 
-                       and/or MapStore. The class should implement at least of these interfaces 
-                       and contain no-argument constructor. Note that the inner classes are not 
-                       supported. <class-name>com.ericsson.xstream.loading.service.buffer.TopologyCacheLoader</class-name> 
-                       Number of seconds to delay to call the MapStore.store(key, value). If the 
-                       value is zero then it is write-through so MapStore.store(key, value) will 
-                       be called as soon as the entry is updated. Otherwise it is write-behind so 
-                       updates will be stored after write-delay-seconds value by calling Hazelcast.storeAll(map). 
-                       Default value is 0. <write-delay-seconds>5</write-delay-seconds> </map-store> -->
-
-
-       </map>
-       <map name="gpeh-reasons-Map">
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>2</backup-count>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>0</eviction-percentage>
-               <near-cache>
-                       <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                               all entries of the map will be copied to another JVM for fail-safety. Valid 
-                               numbers are 0 (no backup), 1, 2, 3. -->
-                       <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), 
-                               LFU (Least Frequently Used). NONE is the default. -->
-                       <eviction-policy>NONE</eviction-policy>
-                       <!-- Maximum size of the map. When max size is reached, map is evicted 
-                               based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                               0 means Integer.MAX_VALUE. Default is 0. -->
-                       <max-size>1000</max-size>
-
-
-                       <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                               that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                               will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                               0 means infinite. Default is 0. -->
-                       <time-to-live-seconds>0</time-to-live-seconds>
-               </near-cache>
-       </map>
-       <map name="tac-imei-Map">
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>2</backup-count>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>0</eviction-percentage>
-
-               <near-cache>
-                       <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), 
-                               LFU (Least Frequently Used). NONE is the default. -->
-                       <eviction-policy>NONE</eviction-policy>
-                       <!-- Maximum size of the map. When max size is reached, map is evicted 
-                               based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                               0 means Integer.MAX_VALUE. Default is 0. -->
-                       <max-size>10000</max-size>
-
-                       <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                               that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                               will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                               0 means infinite. Default is 0. -->
-                       <time-to-live-seconds>0</time-to-live-seconds>
-               </near-cache>
-       </map>
-
-       <map name="CORE-DATA-Map">
-
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>2</backup-count>
-               <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), LFU 
-                       (Least Frequiently Used). NONE is the default. -->
-               <eviction-policy>NONE</eviction-policy>
-               <!-- Maximum size of the map. When max size is reached, map is evicted 
-                       based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>10000000</max-size>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>0</eviction-percentage>
-
-
-               <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                       that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                       will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means infinite. Default is 0. -->
-               <time-to-live-seconds>0</time-to-live-seconds>
-
-               <!-- <map-store enabled="true"> Name of the class implementing MapLoader 
-                       and/or MapStore. The class should implement at least of these interfaces 
-                       and contain no-argument constructor. Note that the inner classes are not 
-                       supported. <class-name>com.ericsson.xstream.loading.service.buffer.TopologyCacheLoader</class-name> 
-                       Number of seconds to delay to call the MapStore.store(key, value). If the 
-                       value is zero then it is write-through so MapStore.store(key, value) will 
-                       be called as soon as the entry is updated. Otherwise it is write-behind so 
-                       updates will be stored after write-delay-seconds value by calling Hazelcast.storeAll(map). 
-                       Default value is 0. <write-delay-seconds>5</write-delay-seconds> </map-store> -->
-
-
-
-       </map>
-       <map name="IMSI-APN-Map">
-
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>2</backup-count>
-               <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), LFU 
-                       (Least Frequiently Used). NONE is the default. -->
-               <eviction-policy>NONE</eviction-policy>
-               <!-- Maximum size of the map. When max size is reached, map is evicted 
-                       based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>10000000</max-size>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>0</eviction-percentage>
-
-
-               <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                       that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                       will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means infinite. Default is 0. -->
-               <time-to-live-seconds>0</time-to-live-seconds>
-
-               <!-- <map-store enabled="true"> Name of the class implementing MapLoader 
-                       and/or MapStore. The class should implement at least of these interfaces 
-                       and contain no-argument constructor. Note that the inner classes are not 
-                       supported. <class-name>com.ericsson.xstream.loading.service.buffer.TopologyCacheLoader</class-name> 
-                       Number of seconds to delay to call the MapStore.store(key, value). If the 
-                       value is zero then it is write-through so MapStore.store(key, value) will 
-                       be called as soon as the entry is updated. Otherwise it is write-behind so 
-                       updates will be stored after write-delay-seconds value by calling Hazelcast.storeAll(map). 
-                       Default value is 0. <write-delay-seconds>5</write-delay-seconds> </map-store> -->
-
-
-
-       </map>
-       <map name="CommonDataCache">
-
-
-               <!-- Number of async-backups. If 1 is set as the backup-count for example, 
-                       then all entries of the map will be copied to another JVM for fail-safety. 
-                       Valid numbers are 0 (no backup), 1, 2, 3. -->
-               <async-backup-count>1</async-backup-count>
-
-               <!-- Can we read the local backup entries? Default value is false for strong 
-                       consistency. Being able to read backup data will give you greater performance. -->
-               <read-backup-data>true</read-backup-data>
-               <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), LFU 
-                       (Least Frequiently Used). NONE is the default. -->
-               <eviction-policy>LRU</eviction-policy>
-               <!-- Maximum size of the map. When max size is reached, map is evicted 
-                       based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>3000000</max-size>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>5</eviction-percentage>
-
-               <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                       that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                       will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means infinite. Default is 0. -->
-               <time-to-live-seconds>7200</time-to-live-seconds>
-
-               <!-- <map-store enabled="true"> Name of the class implementing MapLoader 
-                       and/or MapStore. The class should implement at least of these interfaces 
-                       and contain no-argument constructor. Note that the inner classes are not 
-                       supported. <class-name>com.ericsson.xstream.base.publishing.hazelcast.L_HandoverStore</class-name> 
-                       Number of seconds to delay to call the MapStore.store(key, value). If the 
-                       value is zero then it is write-through so MapStore.store(key, value) will 
-                       be called as soon as the entry is updated. Otherwise it is write-behind so 
-                       updates will be stored after write-delay-seconds value by calling Hazelcast.storeAll(map). 
-                       Default value is 0. <write-delay-seconds>5</write-delay-seconds> </map-store> -->
-
-
-       </map>
-
-
-       <queue name="raw-distributer-queue">
-               <!-- Maximum size of the queue. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>100000</max-size>
-       </queue>
-       <map name="queue-map">
-
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>0</backup-count>
-
-       </map>
-
-       <map name="radio-correlation-config-Map">
-               <backup-count>2</backup-count>
-               <eviction-policy>NONE</eviction-policy>
-               <max-size>50</max-size>
-               <eviction-percentage>0</eviction-percentage>
-               <time-to-live-seconds>0</time-to-live-seconds>
-       </map>
-
-       <map name="xstream-configuration-map">
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>0</backup-count>
-               <time-to-live-seconds>100000</time-to-live-seconds>
-       </map>
-
-       <map name="TOPIC-TASK-MAP">
-
-               <async-backup-count>3</async-backup-count>
-
-               <read-backup-data>true</read-backup-data>
-               <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), LFU 
-                       (Least Frequiently Used). NONE is the default. -->
-               <eviction-policy>NONE</eviction-policy>
-               <!-- Maximum size of the map. When max size is reached, map is evicted 
-                       based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>1000</max-size>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>0</eviction-percentage>
-
-
-
-               <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                       that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                       will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means infinite. Default is 0. -->
-               <time-to-live-seconds>0</time-to-live-seconds>
-       </map>
-       <map name="TOPIC-REGISTRY">
-
-               <async-backup-count>3</async-backup-count>
-
-               <read-backup-data>true</read-backup-data>
-               <!-- Valid values are: NONE (no eviction), LRU (Least Recently Used), LFU 
-                       (Least Frequiently Used). NONE is the default. -->
-               <eviction-policy>NONE</eviction-policy>
-               <!-- Maximum size of the map. When max size is reached, map is evicted 
-                       based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>1000</max-size>
-               <!-- When max. size is reached, specified percentage of the map will be 
-                       evicted. Any integer between 0 and 100. If 25 is set for example, 25% of 
-                       the entries will get evicted. -->
-               <eviction-percentage>0</eviction-percentage>
-
-
-
-               <!-- Maximum number of seconds for each entry to stay in the map. Entries 
-                       that are older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
-                       will get automatically evicted from the map. Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means infinite. Default is 0. -->
-               <time-to-live-seconds>0</time-to-live-seconds>
-       </map>
-       <queue name="Pooled-Topic-Request-Queue">
-               <!-- Maximum size of the queue.Any integer between 0 and Integer.MAX_VALUE. 
-                       0 means Integer.MAX_VALUE. Default is 0. -->
-               <max-size>100000</max-size>
-       </queue>
-       <map name="Pooled-Topic-Request-Queue-Backup-map">
-
-               <!-- Number of backups. If 1 is set as the backup-count for example, then 
-                       all entries of the map will be copied to another JVM for fail-safety. Valid 
-                       numbers are 0 (no backup), 1, 2, 3. -->
-               <backup-count>1</backup-count>
-               <eviction-policy>NONE</eviction-policy>
-               <time-to-live-seconds>0</time-to-live-seconds>
-       </map>
-
+        <property name="hazelcast.shutdownhook.enabled">false</property>
+        <property name="hazelcast.graceful.shutdown.max.wait">60</property>
+        <property name="hazelcast.operation.generic.thread.count">1</property>
+        <property name="hazelcast.operation.thread.count">1</property>
+        <property name="hazelcast.clientengine.thread.count">1</property>
+        <property name="hazelcast.client.event.thread.count">1</property>
+        <property name="hazelcast.event.thread.count">1</property>
+        <property name="hazelcast.io.output.thread.count">1</property>
+        <property name="hazelcast.io.thread.count">1</property>
+        <property name="hazelcast.executor.client.thread.count">1</property>
+        <property name="hazelcast.clientengine.thread.count">1</property>
+    </properties>
+    <executor-service>
+        <pool-size>2</pool-size>
+    </executor-service>
 </hazelcast>
diff --git a/testsuites/performance/performance-context-metrics/src/test/resources/infinispan/default-jgroups-tcp.xml b/testsuites/performance/performance-context-metrics/src/test/resources/infinispan/default-jgroups-tcp.xml
new file mode 100644 (file)
index 0000000..028cf1d
--- /dev/null
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2016-2018 Ericsson. 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.
+  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.
+  
+  SPDX-License-Identifier: Apache-2.0
+  ============LICENSE_END=========================================================
+-->
+
+<config xmlns="urn:org:jgroups"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/jgroups-4.0.xsd">
+   <TCP bind_addr="${jgroups.tcp.address:127.0.0.1}"
+        bind_port="${jgroups.tcp.port:7800}"
+        enable_diagnostics="false"
+        thread_naming_pattern="pl"
+        send_buf_size="640k"
+        sock_conn_timeout="300"
+        bundler_type="no-bundler"
+
+        thread_pool.min_threads="${jgroups.thread_pool.min_threads:0}"
+        thread_pool.max_threads="${jgroups.thread_pool.max_threads:200}"
+        thread_pool.keep_alive_time="60000"
+   />
+   <MPING bind_addr="${jgroups.tcp.address:127.0.0.1}"
+          mcast_addr="${jgroups.mping.mcast_addr:228.2.4.6}"
+          mcast_port="${jgroups.mping.mcast_port:43366}"
+          ip_ttl="${jgroups.udp.ip_ttl:2}" 
+   />
+   <MERGE3 min_interval="10000" 
+           max_interval="30000" 
+   />
+   <FD_SOCK />
+   <FD_ALL timeout="60000" 
+           interval="15000" 
+           timeout_check_interval="5000" 
+   />
+   <VERIFY_SUSPECT timeout="5000" />
+   <pbcast.NAKACK2 use_mcast_xmit="false"
+                   xmit_interval="100"
+                   xmit_table_num_rows="50"
+                   xmit_table_msgs_per_row="1024"
+                   xmit_table_max_compaction_time="30000"
+                   resend_last_seqno="true"
+   />
+   <UNICAST3 xmit_interval="100"
+             xmit_table_num_rows="50"
+             xmit_table_msgs_per_row="1024"
+             xmit_table_max_compaction_time="30000"
+             conn_expiry_timeout="0"
+   />
+   <pbcast.STABLE stability_delay="500"
+                  desired_avg_gossip="5000"
+                  max_bytes="1M"
+   />
+   <pbcast.GMS print_local_addr="false"
+               install_view_locally_first="true"
+               join_timeout="${jgroups.join_timeout:5000}"
+   />
+   <MFC max_credits="2m" 
+        min_threshold="0.40"
+   />
+   <FRAG3/>
+</config>
index a854133..4672247 100644 (file)
@@ -23,7 +23,7 @@
 
 <infinispan xmlns="urn:infinispan:config:8.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:infinispan:config:8.0 http://infinispan.org/schemas/infinispan-config-8.0.xsd">
        <jgroups>
-               <stack-file name="external-file" path="default-configs/default-jgroups-tcp.xml" />
+               <stack-file name="external-file" path="infinispan/default-jgroups-tcp.xml" />
        </jgroups>
 
        <cache-container name="ApexCacheContainer" default-cache="TestContext_0.0.1">