@@ -127,6 +127,37 @@ fn test_setgroups() {
127
127
setgroups ( & old_groups) . unwrap ( ) ;
128
128
}
129
129
130
+ #[ test]
131
+ // `getgroups()` and `setgroups()` do not behave as expected on Apple platforms
132
+ #[ cfg( not( any( target_os = "ios" , target_os = "macos" ) ) ) ]
133
+ fn test_initgroups ( ) {
134
+ // Skip this test when not run as root as `initgroups()` and `setgroups()`
135
+ // require root.
136
+ if !Uid :: current ( ) . is_root ( ) {
137
+ return
138
+ }
139
+
140
+ // Save the existing groups
141
+ let old_groups = getgroups ( ) . unwrap ( ) ;
142
+
143
+ // It doesn't matter if the root user is not called "root" or if a user
144
+ // called "root" doesn't exist. We are just checking that the extra,
145
+ // made-up group, `123`, is set.
146
+ // FIXME: This only tests half of initgroups' functionality.
147
+ let user = CString :: new ( "root" ) . unwrap ( ) ;
148
+ let group = Gid :: from_raw ( 123 ) ;
149
+ let group_list = getgrouplist ( & user, group) . unwrap ( ) ;
150
+ assert ! ( group_list. contains( & group) ) ;
151
+
152
+ initgroups ( & user, group) . unwrap ( ) ;
153
+
154
+ let new_groups = getgroups ( ) . unwrap ( ) ;
155
+ assert_eq ! ( new_groups, group_list) ;
156
+
157
+ // Revert back to the old groups
158
+ setgroups ( & old_groups) . unwrap ( ) ;
159
+ }
160
+
130
161
macro_rules! execve_test_factory(
131
162
( $test_name: ident, $syscall: ident, $exe: expr) => (
132
163
#[ test]
0 commit comments