#include "test.h"
#include "../cpio.h"
#include "err.h"
#if !defined(_WIN32)
#define ROOT "root"
static const int root_uids[] = { 0 };
static const int root_gids[] = { 0, 1 };
#elif defined(__CYGWIN__)
#define ROOT "Administrator"
static const int root_uids[] = { 500 };
static const int root_gids[] = { 513, 545, 544 };
#endif
#if defined(ROOT)
static int
int_in_list(int i, const int *l, size_t n)
{
while (n-- > 0)
if (*l++ == i)
return (1);
failure("%d", i);
return (0);
}
static void
free_cpio_owner(struct cpio_owner *owner) {
owner->uid = -1;
owner->gid = -1;
free(owner->uname);
free(owner->gname);
}
#endif
DEFINE_TEST(test_owner_parse)
{
#if !defined(ROOT)
skipping("No uid/gid configuration for this OS");
#else
struct cpio_owner owner;
const char *errstr;
assert(0 == owner_parse(ROOT, &owner, &errstr));
assert(int_in_list(owner.uid, root_uids,
sizeof(root_uids)/sizeof(root_uids[0])));
assertEqualInt(-1, owner.gid);
free_cpio_owner(&owner);
assert(0 == owner_parse(ROOT ":", &owner, &errstr));
assert(int_in_list(owner.uid, root_uids,
sizeof(root_uids)/sizeof(root_uids[0])));
assert(int_in_list(owner.gid, root_gids,
sizeof(root_gids)/sizeof(root_gids[0])));
free_cpio_owner(&owner);
assert(0 == owner_parse(ROOT ".", &owner, &errstr));
assert(int_in_list(owner.uid, root_uids,
sizeof(root_uids)/sizeof(root_uids[0])));
assert(int_in_list(owner.gid, root_gids,
sizeof(root_gids)/sizeof(root_gids[0])));
free_cpio_owner(&owner);
assert(0 == owner_parse("111", &owner, &errstr));
assertEqualInt(111, owner.uid);
assertEqualInt(-1, owner.gid);
free_cpio_owner(&owner);
assert(0 == owner_parse("112:", &owner, &errstr));
assertEqualInt(112, owner.uid);
free_cpio_owner(&owner);
assert(0 == owner_parse("113.", &owner, &errstr));
assertEqualInt(113, owner.uid);
free_cpio_owner(&owner);
assert(0 == owner_parse(":114", &owner, &errstr));
assertEqualInt(-1, owner.uid);
assertEqualInt(114, owner.gid);
free_cpio_owner(&owner);
assert(0 == owner_parse(".115", &owner, &errstr));
assertEqualInt(-1, owner.uid);
assertEqualInt(115, owner.gid);
free_cpio_owner(&owner);
assert(0 == owner_parse("116:117", &owner, &errstr));
assertEqualInt(116, owner.uid);
assertEqualInt(117, owner.gid);
free_cpio_owner(&owner);
errstr = NULL;
assert(0 != owner_parse(":nonexistentgroup", &owner, &errstr));
assertEqualString(errstr, "Couldn't lookup group ``nonexistentgroup''");
free_cpio_owner(&owner);
errstr = NULL;
assert(0 != owner_parse(ROOT ":nonexistentgroup", &owner, &errstr));
assertEqualString(errstr, "Couldn't lookup group ``nonexistentgroup''");
free_cpio_owner(&owner);
errstr = NULL;
assert(0 != owner_parse("nonexistentuser:nonexistentgroup", &owner,
&errstr));
assertEqualString(errstr, "Couldn't lookup user ``nonexistentuser''");
free_cpio_owner(&owner);
#endif
}