aboutsummaryrefslogtreecommitdiff
path: root/tests/util/xmalloc-t
blob: b6c6dfdb261e4836f32a2c3949733d52ae6ccb41 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#! /bin/sh
#
# Test suite for xmalloc and friends.
#
# The canonical version of this file is maintained in the rra-c-util package,
# which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
#
# Written by Russ Allbery <rra@stanford.edu>
# Copyright 2000, 2001, 2006 Russ Allbery <rra@stanford.edu>
# Copyright 2008, 2009, 2010, 2012
#     The Board of Trustees of the Leland Stanford Junior University
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.

. "$SOURCE/tap/libtap.sh"
cd "$BUILD/util"

# Run an xmalloc test.  Takes the description, the expectd exit status, the
# output, and the arguments.
ok_xmalloc () {
    local desc w_status w_output output status
    desc="$1"
    shift
    w_status="$1"
    shift
    w_output="$1"
    shift
    output=`strip_colon_error ./xmalloc "$@" 2>&1`
    status=$?
    if [ $status = $w_status ] && [ x"$output" = x"$w_output" ] ; then
        ok "$desc" true
    elif [ $status = 2 ] ; then
        diag "$output"
        skip "no data limit support"
    else
        diag "saw: ($status) $output"
        diag "not: ($w_status) $w_output"
        ok "$desc" false
    fi
}

# Skip this test suite unless maintainer-mode tests are enabled.  All of the
# failures in automated testing have been problems with the assumptions around
# memory allocation or problems with the test suite, not problems with the
# underlying xmalloc code.
if [ -z "$RRA_MAINTAINER_TESTS" ] ; then
    skip_all 'xmalloc tests only run for maintainer'
fi

# Total tests.
plan 36

# First run the tests expected to succeed.
ok_xmalloc "malloc small"    0 "" "m" "21"      "0"
ok_xmalloc "malloc large"    0 "" "m" "5500000" "0"
ok_xmalloc "malloc zero"     0 "" "m" "0"       "0"
ok_xmalloc "realloc small"   0 "" "r" "21"      "0"
ok_xmalloc "realloc large"   0 "" "r" "5500000" "0"
ok_xmalloc "strdup small"    0 "" "s" "21"      "0"
ok_xmalloc "strdup large"    0 "" "s" "5500000" "0"
ok_xmalloc "strndup small"   0 "" "n" "21"      "0"
ok_xmalloc "strndup large"   0 "" "n" "5500000" "0"
ok_xmalloc "calloc small"    0 "" "c" "24"      "0"
ok_xmalloc "calloc large"    0 "" "c" "5500000" "0"
ok_xmalloc "asprintf small"  0 "" "a" "24"      "0"
ok_xmalloc "asprintf large"  0 "" "a" "5500000" "0"
ok_xmalloc "vasprintf small" 0 "" "v" "24"      "0"
ok_xmalloc "vasprintf large" 0 "" "v" "5500000" "0"

# Now limit our memory to 5.5MB and then try the large ones again, all of
# which should fail.
#
# The exact memory limits used here are essentially black magic.  They need to
# be large enough to allow the program to be loaded and do small allocations,
# but not so large that we can't reasonably expect to allocate that much
# memory normally.  The amount of memory required varies a lot based on what
# shared libraries are loaded, and if it's too small, all memory allocations
# fail.  5.5MB seems to work reasonably well on both Solaris and Linux.
#
# We assume that there are enough miscellaneous allocations that an allocation
# exactly as large as the limit will always fail.
ok_xmalloc "malloc fail" 1 \
    "failed to malloc 5500000 bytes at xmalloc.c line 38" \
    "m" "5500000" "5500000"
ok_xmalloc "realloc fail" 1 \
    "failed to realloc 5500000 bytes at xmalloc.c line 66" \
    "r" "5500000" "5500000"
ok_xmalloc "strdup fail" 1 \
    "failed to strdup 5500000 bytes at xmalloc.c line 97" \
    "s" "5500000" "5500000"
ok_xmalloc "strndup fail" 1 \
    "failed to strndup 5500000 bytes at xmalloc.c line 143" \
    "n" "5500000" "5500000"
ok_xmalloc "calloc fail" 1 \
    "failed to calloc 5500000 bytes at xmalloc.c line 167" \
    "c" "5500000" "5500000"
ok_xmalloc "asprintf fail" 1 \
    "failed to asprintf 5500000 bytes at xmalloc.c line 191" \
    "a" "5500000" "5500000"
ok_xmalloc "vasprintf fail" 1 \
    "failed to vasprintf 5500000 bytes at xmalloc.c line 210" \
    "v" "5500000" "5500000"

# Check our custom error handler.
ok_xmalloc "malloc custom"    1 "malloc 5500000 xmalloc.c 38" \
    "M" "5500000" "5500000"
ok_xmalloc "realloc custom"   1 "realloc 5500000 xmalloc.c 66" \
    "R" "5500000" "5500000"
ok_xmalloc "strdup custom"    1 "strdup 5500000 xmalloc.c 97" \
    "S" "5500000" "5500000"
ok_xmalloc "strndup custom"   1 "strndup 5500000 xmalloc.c 143" \
    "N" "5500000" "5500000"
ok_xmalloc "calloc custom"    1 "calloc 5500000 xmalloc.c 167" \
    "C" "5500000" "5500000"
ok_xmalloc "asprintf custom"  1 "asprintf 5500000 xmalloc.c 191" \
    "A" "5500000" "5500000"
ok_xmalloc "vasprintf custom" 1 "vasprintf 5500000 xmalloc.c 210" \
    "V" "5500000" "5500000"

# Check the smaller ones again just for grins.
ok_xmalloc "malloc retry"    0 "" "m" "21" "5500000"
ok_xmalloc "realloc retry"   0 "" "r" "32" "5500000"
ok_xmalloc "strdup retry"    0 "" "s" "64" "5500000"
ok_xmalloc "strndup retry"   0 "" "n" "20" "5500000"
ok_xmalloc "calloc retry"    0 "" "c" "24" "5500000"
ok_xmalloc "asprintf retry"  0 "" "a" "30" "5500000"
ok_xmalloc "vasprintf retry" 0 "" "v" "35" "5500000"