add no locking feature 77/118977/5
authorjhh <jorge.hernandez-herrero@att.com>
Tue, 9 Mar 2021 16:01:17 +0000 (10:01 -0600)
committerjhh <jorge.hernandez-herrero@att.com>
Tue, 9 Mar 2021 21:03:32 +0000 (15:03 -0600)
It provides an interface to applications for locking
purposes that always succeeds.  It does not deny
acquiring resource locks.

Issue-ID: POLICY-3114
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
Change-Id: I6aebb5f40e4176e0ff7b0e6c6d4042a79dd0b7a3
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
14 files changed:
feature-no-locking/pom.xml [new file with mode: 0644]
feature-no-locking/src/assembly/assemble_zip.xml [new file with mode: 0644]
feature-no-locking/src/main/java/org/onap/policy/no/locking/NoLockManager.java [new file with mode: 0644]
feature-no-locking/src/main/resources/META-INF.services/org.onap.policy.drools.features.PolicyEngineFeatureApi [new file with mode: 0644]
feature-no-locking/src/test/java/org/onap/policy/no/locking/NoLockManagerTest.java [new file with mode: 0644]
packages/docker/src/main/docker/Dockerfile
packages/install/pom.xml
policy-core/pom.xml
policy-core/src/main/java/org/onap/policy/drools/core/lock/AlwaysSuccessLock.java [new file with mode: 0644]
policy-core/src/test/java/org/onap/policy/drools/core/lock/AlwaysFailLockTest.java
policy-core/src/test/java/org/onap/policy/drools/core/lock/AlwaysLockBaseTest.java [new file with mode: 0644]
policy-core/src/test/java/org/onap/policy/drools/core/lock/AlwaysSuccessLockTest.java [new file with mode: 0644]
policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngineManager.java
pom.xml

diff --git a/feature-no-locking/pom.xml b/feature-no-locking/pom.xml
new file mode 100644 (file)
index 0000000..202f3c1
--- /dev/null
@@ -0,0 +1,116 @@
+<!--
+  ============LICENSE_START=======================================================
+  ONAP
+  ================================================================================
+  Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  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.
+  ============LICENSE_END=========================================================
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onap.policy.drools-pdp</groupId>
+        <artifactId>drools-pdp</artifactId>
+        <version>1.8.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>feature-no-locking</artifactId>
+
+    <name>feature-no-locking</name>
+    <description>Loadable module that provides no locking capability</description>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>zipfile</id>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <phase>package</phase>
+                        <configuration>
+                            <attach>true</attach>
+                            <finalName>${project.artifactId}-${project.version}</finalName>
+                            <descriptors>
+                                <descriptor>src/assembly/assemble_zip.xml</descriptor>
+                            </descriptors>
+                            <appendAssemblyId>false</appendAssemblyId>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-dependencies</id>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <phase>prepare-package</phase>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/assembly/lib</outputDirectory>
+                            <overWriteReleases>false</overWriteReleases>
+                            <overWriteSnapshots>true</overWriteSnapshots>
+                            <overWriteIfNewer>true</overWriteIfNewer>
+                            <useRepositoryLayout>false</useRepositoryLayout>
+                            <addParentPoms>false</addParentPoms>
+                            <copyPom>false</copyPom>
+                            <includeScope>runtime</includeScope>
+                            <excludeTransitive>true</excludeTransitive>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.policy.drools-pdp</groupId>
+            <artifactId>policy-core</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.drools-pdp</groupId>
+            <artifactId>policy-management</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-api-mockito2</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/feature-no-locking/src/assembly/assemble_zip.xml b/feature-no-locking/src/assembly/assemble_zip.xml
new file mode 100644 (file)
index 0000000..2c74fc0
--- /dev/null
@@ -0,0 +1,76 @@
+<!--
+  ============LICENSE_START=======================================================
+  ONAP
+  ================================================================================
+  Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  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.
+  ============LICENSE_END=========================================================
+  -->
+
+<!-- Defines how we build the .zip file which is our distribution. -->
+
+<assembly
+        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+
+    <id>feature-no-locking</id>
+    <formats>
+        <format>zip</format>
+    </formats>
+
+    <includeBaseDirectory>false</includeBaseDirectory>
+
+    <fileSets>
+        <fileSet>
+            <directory>target</directory>
+            <outputDirectory>lib/feature</outputDirectory>
+            <includes>
+                <include>feature-no-locking-${project.version}.jar</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>target/assembly/lib</directory>
+            <outputDirectory>lib/dependencies</outputDirectory>
+            <includes>
+                <include>*.jar</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/feature/config</directory>
+            <outputDirectory>config</outputDirectory>
+            <fileMode>0644</fileMode>
+            <excludes/>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/feature/bin</directory>
+            <outputDirectory>bin</outputDirectory>
+            <fileMode>0744</fileMode>
+            <excludes/>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/feature/db</directory>
+            <outputDirectory>db</outputDirectory>
+            <fileMode>0744</fileMode>
+            <excludes/>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/feature/install</directory>
+            <outputDirectory>install</outputDirectory>
+            <fileMode>0744</fileMode>
+            <excludes/>
+        </fileSet>
+    </fileSets>
+
+</assembly>
\ No newline at end of file
diff --git a/feature-no-locking/src/main/java/org/onap/policy/no/locking/NoLockManager.java b/feature-no-locking/src/main/java/org/onap/policy/no/locking/NoLockManager.java
new file mode 100644 (file)
index 0000000..1fa4439
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.no.locking;
+
+import java.util.Properties;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import org.onap.policy.drools.core.lock.AlwaysSuccessLock;
+import org.onap.policy.drools.core.lock.Lock;
+import org.onap.policy.drools.core.lock.LockCallback;
+import org.onap.policy.drools.core.lock.PolicyResourceLockManager;
+import org.onap.policy.drools.features.PolicyEngineFeatureApi;
+import org.onap.policy.drools.system.PolicyEngine;
+
+/**
+ * In contrast with other implementations the no-lock manager provides non-synchronized access
+ * to resources.
+ */
+
+@NoArgsConstructor
+@ToString
+public class NoLockManager implements PolicyResourceLockManager, PolicyEngineFeatureApi {
+
+    protected static final int SEQNO = 2000;
+
+    @Override
+    public Lock createLock(String resourceId, String ownerKey, int holdSec,
+            LockCallback callback, boolean waitForLock) {
+        AlwaysSuccessLock successLock =  new AlwaysSuccessLock(resourceId, ownerKey, holdSec, callback);
+        successLock.notifyAvailable();
+        return successLock;
+    }
+
+    @Override
+    public boolean lock() {
+        return true;
+    }
+
+    @Override
+    public boolean unlock() {
+        return true;
+    }
+
+    @Override
+    public boolean isLocked() {
+        return false;
+    }
+
+    @Override
+    public boolean start() {
+        return true;
+    }
+
+    @Override
+    public boolean stop() {
+        return true;
+    }
+
+    @Override
+    public void shutdown() {
+        // nothing to do
+    }
+
+    @Override
+    public boolean isAlive() {
+        return true;
+    }
+
+    @Override
+    public int getSequenceNumber() {
+        return SEQNO;
+    }
+
+    @Override
+    public PolicyResourceLockManager beforeCreateLockManager(PolicyEngine engine, Properties properties) {
+        return this;
+    }
+}
diff --git a/feature-no-locking/src/main/resources/META-INF.services/org.onap.policy.drools.features.PolicyEngineFeatureApi b/feature-no-locking/src/main/resources/META-INF.services/org.onap.policy.drools.features.PolicyEngineFeatureApi
new file mode 100644 (file)
index 0000000..e8a5d79
--- /dev/null
@@ -0,0 +1 @@
+org.onap.policy.no.locking.NoLockManager
\ No newline at end of file
diff --git a/feature-no-locking/src/test/java/org/onap/policy/no/locking/NoLockManagerTest.java b/feature-no-locking/src/test/java/org/onap/policy/no/locking/NoLockManagerTest.java
new file mode 100644 (file)
index 0000000..bae9d10
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.no.locking;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.drools.core.lock.AlwaysSuccessLock;
+import org.onap.policy.drools.core.lock.Lock;
+import org.onap.policy.drools.core.lock.LockCallback;
+
+public class NoLockManagerTest {
+
+    private NoLockManager nlm;
+    private LockCallback callback;
+
+    @Before
+    public void setUp() {
+        callback = mock(LockCallback.class);
+        nlm = new NoLockManager();
+    }
+
+    @Test
+    public void testLock() {
+        assertTrue(nlm.lock());
+    }
+
+    @Test
+    public void testUnlock() {
+        assertTrue(nlm.unlock());
+    }
+
+    @Test
+    public void testIsLocked() {
+        assertFalse(nlm.isLocked());
+    }
+
+    @Test
+    public void testStart() {
+        assertTrue(nlm.start());
+    }
+
+    @Test
+    public void testStop() {
+        assertTrue(nlm.stop());
+    }
+
+    @Test
+    public void testIsAlive() {
+        assertTrue(nlm.isAlive());
+    }
+
+    @Test
+    public void testGetSeqNo() {
+        assertEquals(NoLockManager.SEQNO, nlm.getSequenceNumber());
+    }
+
+    @Test
+    public void testBeforeCreateLockManager() {
+        assertEquals(nlm, nlm.beforeCreateLockManager(null, null));
+    }
+
+    @Test
+    public void testCreateLock() {
+        Lock lock = nlm.createLock("x", "y", 1, callback, false);
+        assertTrue(lock.isActive());
+        assertTrue(lock instanceof AlwaysSuccessLock);
+        verify(callback).lockAvailable(lock);
+        verify(callback, never()).lockUnavailable(any());
+    }
+}
\ No newline at end of file
index 2277bc7..39d9ff0 100644 (file)
@@ -73,7 +73,7 @@ RUN unzip -o install-drools.zip && \
     chmod 600 $POLICY_HOME/config/* && \
     rm -f $POLICY_INSTALL/*.conf && \
     . $POLICY_HOME/etc/profile.d/env.sh && \
-    $POLICY_HOME/bin/features install healthcheck distributed-locking lifecycle && \
+    $POLICY_HOME/bin/features install healthcheck distributed-locking lifecycle no-locking && \
     $POLICY_HOME/bin/features enable lifecycle && \
     find $HOME/.m2/ -name _maven.repositories -exec rm -v {} \; && \
     find $HOME/.m2/ -name _remote.repositories -exec rm -v {} \; && \
index c16a9a5..e11718d 100644 (file)
             <version>${project.version}</version>
             <type>zip</type>
         </dependency>
+        <dependency>
+            <groupId>org.onap.policy.drools-pdp</groupId>
+            <artifactId>feature-no-locking</artifactId>
+            <version>${project.version}</version>
+            <type>zip</type>
+        </dependency>
     </dependencies>
 
 </project>
index af01bc9..33a9e12 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
   ============LICENSE_START=======================================================
-  ONAP Policy Engine - Drools PDP
+  ONAP
   ================================================================================
   Copyright (C) 2017-2021 AT&T Intellectual Property. All rights reserved.
   Modifications Copyright (C) 2019 Bell Canada.
                             <excludes>
                             </excludes>
                             <consoleOutput>true</consoleOutput>
-                            <failsOnViolation>true</failsOnViolation>
+                            <failOnViolation>true</failOnViolation>
                             <violationSeverity>warning</violationSeverity>
                         </configuration>
                     </execution>
diff --git a/policy-core/src/main/java/org/onap/policy/drools/core/lock/AlwaysSuccessLock.java b/policy-core/src/main/java/org/onap/policy/drools/core/lock/AlwaysSuccessLock.java
new file mode 100644 (file)
index 0000000..6b1e149
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.drools.core.lock;
+
+import lombok.NonNull;
+
+/**
+ * Lock implementation whose operations always succeed.
+ */
+public class AlwaysSuccessLock extends LockImpl {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Overrides parent constructor.
+     */
+    public AlwaysSuccessLock() {
+        setState(LockState.ACTIVE);
+    }
+
+    /**
+     * Overrides parent constructor.
+     */
+    public AlwaysSuccessLock(@NonNull LockState state, @NonNull String resourceId,
+            @NonNull String ownerKey, int holdSec, @NonNull LockCallback callback) {
+        super(state, resourceId, ownerKey, holdSec, callback);
+        if (!isActive()) {
+            throw new IllegalArgumentException("AlwaysSuccessLock can only be created in the active state");
+        }
+    }
+
+    /**
+     * Constructs the object.
+     */
+    public AlwaysSuccessLock(@NonNull String resourceId, @NonNull String ownerKey,
+            int holdSec, @NonNull LockCallback callback) {
+        super(LockState.ACTIVE, resourceId, ownerKey, holdSec, callback);
+    }
+
+    /**
+     * Always returns true.
+     */
+    @Override
+    public synchronized boolean free() {
+        return true;
+    }
+}
index 06489a5..178ef0a 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 package org.onap.policy.drools.core.lock;
 
 import static org.assertj.core.api.Assertions.assertThatCode;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
 import org.junit.Before;
 import org.junit.Test;
 
-public class AlwaysFailLockTest {
-    private static final String RESOURCE = "hello";
-    private static final String OWNER_KEY = "world";
-    private static final int HOLD_SEC = 10;
-    private static final int HOLD_SEC2 = 10;
+public class AlwaysFailLockTest extends AlwaysLockBaseTest<AlwaysFailLock> {
 
-    private LockCallback callback;
-    private AlwaysFailLock lock;
-
-    /**
-     * Populates {@link #lock}.
-     */
     @Before
     public void setUp() {
         callback = mock(LockCallback.class);
-
         lock = new AlwaysFailLock(RESOURCE, OWNER_KEY, HOLD_SEC, callback);
     }
 
-    @Test
-    public void testSerializable() throws Exception {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
-            oos.writeObject(lock);
-        }
-
-        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-        try (ObjectInputStream ois = new ObjectInputStream(bais)) {
-            lock = (AlwaysFailLock) ois.readObject();
-        }
-
-        assertEquals(LockState.UNAVAILABLE, lock.getState());
-        assertEquals(RESOURCE, lock.getResourceId());
-        assertEquals(OWNER_KEY, lock.getOwnerKey());
-        assertEquals(HOLD_SEC, lock.getHoldSec());
-
-        // these fields are transient
-        assertNull(lock.getCallback());
-    }
-
     @Test
     public void testAlwaysFailLockNoArgs() {
-        // verify that no-arg constructor doesn't throw an exception
-        assertThatCode(() -> new AlwaysFailLock()).doesNotThrowAnyException();
+        assertThatCode(AlwaysFailLock::new).doesNotThrowAnyException();
     }
 
     @Test
-    public void testAlwaysFailLock() {
+    public void testUnavailableLock() {
         assertTrue(lock.isUnavailable());
-        assertEquals(RESOURCE, lock.getResourceId());
-        assertEquals(OWNER_KEY, lock.getOwnerKey());
-        assertEquals(HOLD_SEC, lock.getHoldSec());
-        assertSame(callback, lock.getCallback());
     }
 
     @Test
@@ -95,13 +51,4 @@ public class AlwaysFailLockTest {
         assertFalse(lock.free());
         assertTrue(lock.isUnavailable());
     }
-
-    @Test
-    public void testExtend() {
-        LockCallback callback2 = mock(LockCallback.class);
-        lock.extend(HOLD_SEC2, callback2);
-
-        assertEquals(HOLD_SEC2, lock.getHoldSec());
-        assertSame(callback2, lock.getCallback());
-    }
 }
diff --git a/policy-core/src/test/java/org/onap/policy/drools/core/lock/AlwaysLockBaseTest.java b/policy-core/src/test/java/org/onap/policy/drools/core/lock/AlwaysLockBaseTest.java
new file mode 100644 (file)
index 0000000..1091b26
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.drools.core.lock;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import org.junit.Test;
+
+public abstract class AlwaysLockBaseTest<T extends LockImpl> {
+    protected static final String RESOURCE = "hello";
+    protected static final String OWNER_KEY = "world";
+    protected static final int HOLD_SEC = 10;
+    protected static final int HOLD_SEC2 = 10;
+
+    protected LockCallback callback;
+    protected T lock;
+
+    @Test
+    public void testSerializable() throws Exception {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
+            oos.writeObject(lock);
+        }
+
+        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+        T lock2;
+        try (ObjectInputStream ois = new ObjectInputStream(bais)) {
+            lock2 = (T) ois.readObject();
+        }
+
+        assertEquals(lock.getState(), lock2.getState());
+        assertEquals(lock.getResourceId(), lock2.getResourceId());
+        assertEquals(lock.getOwnerKey(), lock2.getOwnerKey());
+        assertEquals(lock.getHoldSec(), lock2.getHoldSec());
+
+        // these fields are transient
+        assertNull(lock2.getCallback());
+    }
+
+    @Test
+    public void testAlwaysLockData() {
+        assertEquals(RESOURCE, lock.getResourceId());
+        assertEquals(OWNER_KEY, lock.getOwnerKey());
+        assertEquals(HOLD_SEC, lock.getHoldSec());
+        assertSame(callback, lock.getCallback());
+    }
+}
diff --git a/policy-core/src/test/java/org/onap/policy/drools/core/lock/AlwaysSuccessLockTest.java b/policy-core/src/test/java/org/onap/policy/drools/core/lock/AlwaysSuccessLockTest.java
new file mode 100644 (file)
index 0000000..3288948
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.drools.core.lock;
+
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class AlwaysSuccessLockTest extends AlwaysLockBaseTest<AlwaysSuccessLock> {
+
+    @Before
+    public void setUp() {
+        callback = mock(LockCallback.class);
+        lock = new AlwaysSuccessLock(RESOURCE, OWNER_KEY, HOLD_SEC, callback);
+    }
+
+    @Test
+    public void testAlwaysSuccessLockConstructors() {
+        assertThatCode(AlwaysSuccessLock::new).doesNotThrowAnyException();
+        assertThatCode(() -> new AlwaysSuccessLock(LockState.ACTIVE, RESOURCE, OWNER_KEY, HOLD_SEC, callback))
+            .doesNotThrowAnyException();
+        assertThatIllegalArgumentException()
+            .isThrownBy(() -> new AlwaysSuccessLock(LockState.UNAVAILABLE, RESOURCE, OWNER_KEY, HOLD_SEC, callback));
+    }
+
+    @Test
+    public void testActiveLock() {
+        assertTrue(lock.isActive());
+    }
+
+    @Test
+    public void testFree() {
+        assertTrue(lock.free());
+        assertTrue(lock.isActive());
+    }
+
+    @Test
+    public void testExtend() {
+        LockCallback callback2 = mock(LockCallback.class);
+        lock.extend(HOLD_SEC2, callback2);
+
+        assertEquals(HOLD_SEC2, lock.getHoldSec());
+        assertSame(callback2, lock.getCallback());
+    }
+}
index 1b2c13a..25601c8 100644 (file)
@@ -290,6 +290,7 @@ class PolicyEngineManager implements PolicyEngine {
             try {
                 this.lockManager = feature.beforeCreateLockManager(this, properties);
                 if (this.lockManager != null) {
+                    logger.info("overridden lock manager is {}", this.lockManager);
                     return;
                 }
             } catch (RuntimeException e) {
@@ -305,6 +306,8 @@ class PolicyEngineManager implements PolicyEngine {
             this.lockManager = new SimpleLockManager(this, new Properties());
         }
 
+        logger.info("lock manager is {}", this.lockManager);
+
         /* policy-engine dispatch post operation hook */
         FeatureApiUtils.apply(getEngineProviders(),
             feature -> feature.afterCreateLockManager(this, properties, this.lockManager),
diff --git a/pom.xml b/pom.xml
index 3a16e85..fb9b2e7 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -74,6 +74,7 @@
         <module>feature-mdc-filters</module>
         <module>feature-lifecycle</module>
         <module>feature-drools-init</module>
+        <module>feature-no-locking</module>
         <module>packages</module>
     </modules>