2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2024 Nordix Foundation.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.drools.core.lock;
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.assertj.core.api.Assertions.assertThatCode;
26 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
27 import static org.assertj.core.api.Assertions.assertThatThrownBy;
28 import static org.junit.jupiter.api.Assertions.assertEquals;
29 import static org.junit.jupiter.api.Assertions.assertFalse;
30 import static org.junit.jupiter.api.Assertions.assertNotNull;
31 import static org.junit.jupiter.api.Assertions.assertNull;
32 import static org.junit.jupiter.api.Assertions.assertSame;
33 import static org.junit.jupiter.api.Assertions.assertTrue;
34 import static org.mockito.ArgumentMatchers.any;
35 import static org.mockito.Mockito.doThrow;
36 import static org.mockito.Mockito.mock;
37 import static org.mockito.Mockito.never;
38 import static org.mockito.Mockito.verify;
40 import java.io.ByteArrayInputStream;
41 import java.io.ByteArrayOutputStream;
42 import java.io.ObjectInputStream;
43 import java.io.ObjectOutputStream;
44 import org.junit.jupiter.api.BeforeEach;
45 import org.junit.jupiter.api.Test;
48 private static final LockState STATE = LockState.WAITING;
49 private static final String RESOURCE = "hello";
50 private static final String OWNER_KEY = "world";
51 private static final int HOLD_SEC = 10;
52 private static final int HOLD_SEC2 = 20;
53 private static final String EXPECTED_EXCEPTION = "expected exception";
55 private LockCallback callback;
56 private LockImpl lock;
59 * Populates {@link #lock}.
63 callback = mock(LockCallback.class);
65 lock = new LockImpl(STATE, RESOURCE, OWNER_KEY, HOLD_SEC, callback);
69 void testSerializable() throws Exception {
70 ByteArrayOutputStream baos = new ByteArrayOutputStream();
71 try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
72 oos.writeObject(lock);
75 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
76 try (ObjectInputStream ois = new ObjectInputStream(bais)) {
77 lock = (LockImpl) ois.readObject();
80 assertEquals(STATE, lock.getState());
81 assertEquals(RESOURCE, lock.getResourceId());
82 assertEquals(OWNER_KEY, lock.getOwnerKey());
83 assertEquals(HOLD_SEC, lock.getHoldSec());
85 // these fields are transient
86 assertNull(lock.getCallback());
90 void testLockImplNoArgs() {
91 // use no-arg constructor
92 lock = new LockImpl();
93 assertEquals(LockState.UNAVAILABLE, lock.getState());
94 assertNull(lock.getResourceId());
95 assertNull(lock.getOwnerKey());
96 assertNull(lock.getCallback());
97 assertEquals(0, lock.getHoldSec());
101 void testLockImpl_testGetters() {
102 assertEquals(STATE, lock.getState());
103 assertEquals(RESOURCE, lock.getResourceId());
104 assertEquals(OWNER_KEY, lock.getOwnerKey());
105 assertSame(callback, lock.getCallback());
106 assertEquals(HOLD_SEC, lock.getHoldSec());
109 assertThatThrownBy(() -> new LockImpl(null, RESOURCE, OWNER_KEY, HOLD_SEC, callback))
110 .hasMessageContaining("state");
111 assertThatThrownBy(() -> new LockImpl(STATE, null, OWNER_KEY, HOLD_SEC, callback))
112 .hasMessageContaining("resourceId");
113 assertThatThrownBy(() -> new LockImpl(STATE, RESOURCE, null, HOLD_SEC, callback))
114 .hasMessageContaining("ownerKey");
115 assertThatIllegalArgumentException().isThrownBy(() -> new LockImpl(STATE, RESOURCE, OWNER_KEY, -1, callback))
116 .withMessageContaining("holdSec");
117 assertThatThrownBy(() -> new LockImpl(STATE, RESOURCE, OWNER_KEY, HOLD_SEC, null))
118 .hasMessageContaining("callback");
123 assertTrue(lock.free());
124 assertTrue(lock.isUnavailable());
126 // should fail this time
127 assertFalse(lock.free());
128 assertTrue(lock.isUnavailable());
130 // no call-backs should have been invoked
131 verify(callback, never()).lockAvailable(any());
132 verify(callback, never()).lockUnavailable(any());
137 lock.setState(LockState.WAITING);
139 LockCallback callback2 = mock(LockCallback.class);
140 lock.extend(HOLD_SEC2, callback2);
141 assertTrue(lock.isActive());
142 assertEquals(HOLD_SEC2, lock.getHoldSec());
143 assertSame(callback2, lock.getCallback());
144 verify(callback2).lockAvailable(lock);
145 verify(callback2, never()).lockUnavailable(any());
147 // first call-back should never have been invoked
148 verify(callback, never()).lockAvailable(any());
149 verify(callback, never()).lockUnavailable(any());
152 LockCallback callback3 = mock(LockCallback.class);
153 lock.extend(HOLD_SEC, callback3);
154 assertEquals(HOLD_SEC, lock.getHoldSec());
155 assertSame(callback3, lock.getCallback());
156 assertTrue(lock.isActive());
157 verify(callback3).lockAvailable(lock);
158 verify(callback3, never()).lockUnavailable(any());
160 // other call-backs should not have been invoked again
161 verify(callback, never()).lockAvailable(any());
162 verify(callback, never()).lockUnavailable(any());
164 verify(callback2).lockAvailable(any());
165 verify(callback2, never()).lockUnavailable(any());
167 assertTrue(lock.free());
169 // extend after free - should fail
170 lock.extend(HOLD_SEC2, callback);
171 assertTrue(lock.isUnavailable());
173 // call-backs should not have been invoked again
174 verify(callback, never()).lockAvailable(any());
175 verify(callback, never()).lockUnavailable(any());
177 verify(callback2).lockAvailable(any());
178 verify(callback2, never()).lockUnavailable(any());
180 verify(callback3).lockAvailable(lock);
181 verify(callback3, never()).lockUnavailable(any());
185 void testNotifyAvailable() {
186 lock.notifyAvailable();
188 verify(callback).lockAvailable(any());
189 verify(callback, never()).lockUnavailable(any());
193 void testNotifyAvailable_Ex() {
194 doThrow(new IllegalArgumentException(EXPECTED_EXCEPTION)).when(callback).lockAvailable(any());
195 doThrow(new IllegalArgumentException(EXPECTED_EXCEPTION)).when(callback).lockUnavailable(any());
197 // should not throw an exception
198 assertThatCode(() -> lock.notifyAvailable()).doesNotThrowAnyException();
202 void testNotifyUnavailable() {
203 lock.notifyUnavailable();
205 verify(callback, never()).lockAvailable(any());
206 verify(callback).lockUnavailable(any());
210 void testNotifyUnavailable_Ex() {
211 doThrow(new IllegalArgumentException(EXPECTED_EXCEPTION)).when(callback).lockAvailable(any());
212 doThrow(new IllegalArgumentException(EXPECTED_EXCEPTION)).when(callback).lockUnavailable(any());
214 // should not throw an exception
215 assertThatCode(() -> lock.notifyUnavailable()).doesNotThrowAnyException();
219 void testSetState_testIsActive_testIsWaiting_testIsUnavailable() {
220 lock.setState(LockState.WAITING);
221 assertEquals(LockState.WAITING, lock.getState());
222 assertFalse(lock.isActive());
223 assertFalse(lock.isUnavailable());
224 assertTrue(lock.isWaiting());
226 lock.setState(LockState.ACTIVE);
227 assertEquals(LockState.ACTIVE, lock.getState());
228 assertTrue(lock.isActive());
229 assertFalse(lock.isUnavailable());
230 assertFalse(lock.isWaiting());
232 lock.setState(LockState.UNAVAILABLE);
233 assertEquals(LockState.UNAVAILABLE, lock.getState());
234 assertFalse(lock.isActive());
235 assertTrue(lock.isUnavailable());
236 assertFalse(lock.isWaiting());
240 void testSetHoldSec() {
241 assertEquals(HOLD_SEC, lock.getHoldSec());
243 lock.setHoldSec(HOLD_SEC2);
244 assertEquals(HOLD_SEC2, lock.getHoldSec());
248 void testSetCallback() {
249 assertSame(callback, lock.getCallback());
251 LockCallback callback2 = mock(LockCallback.class);
252 lock.setCallback(callback2);
253 assertSame(callback2, lock.getCallback());
257 void testToString() {
258 String text = lock.toString();
261 assertThat(text).doesNotContain("ownerInfo").doesNotContain("callback").doesNotContain("succeed");