blob: 6ede36afbd61799f971729b5dd643944a5a5cf71 [file] [log] [blame]
package jnr.posix;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import jnr.constants.platform.LangInfo;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
*/
public class GroupTest {
public GroupTest() {
}
private static POSIX posix;
@BeforeClass
public static void setUpClass() throws Exception {
posix = POSIXFactory.getPOSIX(new DummyPOSIXHandler(), true);
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
// TODO add test methods here.
// The methods must be annotated with annotation @Test. For example:
//
// @Test
// public void hello() {}
@Test
public void getgrnam() {
if (jnr.ffi.Platform.getNativePlatform().isUnix()) {
final String LOGIN = "daemon";
Group grp = posix.getgrnam(LOGIN);
assertNotNull(grp);
assertEquals("Login name not equal", LOGIN, grp.getName());
}
}
@Test
public void nonExistantGroupReturnsNull() {
if (jnr.ffi.Platform.getNativePlatform().isUnix()) {
final String LOGIN = "dkjhfjkdsfhjksdhfsdjkhfsdkjhfdskj";
assertNull("getpwnam for non-existant group should return null", posix.getgrnam(LOGIN));
}
}
@Test
public void getgrent() {
if (jnr.ffi.Platform.getNativePlatform().isUnix()) {
ArrayList<Group> grps = new ArrayList<Group>();
while (true) {
Group grp = posix.getgrent();
if (grp == null) {
break;
}
grps.add(grp);
}
for (Group grp : grps) {
assertNotNull(grp.getName());
assertNotNull(grp.getPassword());
assertNotNull(grp.getGID());
for (String member : grp.getMembers()) {
assertNotNull(member);
}
}
}
}
@Test
public void getgroups() throws Throwable {
if (jnr.ffi.Platform.getNativePlatform().isUnix()) {
String[] groupIdsAsStrings = exec("id", "-G").split(" ");
long[] expectedGroupIds = new long[groupIdsAsStrings.length];
for (int i = 0; i < groupIdsAsStrings.length; i++) {
expectedGroupIds[i] = Long.parseLong(groupIdsAsStrings[i]);
}
long[] actualGroupIds = posix.getgroups();
// getgroups does not specify whether the effective group ID is included along with the supplementary
// group IDs. However, `id -G` always includes all group IDs. So, we must do something of a fuzzy match.
// If the actual list is shorter than the expected list by 1, alter the expected list by removing the
// effective group ID before comparing the two arrays.
if (actualGroupIds.length == expectedGroupIds.length - 1) {
long effectiveGroupId = Long.parseLong(exec("id", "-g"));
expectedGroupIds = removeElement(expectedGroupIds, effectiveGroupId);
}
Arrays.sort(expectedGroupIds);
Arrays.sort(actualGroupIds);
assertArrayEquals(expectedGroupIds, actualGroupIds);
}
}
private String exec(String... command) throws IOException {
InputStreamReader isr = null;
BufferedReader reader = null;
try {
isr = new InputStreamReader(Runtime.getRuntime().exec(command).getInputStream());
reader = new BufferedReader(isr);
return reader.readLine();
} finally {
if (reader != null) {
reader.close();
}
if (isr != null) {
isr.close();
}
}
}
private long[] removeElement(long[] array, long value) {
for (int i = 0; i < array.length; i++) {
if (array[i] == value) {
long[] ret = new long[array.length - 1];
System.arraycopy(array, 0, ret, 0, i);
System.arraycopy(array, i + 1, ret, i, array.length - i - 1);
return ret;
}
}
return array;
}
}