@@ -11,15 +11,16 @@ See the License for the specific language governing permissions and
11
11
limitations under the License.
12
12
*/
13
13
14
+ import { randomUUID } from "crypto" ;
14
15
import {
15
16
CommunicationProtocolEnum ,
16
17
DaprClient ,
17
18
LogLevel ,
18
19
StateConcurrencyEnum ,
19
20
StateConsistencyEnum ,
20
21
} from "../../../src" ;
21
- import { describe , expect , it } from "@jest/globals" ;
22
22
import { sleep } from "../../../src/utils/NodeJS.util" ;
23
+ import { LockStatus } from "../../../src/types/lock/UnlockResponse" ;
23
24
24
25
const daprHost = "127.0.0.1" ;
25
26
const daprGrpcPort = "50000" ;
@@ -150,6 +151,74 @@ describe("common/client", () => {
150
151
} ) ;
151
152
} ) ;
152
153
154
+ describe ( "distributed lock" , ( ) => {
155
+ runIt ( "should be able to acquire a new lock and unlock" , async ( client : DaprClient ) => {
156
+ const resourceId = randomUUID ( ) ;
157
+ const lock = await client . lock . lock ( "redislock" , resourceId , "owner1" , 1000 ) ;
158
+ expect ( lock . success ) . toEqual ( true ) ;
159
+ const unlock = await client . lock . unlock ( "redislock" , resourceId , "owner1" ) ;
160
+ expect ( unlock . status ) . toEqual ( LockStatus . Success ) ;
161
+ } ) ;
162
+
163
+ runIt ( "should be not be able to unlock when the lock is not acquired" , async ( client : DaprClient ) => {
164
+ const resourceId = randomUUID ( ) ;
165
+ const unlock = await client . lock . unlock ( "redislock" , resourceId , "owner1" ) ;
166
+ expect ( unlock . status ) . toEqual ( LockStatus . LockDoesNotExist ) ;
167
+ } ) ;
168
+
169
+ runIt ( "should be able to acquire a lock after the previous lock is expired" , async ( client : DaprClient ) => {
170
+ const resourceId = randomUUID ( ) ;
171
+ let lock = await client . lock . lock ( "redislock" , resourceId , "owner1" , 5 ) ;
172
+ expect ( lock . success ) . toEqual ( true ) ;
173
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 2000 ) ) ;
174
+ lock = await client . lock . lock ( "redislock" , resourceId , "owner2" , 5 ) ;
175
+ expect ( lock . success ) . toEqual ( false ) ;
176
+ } ) ;
177
+
178
+ runIt (
179
+ "should not be able to acquire a lock when the same lock is acquired by another owner" ,
180
+ async ( client : DaprClient ) => {
181
+ const resourceId = randomUUID ( ) ;
182
+ const lockOne = await client . lock . lock ( "redislock" , resourceId , "owner1" , 5 ) ;
183
+ expect ( lockOne . success ) . toEqual ( true ) ;
184
+ const lockTwo = await client . lock . lock ( "redislock" , resourceId , "owner2" , 5 ) ;
185
+ expect ( lockTwo . success ) . toEqual ( false ) ;
186
+ } ,
187
+ ) ;
188
+
189
+ runIt (
190
+ "should be able to acquire a lock when a different lock is acquired by another owner" ,
191
+ async ( client : DaprClient ) => {
192
+ const lockOne = await client . lock . lock ( "redislock" , randomUUID ( ) , "owner1" , 5 ) ;
193
+ expect ( lockOne . success ) . toEqual ( true ) ;
194
+ const lockTwo = await client . lock . lock ( "redislock" , randomUUID ( ) , "owner2" , 5 ) ;
195
+ expect ( lockTwo . success ) . toEqual ( true ) ;
196
+ } ,
197
+ ) ;
198
+
199
+ runIt (
200
+ "should not be able to acquire a lock when that lock is acquired by another owner/process" ,
201
+ async ( client : DaprClient ) => {
202
+ const resourceId = randomUUID ( ) ;
203
+ const lockOne = await client . lock . lock ( "redislock" , resourceId , "owner3" , 5 ) ;
204
+ expect ( lockOne . success ) . toEqual ( true ) ;
205
+ const lockTwo = await client . lock . lock ( "redislock" , resourceId , "owner4" , 5 ) ;
206
+ expect ( lockTwo . success ) . toEqual ( false ) ;
207
+ } ,
208
+ ) ;
209
+
210
+ runIt (
211
+ "should not be able to unlock a lock when that lock is acquired by another owner/process" ,
212
+ async ( client : DaprClient ) => {
213
+ const resourceId = randomUUID ( ) ;
214
+ const lockOne = await client . lock . lock ( "redislock" , resourceId , "owner5" , 5 ) ;
215
+ expect ( lockOne . success ) . toEqual ( true ) ;
216
+ const unlock = await client . lock . unlock ( "redislock" , resourceId , "owner6" ) ;
217
+ expect ( unlock . status ) . toEqual ( LockStatus . LockBelongsToOthers ) ;
218
+ } ,
219
+ ) ;
220
+ } ) ;
221
+
153
222
describe ( "state" , ( ) => {
154
223
const stateStoreName = "state-redis" ;
155
224
const stateStoreMongoDbName = "state-mongodb" ;
0 commit comments