Skip to content

Commit 37f17a0

Browse files
committed
Added test for the LOCK and UNLOCK methods [v2]
1 parent b43ba41 commit 37f17a0

18 files changed

+525
-28
lines changed

test/v2/tests.ts/lockUnlock/.createFiles.ts

Lines changed: 131 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,123 @@ export interface Lock
1212
root : string
1313
}
1414

15+
export function methodTesterNotBlocking(info : TestInfo, isValid : TestCallback, callbackLocked : (port : number, user2 : string, cb : () => void) => void) : void
16+
{
17+
const server1 = info.init(3);
18+
19+
starter(server1, info, isValid, 'folder/folder2/folder3/folder4/file', 0, true, (lock, user1, user2) => {
20+
callbackLocked(server1.options.port, user2, () => {
21+
isValid(true);
22+
})
23+
})
24+
25+
const server2 = info.startServer();
26+
starter(server2, info, isValid, 'folder', -1, true, (lock, user1, user2) => {
27+
callbackLocked(server2.options.port, user2, () => {
28+
isValid(true);
29+
})
30+
})
31+
32+
const server3 = info.startServer();
33+
starter(server3, info, isValid, 'folder/folder2/folder3/folder4', 1, true, (lock, user1, user2) => {
34+
callbackLocked(server3.options.port, user2, () => {
35+
isValid(true);
36+
})
37+
})
38+
}
39+
40+
export function methodTesterBlocking(info : TestInfo, isValid : TestCallback, callbackLocked : (port : number, user1 : string, user2 : string, cb : () => void) => void, callbackUnlocked ?: (port : number, user2 : string) => void, isFolder ?: boolean) : void
41+
{
42+
isFolder = isFolder === undefined ? false : isFolder;
43+
44+
const server1 = info.init(2 + (isFolder ? 0 : 1));
45+
46+
if(!isFolder)
47+
{
48+
starter(server1, info, isValid, 'folder/folder2/folder3/folder4/file', 0, true, (lock, user1, user2) => {
49+
callbackLocked(server1.options.port, user1, user2, () => {
50+
if(!callbackUnlocked)
51+
return isValid(true);
52+
53+
unlockResource(server1, info, isValid, user1, 'folder/folder2/folder3/folder4/file', lock.uuid, () => {
54+
callbackUnlocked(server1.options.port, user2);
55+
})
56+
})
57+
})
58+
}
59+
60+
const server2 = info.startServer();
61+
starter(server2, info, isValid, 'folder', -1, true, (lock, user1, user2) => {
62+
callbackLocked(server2.options.port, user1, user2, () => {
63+
if(!callbackUnlocked)
64+
return isValid(true);
65+
66+
unlockResource(server2, info, isValid, user1, 'folder', lock.uuid, () => {
67+
callbackUnlocked(server2.options.port, user2);
68+
})
69+
})
70+
})
71+
72+
const server3 = info.startServer();
73+
starter(server3, info, isValid, 'folder/folder2/folder3/folder4', 1, true, (lock, user1, user2) => {
74+
callbackLocked(server3.options.port, user1, user2, () => {
75+
if(!callbackUnlocked)
76+
return isValid(true);
77+
78+
unlockResource(server3, info, isValid, user1, 'folder/folder2/folder3/folder4', lock.uuid, () => {
79+
callbackUnlocked(server3.options.port, user2);
80+
})
81+
})
82+
})
83+
}
84+
85+
export function unlockResource(
86+
server : v2.WebDAVServer,
87+
info : TestInfo,
88+
isValid : TestCallback,
89+
user : string,
90+
pathNameToUnlock : string,
91+
lockToken : string,
92+
callback : () => void) : void
93+
export function unlockResource(
94+
server : v2.WebDAVServer,
95+
info : TestInfo,
96+
isValid : TestCallback,
97+
user : string,
98+
pathNameToUnlock : string,
99+
lockToken : string,
100+
expectedResponseCode : number,
101+
callback : () => void) : void
102+
export function unlockResource(
103+
server : v2.WebDAVServer,
104+
info : TestInfo,
105+
isValid : TestCallback,
106+
user : string,
107+
pathNameToUnlock : string,
108+
lockToken : string,
109+
_expectedResponseCode : number | (() => void),
110+
_callback ?: () => void) : void
111+
{
112+
const expectedResponseCode = _callback ? _expectedResponseCode as number : v2.HTTPCodes.NoContent;
113+
const callback = _callback ? _callback : _expectedResponseCode as () => void;
114+
115+
info.req({
116+
url: 'http://localhost:' + server.options.port + '/' + pathNameToUnlock,
117+
method: 'UNLOCK',
118+
headers: {
119+
'Lock-Token': '<' + lockToken + '>',
120+
Authorization: 'Basic ' + user
121+
}
122+
}, expectedResponseCode, () => {
123+
callback();
124+
})
125+
}
126+
15127
export function lockResource(
16128
server : v2.WebDAVServer,
17129
info : TestInfo,
18130
isValid : TestCallback,
131+
user : string,
19132
pathNameToLock : string,
20133
depth : number,
21134
isExclusive : boolean,
@@ -24,6 +137,7 @@ export function lockResource(
24137
server : v2.WebDAVServer,
25138
info : TestInfo,
26139
isValid : TestCallback,
140+
user : string,
27141
pathNameToLock : string,
28142
depth : number,
29143
isExclusive : boolean,
@@ -33,6 +147,7 @@ export function lockResource(
33147
server : v2.WebDAVServer,
34148
info : TestInfo,
35149
isValid : TestCallback,
150+
user : string,
36151
pathNameToLock : string,
37152
depth : number,
38153
isExclusive : boolean,
@@ -46,7 +161,8 @@ export function lockResource(
46161
url: 'http://localhost:' + server.options.port + '/' + pathNameToLock,
47162
method: 'LOCK',
48163
headers: {
49-
depth: depth === -1 ? 'Infinity' : depth.toString()
164+
Depth: depth === -1 ? 'Infinity' : depth.toString(),
165+
Authorization: 'Basic ' + user
50166
},
51167
body: '<?xml version="1.0" encoding="utf-8" ?><D:lockinfo xmlns:D="DAV:"><D:lockscope><D:' + (isExclusive ? 'exclusive' : 'shared') + '/></D:lockscope><D:locktype><D:write/></D:locktype><D:owner><D:href>http://example.org/~ejw/contact.html</D:href></D:owner></D:lockinfo>'
52168
}, expectedResponseCode, (res, xml) => {
@@ -102,7 +218,7 @@ export function starter(
102218
pathNameToLock : string,
103219
depth : number,
104220
isExclusive : boolean,
105-
callback : (lock : Lock) => void) : void
221+
callback : (lock : Lock, user1 : string, user2 : string) => void) : void
106222
export function starter(
107223
server : v2.WebDAVServer,
108224
info : TestInfo,
@@ -111,21 +227,26 @@ export function starter(
111227
depth : number,
112228
isExclusive : boolean,
113229
expectedResponseCode : number,
114-
callback : (lock : Lock) => void) : void
230+
callback : (lock : Lock, user1 : string, user2 : string) => void) : void
115231
export function starter(
116232
server : v2.WebDAVServer,
117233
info : TestInfo,
118234
isValid : TestCallback,
119235
pathNameToLock : string,
120236
depth : number,
121237
isExclusive : boolean,
122-
_expectedResponseCode : number | ((lock : Lock) => void),
123-
_callback ?: (lock : Lock) => void) : void
238+
_expectedResponseCode : number | ((lock : Lock, user1 : string, user2 : string) => void),
239+
_callback ?: (lock : Lock, user1 : string, user2 : string) => void) : void
124240
{
125241
const expectedResponseCode = _callback ? _expectedResponseCode as number : v2.HTTPCodes.OK;
126-
const callback = _callback ? _callback : _expectedResponseCode as (lock : Lock) => void;
242+
const callback = _callback ? _callback : _expectedResponseCode as (lock : Lock, user1 : string, user2 : string) => void;
127243

128-
server.rootFileSystem().addSubTree(info.ctx, {
244+
const um = new v2.SimpleUserManager();
245+
um.addUser('user1', 'password1'); // dXNlcjE6cGFzc3dvcmQx
246+
um.addUser('user2', 'password2'); // dXNlcjI6cGFzc3dvcmQy
247+
server.httpAuthentication = new v2.HTTPBasicAuthentication(um, 'Test realm');
248+
server.options.httpAuthentication = server.httpAuthentication;
249+
server.rootFileSystem().addSubTree(v2.RequestContext.createExternal(server), {
129250
'folder': {
130251
'folder2': {
131252
'folder3': {
@@ -141,6 +262,8 @@ export function starter(
141262
}, (e) => {
142263
if(e) return isValid(false, 'Cannot call "addSubTree(...)".', e);
143264

144-
lockResource(server, info, isValid, pathNameToLock, depth, isExclusive, expectedResponseCode, callback);
265+
lockResource(server, info, isValid, 'dXNlcjE6cGFzc3dvcmQx', pathNameToLock, depth, isExclusive, expectedResponseCode, (lock) => {
266+
callback(lock, 'dXNlcjE6cGFzc3dvcmQx', 'dXNlcjI6cGFzc3dvcmQy');
267+
});
145268
})
146269
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { Test } from '../Type'
2+
import { v2 } from '../../../../lib/index.js'
3+
import { methodTesterBlocking } from './.createFiles'
4+
5+
export default ((info, isValid) =>
6+
{
7+
methodTesterBlocking(info, isValid, (port, user1, user2, cb) => {
8+
info.req({
9+
url: 'http://localhost:' + port + '/folder/folder2/folder3/folder4/file',
10+
method: 'DELETE',
11+
headers: {
12+
Authorization: 'Basic ' + user2
13+
}
14+
}, v2.HTTPCodes.Locked, () => {
15+
info.req({
16+
url: 'http://localhost:' + port + '/folder/folder2/folder3/folder4/file',
17+
method: 'DELETE',
18+
headers: {
19+
Authorization: 'Basic ' + user1
20+
}
21+
}, v2.HTTPCodes.OK, () => {
22+
cb();
23+
})
24+
})
25+
})
26+
27+
}) as Test;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { Test } from '../Type'
2+
import { v2 } from '../../../../lib/index.js'
3+
import { methodTesterBlocking } from './.createFiles'
4+
5+
export default ((info, isValid) =>
6+
{
7+
methodTesterBlocking(info, isValid, (port, user1, user2, cb) => {
8+
info.req({
9+
url: 'http://localhost:' + port + '/file',
10+
method: 'COPY',
11+
headers: {
12+
Authorization: 'Basic ' + user2,
13+
Destination: '/folder/folder2/folder3/folder4/file',
14+
Overwrite: 'T'
15+
}
16+
}, v2.HTTPCodes.Locked, () => {
17+
info.req({
18+
url: 'http://localhost:' + port + '/file',
19+
method: 'COPY',
20+
headers: {
21+
Authorization: 'Basic ' + user1,
22+
Destination: '/folder/folder2/folder3/folder4/file',
23+
Overwrite: 'T'
24+
}
25+
}, v2.HTTPCodes.NoContent, () => {
26+
cb();
27+
})
28+
})
29+
})
30+
31+
}) as Test;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { Test } from '../Type'
2+
import { v2 } from '../../../../lib/index.js'
3+
import { methodTesterBlocking } from './.createFiles'
4+
5+
export default ((info, isValid) =>
6+
{
7+
methodTesterBlocking(info, isValid, (port, user1, user2, cb) => {
8+
info.req({
9+
url: 'http://localhost:' + port + '/file',
10+
method: 'MOVE',
11+
headers: {
12+
Authorization: 'Basic ' + user2,
13+
Destination: '/folder/folder2/folder3/folder4/file',
14+
Overwrite: 'T'
15+
}
16+
}, v2.HTTPCodes.Locked, () => {
17+
info.req({
18+
url: 'http://localhost:' + port + '/file',
19+
method: 'MOVE',
20+
headers: {
21+
Authorization: 'Basic ' + user1,
22+
Destination: '/folder/folder2/folder3/folder4/file',
23+
Overwrite: 'T'
24+
}
25+
}, v2.HTTPCodes.NoContent, () => {
26+
cb();
27+
})
28+
})
29+
})
30+
31+
}) as Test;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Test } from '../Type'
2+
import { v2 } from '../../../../lib/index.js'
3+
import { methodTesterNotBlocking } from './.createFiles'
4+
5+
export default ((info, isValid) =>
6+
{
7+
methodTesterNotBlocking(info, isValid, (port, user2, cb) => {
8+
info.req({
9+
url: 'http://localhost:' + port + '/folder/folder2/folder3/folder4/file',
10+
method: 'GET',
11+
headers: {
12+
Authorization: 'Basic ' + user2
13+
}
14+
}, v2.HTTPCodes.OK, () => {
15+
cb();
16+
})
17+
})
18+
19+
}) as Test;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Test } from '../Type'
2+
import { v2 } from '../../../../lib/index.js'
3+
import { methodTesterNotBlocking } from './.createFiles'
4+
5+
export default ((info, isValid) =>
6+
{
7+
methodTesterNotBlocking(info, isValid, (port, user2, cb) => {
8+
info.req({
9+
url: 'http://localhost:' + port + '/folder/folder2/folder3/folder4/file',
10+
method: 'HEAD',
11+
headers: {
12+
Authorization: 'Basic ' + user2
13+
}
14+
}, v2.HTTPCodes.OK, () => {
15+
cb();
16+
})
17+
})
18+
19+
}) as Test;
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { Test } from '../Type'
2+
import { v2 } from '../../../../lib/index.js'
3+
import { methodTesterBlocking } from './.createFiles'
4+
5+
export default ((info, isValid) =>
6+
{
7+
methodTesterBlocking(info, isValid, (port, user1, user2, cb) => {
8+
info.req({
9+
url: 'http://localhost:' + port + '/folder/folder2/folder3/folder4/folderX',
10+
method: 'MKCOL',
11+
headers: {
12+
Authorization: 'Basic ' + user2
13+
}
14+
}, v2.HTTPCodes.Locked, () => {
15+
info.req({
16+
url: 'http://localhost:' + port + '/folder/folder2/folder3/folder4/folderX',
17+
method: 'MKCOL',
18+
headers: {
19+
Authorization: 'Basic ' + user1
20+
}
21+
}, v2.HTTPCodes.Created, () => {
22+
cb();
23+
})
24+
})
25+
}, (port, user2) => {
26+
info.req({
27+
url: 'http://localhost:' + port + '/folder/folder2/folder3/folder4/folderX2',
28+
method: 'MKCOL',
29+
headers: {
30+
Authorization: 'Basic ' + user2
31+
}
32+
}, v2.HTTPCodes.Created, () => {
33+
isValid(true);
34+
})
35+
}, true)
36+
37+
}) as Test;

0 commit comments

Comments
 (0)