Skip to content

Commit 7f23c16

Browse files
committed
tests/unlink: add tests for unlinking keyrings and keys
1 parent 4331397 commit 7f23c16

File tree

3 files changed

+257
-57
lines changed

3 files changed

+257
-57
lines changed

src/api.rs

-57
Original file line numberDiff line numberDiff line change
@@ -1002,61 +1002,4 @@ mod tests {
10021002
new_keyring.invalidate().unwrap();
10031003
keyring.invalidate().unwrap();
10041004
}
1005-
1006-
#[test]
1007-
fn test_unlink_keyring() {
1008-
let mut keyring = utils::new_test_keyring();
1009-
1010-
// Create the keyring.
1011-
let description = "test:rust-keyutils:unlink_keyring";
1012-
let new_keyring = keyring.add_keyring(description).unwrap();
1013-
1014-
let (keys, keyrings) = keyring.read().unwrap();
1015-
assert_eq!(keys.len(), 0);
1016-
assert_eq!(keyrings.len(), 1);
1017-
1018-
// Unlink the key.
1019-
keyring.unlink_keyring(&new_keyring).unwrap();
1020-
1021-
// Use the keyring.
1022-
let err = new_keyring.read().unwrap_err();
1023-
assert_eq!(err.0, libc::EACCES);
1024-
1025-
let (keys, keyrings) = keyring.read().unwrap();
1026-
assert_eq!(keys.len(), 0);
1027-
assert_eq!(keyrings.len(), 0);
1028-
1029-
// Clean up.
1030-
keyring.invalidate().unwrap();
1031-
}
1032-
1033-
#[test]
1034-
fn test_unlink_key() {
1035-
let mut keyring = utils::new_test_keyring();
1036-
1037-
// Create the key.
1038-
let description = "test:rust-keyutils:unlink_key";
1039-
let payload = "payload";
1040-
let key = keyring
1041-
.add_key::<keytypes::User, _, _>(description, payload.as_bytes())
1042-
.unwrap();
1043-
1044-
let (keys, keyrings) = keyring.read().unwrap();
1045-
assert_eq!(keys.len(), 1);
1046-
assert_eq!(keyrings.len(), 0);
1047-
1048-
// Unlink the key.
1049-
keyring.unlink_key(&key).unwrap();
1050-
1051-
// Use the key.
1052-
let err = key.read().unwrap_err();
1053-
assert_eq!(err.0, libc::EACCES);
1054-
1055-
let (keys, keyrings) = keyring.read().unwrap();
1056-
assert_eq!(keys.len(), 0);
1057-
assert_eq!(keyrings.len(), 0);
1058-
1059-
// Clean up.
1060-
keyring.invalidate().unwrap();
1061-
}
10621005
}

src/tests/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,5 @@ mod reading;
3939
mod revoke;
4040
mod session;
4141
mod timeout;
42+
mod unlink;
4243
mod update;

src/tests/unlink.rs

+256
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
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+
29+
use super::utils;
30+
31+
#[test]
32+
fn invalid_target_key() {
33+
let mut invalid_keyring = utils::invalid_keyring();
34+
let mut keyring = utils::new_test_keyring();
35+
let payload = "payload".as_bytes();
36+
let key = keyring
37+
.add_key::<User, _, _>("invalid_target_key", payload)
38+
.unwrap();
39+
40+
let err = invalid_keyring.unlink_key(&key).unwrap_err();
41+
assert_eq!(err, errno::Errno(libc::EINVAL));
42+
43+
keyring.invalidate().unwrap();
44+
}
45+
46+
#[test]
47+
fn invalid_target_keyring() {
48+
let mut invalid_keyring = utils::invalid_keyring();
49+
let keyring = utils::new_test_keyring();
50+
51+
let err = invalid_keyring.unlink_keyring(&keyring).unwrap_err();
52+
assert_eq!(err, errno::Errno(libc::EINVAL));
53+
54+
keyring.invalidate().unwrap();
55+
}
56+
57+
#[test]
58+
fn invalid_source_key() {
59+
let mut keyring = utils::new_test_keyring();
60+
let invalid_key = utils::invalid_key();
61+
62+
let err = keyring.unlink_key(&invalid_key).unwrap_err();
63+
assert_eq!(err, errno::Errno(libc::EINVAL));
64+
65+
keyring.invalidate().unwrap();
66+
}
67+
68+
#[test]
69+
fn invalid_source_keyring() {
70+
let mut keyring = utils::new_test_keyring();
71+
let invalid_keyring = utils::invalid_keyring();
72+
73+
let err = keyring.unlink_keyring(&invalid_keyring).unwrap_err();
74+
assert_eq!(err, errno::Errno(libc::EINVAL));
75+
76+
keyring.invalidate().unwrap();
77+
}
78+
79+
#[test]
80+
fn unlink_key_from_non_keyring() {
81+
let mut keyring = utils::new_test_keyring();
82+
let payload = "payload".as_bytes();
83+
let key = keyring
84+
.add_key::<User, _, _>("unlink_key_from_non_keyring", payload)
85+
.unwrap();
86+
let mut not_a_keyring = utils::key_as_keyring(&key);
87+
88+
let err = not_a_keyring.unlink_key(&key).unwrap_err();
89+
assert_eq!(err, errno::Errno(libc::ENOTDIR));
90+
91+
keyring.invalidate().unwrap();
92+
}
93+
94+
#[test]
95+
fn unlink_keyring_from_non_keyring() {
96+
let mut keyring = utils::new_test_keyring();
97+
let payload = "payload".as_bytes();
98+
let key = keyring
99+
.add_key::<User, _, _>("unlink_keyring_from_non_keyring", payload)
100+
.unwrap();
101+
let mut not_a_keyring = utils::key_as_keyring(&key);
102+
103+
let err = not_a_keyring.unlink_keyring(&keyring).unwrap_err();
104+
assert_eq!(err, errno::Errno(libc::ENOTDIR));
105+
106+
keyring.invalidate().unwrap();
107+
}
108+
109+
#[test]
110+
fn unlink_key_as_keyring() {
111+
let mut keyring = utils::new_test_keyring();
112+
let payload = "payload".as_bytes();
113+
let key = keyring
114+
.add_key::<User, _, _>("unlink_keyring_from_non_keyring", payload)
115+
.unwrap();
116+
let not_a_keyring = utils::key_as_keyring(&key);
117+
118+
// This is OK because the kernel doesn't have the type knowledge that our API does.
119+
keyring.unlink_keyring(&not_a_keyring).unwrap();
120+
121+
keyring.invalidate().unwrap();
122+
}
123+
124+
#[test]
125+
fn unlink_keyring_as_key() {
126+
let mut keyring = utils::new_test_keyring();
127+
let new_keyring = keyring.add_keyring("unlink_keyring_as_key").unwrap();
128+
let not_a_key = utils::keyring_as_key(&new_keyring);
129+
130+
// This is OK because the kernel doesn't have the type knowledge that our API does.
131+
keyring.unlink_key(&not_a_key).unwrap();
132+
133+
keyring.invalidate().unwrap();
134+
}
135+
136+
#[test]
137+
fn unlink_unlinked_key() {
138+
let mut keyring = utils::new_test_keyring();
139+
let payload = "payload".as_bytes();
140+
let key = keyring
141+
.add_key::<User, _, _>("unlink_unlinked_key", payload)
142+
.unwrap();
143+
144+
keyring.unlink_key(&key).unwrap();
145+
utils::wait_for_key_gc(&key);
146+
147+
let err = keyring.unlink_key(&key).unwrap_err();
148+
assert_eq!(err, errno::Errno(libc::ENOKEY));
149+
150+
keyring.invalidate().unwrap();
151+
}
152+
153+
#[test]
154+
fn unlink_unlinked_keyring() {
155+
let mut keyring = utils::new_test_keyring();
156+
let new_keyring = keyring.add_keyring("unlink_unlinked_keyring").unwrap();
157+
158+
keyring.unlink_keyring(&new_keyring).unwrap();
159+
utils::wait_for_keyring_gc(&new_keyring);
160+
161+
let err = keyring.unlink_keyring(&new_keyring).unwrap_err();
162+
assert_eq!(err, errno::Errno(libc::ENOKEY));
163+
164+
keyring.invalidate().unwrap();
165+
}
166+
167+
#[test]
168+
fn unlink_key_from_unlinked_keyring() {
169+
let mut keyring = utils::new_test_keyring();
170+
let mut keyring_observer = keyring.clone();
171+
let payload = "payload".as_bytes();
172+
let key = keyring
173+
.add_key::<User, _, _>("unlink_key_from_unlinked_keyring", payload)
174+
.unwrap();
175+
176+
keyring.invalidate().unwrap();
177+
utils::wait_for_keyring_gc(&keyring_observer);
178+
179+
let err = keyring_observer.unlink_key(&key).unwrap_err();
180+
assert_eq!(err, errno::Errno(libc::ENOKEY));
181+
}
182+
183+
#[test]
184+
fn unlink_keyring_from_unlinked_keyring() {
185+
let mut keyring = utils::new_test_keyring();
186+
let mut keyring_observer = keyring.clone();
187+
let new_keyring = keyring.add_keyring("unlink_from_unlinked_keyring").unwrap();
188+
189+
keyring.invalidate().unwrap();
190+
utils::wait_for_keyring_gc(&keyring_observer);
191+
192+
let err = keyring_observer.unlink_keyring(&new_keyring).unwrap_err();
193+
assert_eq!(err, errno::Errno(libc::ENOKEY));
194+
}
195+
196+
#[test]
197+
fn unlink_unassociated_key() {
198+
let mut keyring = utils::new_test_keyring();
199+
let mut new_keyring = keyring.add_keyring("unlink_unassociated_key").unwrap();
200+
let payload = "payload".as_bytes();
201+
let key = keyring
202+
.add_key::<User, _, _>("unlink_unassociated_key", payload)
203+
.unwrap();
204+
205+
let err = new_keyring.unlink_key(&key).unwrap_err();
206+
assert_eq!(err, errno::Errno(libc::ENOENT));
207+
208+
keyring.invalidate().unwrap();
209+
}
210+
211+
#[test]
212+
fn unlink_unassociated_keyring() {
213+
let mut keyring = utils::new_test_keyring();
214+
let mut new_keyring = keyring.add_keyring("unlink_unassociated_keyring").unwrap();
215+
let inner_keyring = keyring
216+
.add_keyring("unlink_unassociated_keyring_keyring")
217+
.unwrap();
218+
219+
let err = new_keyring.unlink_keyring(&inner_keyring).unwrap_err();
220+
assert_eq!(err, errno::Errno(libc::ENOENT));
221+
222+
keyring.invalidate().unwrap();
223+
}
224+
225+
#[test]
226+
fn unlink_key() {
227+
let mut keyring = utils::new_test_keyring();
228+
let payload = "payload".as_bytes();
229+
let key = keyring
230+
.add_key::<User, _, _>("unlink_unlinked_key", payload)
231+
.unwrap();
232+
233+
keyring.unlink_key(&key).unwrap();
234+
utils::wait_for_key_gc(&key);
235+
236+
let (keys, keyrings) = keyring.read().unwrap();
237+
assert!(keys.is_empty());
238+
assert!(keyrings.is_empty());
239+
240+
keyring.invalidate().unwrap();
241+
}
242+
243+
#[test]
244+
fn unlink_keyring() {
245+
let mut keyring = utils::new_test_keyring();
246+
let new_keyring = keyring.add_keyring("unlink_keyring").unwrap();
247+
248+
keyring.unlink_keyring(&new_keyring).unwrap();
249+
utils::wait_for_keyring_gc(&new_keyring);
250+
251+
let (keys, keyrings) = keyring.read().unwrap();
252+
assert!(keys.is_empty());
253+
assert!(keyrings.is_empty());
254+
255+
keyring.invalidate().unwrap();
256+
}

0 commit comments

Comments
 (0)