Skip to content

Commit 4331397

Browse files
committed
tests/link: add tests for link behavior
1 parent d1111c9 commit 4331397

File tree

3 files changed

+324
-25
lines changed

3 files changed

+324
-25
lines changed

src/api.rs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -897,31 +897,6 @@ mod tests {
897897
use super::*;
898898
use crate::tests::utils;
899899

900-
#[test]
901-
fn test_link_key() {
902-
let mut keyring = utils::new_test_keyring();
903-
let mut new_keyring = keyring.add_keyring("new_keyring").unwrap();
904-
905-
// Create the key.
906-
let description = "test:rust-keyutils:link_key";
907-
let payload = "payload";
908-
let key = keyring
909-
.add_key::<keytypes::User, _, _>(description, payload.as_bytes())
910-
.unwrap();
911-
912-
new_keyring.link_key(&key).unwrap();
913-
914-
let (keys, keyrings) = new_keyring.read().unwrap();
915-
assert_eq!(keys.len(), 1);
916-
assert_eq!(keys[0], key);
917-
assert_eq!(keyrings.len(), 0);
918-
919-
// Clean up.
920-
key.invalidate().unwrap();
921-
new_keyring.invalidate().unwrap();
922-
keyring.invalidate().unwrap();
923-
}
924-
925900
#[test]
926901
fn test_link_keyring() {
927902
let mut keyring = utils::new_test_keyring();

src/tests/link.rs

Lines changed: 323 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,323 @@
1+
// Copyright (c) 2019, Ben Boeckel
2+
// All rights reserved.
3+
//
4+
// Redistribution and use in source and binary forms, with or without modification,
5+
// are permitted provided that the following conditions are met:
6+
//
7+
// * Redistributions of source code must retain the above copyright notice,
8+
// this list of conditions and the following disclaimer.
9+
// * Redistributions in binary form must reproduce the above copyright notice,
10+
// this list of conditions and the following disclaimer in the documentation
11+
// and/or other materials provided with the distribution.
12+
// * Neither the name of this project nor the names of its contributors
13+
// may be used to endorse or promote products derived from this software
14+
// without specific prior written permission.
15+
//
16+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17+
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18+
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19+
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20+
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21+
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22+
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23+
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25+
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26+
27+
use crate::keytypes::User;
28+
use crate::Permission;
29+
30+
use super::utils;
31+
32+
#[test]
33+
fn invalid_target() {
34+
let mut invalid_keyring = utils::invalid_keyring();
35+
let keyring = utils::new_test_keyring();
36+
37+
let err = invalid_keyring.link_keyring(&keyring).unwrap_err();
38+
assert_eq!(err, errno::Errno(libc::EINVAL));
39+
40+
keyring.invalidate().unwrap();
41+
}
42+
43+
#[test]
44+
fn invalid_source() {
45+
let invalid_keyring = utils::invalid_keyring();
46+
let mut keyring = utils::new_test_keyring();
47+
48+
let err = keyring.link_keyring(&invalid_keyring).unwrap_err();
49+
assert_eq!(err, errno::Errno(libc::EINVAL));
50+
51+
keyring.invalidate().unwrap();
52+
}
53+
54+
#[test]
55+
fn link_to_non_keyring() {
56+
let mut keyring = utils::new_test_keyring();
57+
let payload = "payload".as_bytes();
58+
let key = keyring
59+
.add_key::<User, _, _>("link_to_non_keyring", payload)
60+
.unwrap();
61+
let linked_key = keyring
62+
.add_key::<User, _, _>("link_to_non_keyring_linked", payload)
63+
.unwrap();
64+
let mut not_a_keyring = utils::key_as_keyring(&key);
65+
66+
let err = not_a_keyring.link_key(&linked_key).unwrap_err();
67+
assert_eq!(err, errno::Errno(libc::ENOTDIR));
68+
69+
keyring.invalidate().unwrap();
70+
}
71+
72+
#[test]
73+
fn link_unlinked_key() {
74+
let mut keyring = utils::new_test_keyring();
75+
let payload = "payload".as_bytes();
76+
let key = keyring
77+
.add_key::<User, _, _>("link_unlinked_key", payload)
78+
.unwrap();
79+
let mut target_keyring = keyring.add_keyring("link_unlinked_key_target").unwrap();
80+
81+
keyring.unlink_key(&key).unwrap();
82+
utils::wait_for_key_gc(&key);
83+
84+
let err = target_keyring.link_key(&key).unwrap_err();
85+
assert_eq!(err, errno::Errno(libc::ENOKEY));
86+
87+
keyring.invalidate().unwrap();
88+
}
89+
90+
#[test]
91+
fn link_into_unlinked_keyring() {
92+
let mut keyring = utils::new_test_keyring();
93+
let payload = "payload".as_bytes();
94+
let key = keyring
95+
.add_key::<User, _, _>("link_into_unlinked_keyring", payload)
96+
.unwrap();
97+
let mut target_keyring = keyring
98+
.add_keyring("link_into_unlinked_keyring_target")
99+
.unwrap();
100+
101+
keyring.unlink_keyring(&target_keyring).unwrap();
102+
utils::wait_for_keyring_gc(&target_keyring);
103+
104+
let err = target_keyring.link_key(&key).unwrap_err();
105+
assert_eq!(err, errno::Errno(libc::ENOKEY));
106+
107+
keyring.invalidate().unwrap();
108+
}
109+
110+
#[test]
111+
fn link_self() {
112+
let mut keyring = utils::new_test_keyring();
113+
let keyring_observer = keyring.clone();
114+
115+
let err = keyring.link_keyring(&keyring_observer).unwrap_err();
116+
assert_eq!(err, errno::Errno(libc::EDEADLK));
117+
118+
keyring.invalidate().unwrap();
119+
}
120+
121+
#[test]
122+
fn link_self_via_child() {
123+
let mut keyring = utils::new_test_keyring();
124+
let mut target_keyring = keyring.add_keyring("link_self_via_child").unwrap();
125+
126+
let err = target_keyring.link_keyring(&keyring).unwrap_err();
127+
assert_eq!(err, errno::Errno(libc::EDEADLK));
128+
129+
keyring.invalidate().unwrap();
130+
}
131+
132+
#[test]
133+
fn link_self_via_child_chains() {
134+
let mut keyring = utils::new_test_keyring();
135+
let mut target_keyring = keyring.clone();
136+
let perms = Permission::POSSESSOR_ALL | Permission::USER_ALL;
137+
target_keyring.set_permissions(perms).unwrap();
138+
139+
let maxdepth = 8;
140+
for depth in 1..maxdepth {
141+
let mut new_keyring = keyring
142+
.add_keyring(format!("link_self_via_child_chains{}", depth))
143+
.unwrap();
144+
new_keyring.set_permissions(perms).unwrap();
145+
146+
target_keyring.link_keyring(&new_keyring).unwrap();
147+
target_keyring = new_keyring;
148+
149+
let err = target_keyring.link_keyring(&keyring).unwrap_err();
150+
assert_eq!(err, errno::Errno(libc::EDEADLK));
151+
}
152+
153+
let mut new_keyring = keyring
154+
.add_keyring(format!("link_self_via_child_chains{}", maxdepth))
155+
.unwrap();
156+
new_keyring.set_permissions(perms).unwrap();
157+
158+
target_keyring.link_keyring(&new_keyring).unwrap();
159+
keyring.unlink_keyring(&new_keyring).unwrap();
160+
target_keyring = new_keyring;
161+
162+
let err = target_keyring.link_keyring(&keyring).unwrap_err();
163+
assert_eq!(err, errno::Errno(libc::ELOOP));
164+
165+
keyring.invalidate().unwrap();
166+
}
167+
168+
#[test]
169+
fn link_self_via_keyring_stacks() {
170+
let mut keyring = utils::new_test_keyring();
171+
let keyring_a_root = keyring
172+
.add_keyring("link_self_via_keyring_stacks_a")
173+
.unwrap();
174+
let keyring_b_root = keyring
175+
.add_keyring("link_self_via_keyring_stacks_b")
176+
.unwrap();
177+
let mut keyring_a = keyring_a_root.clone();
178+
let mut keyring_b = keyring_b_root.clone();
179+
180+
let maxdepth = 4;
181+
for depth in 1..maxdepth {
182+
keyring_a = keyring_a
183+
.add_keyring(format!("link_self_via_keyring_stacks_a{}", depth))
184+
.unwrap();
185+
keyring_b = keyring_b
186+
.add_keyring(format!("link_self_via_keyring_stacks_b{}", depth))
187+
.unwrap();
188+
}
189+
190+
keyring_b.link_keyring(&keyring_a_root).unwrap();
191+
192+
let err = keyring_a.link_keyring(&keyring_b_root).unwrap_err();
193+
assert_eq!(err, errno::Errno(libc::EDEADLK));
194+
195+
keyring_b.unlink_keyring(&keyring_a_root).unwrap();
196+
197+
keyring_a.link_keyring(&keyring_b_root).unwrap();
198+
199+
let err = keyring_b.link_keyring(&keyring_a_root).unwrap_err();
200+
assert_eq!(err, errno::Errno(libc::EDEADLK));
201+
202+
keyring.invalidate().unwrap();
203+
}
204+
205+
#[test]
206+
fn link_self_via_keyring_deep_stacks() {
207+
let mut keyring = utils::new_test_keyring();
208+
let keyring_a_root = keyring
209+
.add_keyring("link_self_via_keyring_deep_stacks_a")
210+
.unwrap();
211+
let keyring_b_root = keyring
212+
.add_keyring("link_self_via_keyring_deep_stacks_b")
213+
.unwrap();
214+
let mut keyring_a = keyring_a_root.clone();
215+
let mut keyring_b = keyring_b_root.clone();
216+
217+
let maxdepth = 5;
218+
for depth in 1..maxdepth {
219+
keyring_a = keyring_a
220+
.add_keyring(format!("link_self_via_keyring_deep_stacks_a{}", depth))
221+
.unwrap();
222+
keyring_b = keyring_b
223+
.add_keyring(format!("link_self_via_keyring_deep_stacks_b{}", depth))
224+
.unwrap();
225+
}
226+
227+
keyring_b.link_keyring(&keyring_a_root).unwrap();
228+
229+
let err = keyring_a.link_keyring(&keyring_b_root).unwrap_err();
230+
assert_eq!(err, errno::Errno(libc::ELOOP));
231+
232+
keyring_b.unlink_keyring(&keyring_a_root).unwrap();
233+
234+
keyring_a.link_keyring(&keyring_b_root).unwrap();
235+
236+
let err = keyring_b.link_keyring(&keyring_a_root).unwrap_err();
237+
assert_eq!(err, errno::Errno(libc::ELOOP));
238+
239+
keyring.invalidate().unwrap();
240+
}
241+
242+
#[test]
243+
fn multiply_link_key_into_keyring() {
244+
let mut keyring = utils::new_test_keyring();
245+
let mut new_keyring = keyring
246+
.add_keyring("multiply_link_key_into_keyring")
247+
.unwrap();
248+
249+
let (keys, keyrings) = keyring.read().unwrap();
250+
assert!(keys.is_empty());
251+
assert_eq!(keyrings.len(), 1);
252+
assert_eq!(keyrings[0], new_keyring);
253+
254+
let payload = "payload".as_bytes();
255+
let key = new_keyring
256+
.add_key::<User, _, _>("multiply_link_key_into_keyring_key", payload)
257+
.unwrap();
258+
259+
let (keys, keyrings) = new_keyring.read().unwrap();
260+
assert_eq!(keys.len(), 1);
261+
assert_eq!(keys[0], key);
262+
assert!(keyrings.is_empty());
263+
264+
keyring.link_key(&key).unwrap();
265+
266+
let (keys, keyrings) = keyring.read().unwrap();
267+
assert_eq!(keys.len(), 1);
268+
assert_eq!(keys[0], key);
269+
assert_eq!(keyrings.len(), 1);
270+
assert_eq!(keyrings[0], new_keyring);
271+
272+
// Linking the same key should not change the result.
273+
keyring.link_key(&key).unwrap();
274+
275+
let (keys, keyrings) = keyring.read().unwrap();
276+
assert_eq!(keys.len(), 1);
277+
assert_eq!(keys[0], key);
278+
assert_eq!(keyrings.len(), 1);
279+
assert_eq!(keyrings[0], new_keyring);
280+
281+
keyring.invalidate().unwrap();
282+
}
283+
284+
#[test]
285+
fn multiply_link_keyring_into_keyring() {
286+
let mut keyring = utils::new_test_keyring();
287+
let mut new_keyring = keyring
288+
.add_keyring("multiply_link_keyring_into_keyring")
289+
.unwrap();
290+
291+
let (keys, keyrings) = keyring.read().unwrap();
292+
assert!(keys.is_empty());
293+
assert_eq!(keyrings.len(), 1);
294+
assert_eq!(keyrings[0], new_keyring);
295+
296+
let inner_keyring = new_keyring
297+
.add_keyring("multiply_link_keyring_into_keyring_keyring_inner")
298+
.unwrap();
299+
300+
let (keys, keyrings) = new_keyring.read().unwrap();
301+
assert!(keys.is_empty());
302+
assert_eq!(keyrings.len(), 1);
303+
assert_eq!(keyrings[0], inner_keyring);
304+
305+
keyring.link_keyring(&inner_keyring).unwrap();
306+
307+
let (keys, keyrings) = keyring.read().unwrap();
308+
assert!(keys.is_empty());
309+
assert_eq!(keyrings.len(), 2);
310+
assert_eq!(keyrings[0], new_keyring);
311+
assert_eq!(keyrings[1], inner_keyring);
312+
313+
// Linking the same keyring should not change the result.
314+
keyring.link_keyring(&inner_keyring).unwrap();
315+
316+
let (keys, keyrings) = keyring.read().unwrap();
317+
assert!(keys.is_empty());
318+
assert_eq!(keyrings.len(), 2);
319+
assert_eq!(keyrings[0], new_keyring);
320+
assert_eq!(keyrings[1], inner_keyring);
321+
322+
keyring.invalidate().unwrap();
323+
}

src/tests/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ mod clear;
3333
mod describe;
3434
mod instantiate;
3535
mod invalidate;
36+
mod link;
3637
mod newring;
3738
mod reading;
3839
mod revoke;

0 commit comments

Comments
 (0)