~sergei.glushchenko/+junk/page-scan-hack

« back to all changes in this revision

Viewing changes to src/libarchive/cpio/test/test_owner_parse.c

merge parallel compression branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*-
 
2
 * Copyright (c) 2003-2009 Tim Kientzle
 
3
 * All rights reserved.
 
4
 *
 
5
 * Redistribution and use in source and binary forms, with or without
 
6
 * modification, are permitted provided that the following conditions
 
7
 * are met:
 
8
 * 1. Redistributions of source code must retain the above copyright
 
9
 *    notice, this list of conditions and the following disclaimer.
 
10
 * 2. Redistributions in binary form must reproduce the above copyright
 
11
 *    notice, this list of conditions and the following disclaimer in the
 
12
 *    documentation and/or other materials provided with the distribution.
 
13
 *
 
14
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
 
15
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 
16
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 
17
 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
 
18
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
19
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 
20
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 
21
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
22
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 
23
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
24
 */
 
25
#include "test.h"
 
26
__FBSDID("$FreeBSD$");
 
27
 
 
28
#include "../cpio.h"
 
29
#include "err.h"
 
30
 
 
31
#if !defined(_WIN32)
 
32
#define ROOT "root"
 
33
static int root_uids[] = { 0 };
 
34
/* Solaris 9 root has gid 1 (other) */
 
35
static int root_gids[] = { 0, 1 };
 
36
#elif defined(__CYGWIN__)
 
37
/* On cygwin, the Administrator user most likely exists (unless
 
38
 * it has been renamed or is in a non-English localization), but
 
39
 * its primary group membership depends on how the user set up
 
40
 * their /etc/passwd. Likely values are 513 (None), 545 (Users),
 
41
 * or 544 (Administrators). Just check for one of those...
 
42
 * TODO: Handle non-English localizations...e.g. French 'Administrateur'
 
43
 *       Use CreateWellKnownSID() and LookupAccountName()?
 
44
 */
 
45
#define ROOT "Administrator"
 
46
static int root_uids[] = { 500 };
 
47
static int root_gids[] = { 513, 545, 544 };
 
48
#endif
 
49
 
 
50
#if defined(ROOT)
 
51
static int
 
52
int_in_list(int i, int *l, size_t n)
 
53
{
 
54
        while (n-- > 0)
 
55
                if (*l++ == i)
 
56
                        return (1);
 
57
        failure("%d", i);
 
58
        return (0);
 
59
}
 
60
#endif
 
61
 
 
62
DEFINE_TEST(test_owner_parse)
 
63
{
 
64
#if !defined(ROOT)
 
65
        skipping("No uid/gid configuration for this OS");
 
66
#else
 
67
        int uid, gid;
 
68
 
 
69
        assert(NULL == owner_parse(ROOT, &uid, &gid));
 
70
        assert(int_in_list(uid, root_uids,
 
71
                sizeof(root_uids)/sizeof(root_uids[0])));
 
72
        assertEqualInt(-1, gid);
 
73
 
 
74
 
 
75
        assert(NULL == owner_parse(ROOT ":", &uid, &gid));
 
76
        assert(int_in_list(uid, root_uids,
 
77
                sizeof(root_uids)/sizeof(root_uids[0])));
 
78
        assert(int_in_list(gid, root_gids,
 
79
                sizeof(root_gids)/sizeof(root_gids[0])));
 
80
 
 
81
        assert(NULL == owner_parse(ROOT ".", &uid, &gid));
 
82
        assert(int_in_list(uid, root_uids,
 
83
                sizeof(root_uids)/sizeof(root_uids[0])));
 
84
        assert(int_in_list(gid, root_gids,
 
85
                sizeof(root_gids)/sizeof(root_gids[0])));
 
86
 
 
87
        assert(NULL == owner_parse("111", &uid, &gid));
 
88
        assertEqualInt(111, uid);
 
89
        assertEqualInt(-1, gid);
 
90
 
 
91
        assert(NULL == owner_parse("112:", &uid, &gid));
 
92
        assertEqualInt(112, uid);
 
93
        /* Can't assert gid, since we don't know gid for user #112. */
 
94
 
 
95
        assert(NULL == owner_parse("113.", &uid, &gid));
 
96
        assertEqualInt(113, uid);
 
97
        /* Can't assert gid, since we don't know gid for user #113. */
 
98
 
 
99
        assert(NULL == owner_parse(":114", &uid, &gid));
 
100
        assertEqualInt(-1, uid);
 
101
        assertEqualInt(114, gid);
 
102
 
 
103
        assert(NULL == owner_parse(".115", &uid, &gid));
 
104
        assertEqualInt(-1, uid);
 
105
        assertEqualInt(115, gid);
 
106
 
 
107
        assert(NULL == owner_parse("116:117", &uid, &gid));
 
108
        assertEqualInt(116, uid);
 
109
        assertEqualInt(117, gid);
 
110
 
 
111
        /*
 
112
         * TODO: Lookup current user/group name, build strings and
 
113
         * use those to verify username/groupname lookups for ordinary
 
114
         * users.
 
115
         */
 
116
 
 
117
        assert(NULL != owner_parse(":nonexistentgroup", &uid, &gid));
 
118
        assert(NULL != owner_parse(ROOT ":nonexistentgroup", &uid, &gid));
 
119
        assert(NULL !=
 
120
            owner_parse("nonexistentuser:nonexistentgroup", &uid, &gid));
 
121
#endif
 
122
}