1*68e270a2Sthorpej /* $NetBSD: t_ksem.c,v 1.1 2019/02/03 03:20:24 thorpej Exp $ */
2*68e270a2Sthorpej
3*68e270a2Sthorpej /*
4*68e270a2Sthorpej * Copyright (c) 2019 The NetBSD Foundation, Inc.
5*68e270a2Sthorpej * All rights reserved.
6*68e270a2Sthorpej *
7*68e270a2Sthorpej * Redistribution and use in source and binary forms, with or without
8*68e270a2Sthorpej * modification, are permitted provided that the following conditions
9*68e270a2Sthorpej * are met:
10*68e270a2Sthorpej * 1. Redistributions of source code must retain the above copyright
11*68e270a2Sthorpej * notice, this list of conditions and the following disclaimer.
12*68e270a2Sthorpej * 2. Redistributions in binary form must reproduce the above copyright
13*68e270a2Sthorpej * notice, this list of conditions and the following disclaimer in the
14*68e270a2Sthorpej * documentation and/or other materials provided with the distribution.
15*68e270a2Sthorpej *
16*68e270a2Sthorpej * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17*68e270a2Sthorpej * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18*68e270a2Sthorpej * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19*68e270a2Sthorpej * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20*68e270a2Sthorpej * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*68e270a2Sthorpej * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*68e270a2Sthorpej * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*68e270a2Sthorpej * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*68e270a2Sthorpej * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*68e270a2Sthorpej * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*68e270a2Sthorpej * POSSIBILITY OF SUCH DAMAGE.
27*68e270a2Sthorpej */
28*68e270a2Sthorpej
29*68e270a2Sthorpej #include <sys/cdefs.h>
30*68e270a2Sthorpej __COPYRIGHT("@(#) Copyright (c) 2019\
31*68e270a2Sthorpej The NetBSD Foundation, inc. All rights reserved.");
32*68e270a2Sthorpej __RCSID("$NetBSD: t_ksem.c,v 1.1 2019/02/03 03:20:24 thorpej Exp $");
33*68e270a2Sthorpej
34*68e270a2Sthorpej #include <sys/mman.h>
35*68e270a2Sthorpej #include <sys/wait.h>
36*68e270a2Sthorpej
37*68e270a2Sthorpej #include <errno.h>
38*68e270a2Sthorpej #include <fcntl.h>
39*68e270a2Sthorpej #include <stdio.h>
40*68e270a2Sthorpej #include <unistd.h>
41*68e270a2Sthorpej
42*68e270a2Sthorpej #include <atf-c.h>
43*68e270a2Sthorpej
44*68e270a2Sthorpej #define _LIBC
45*68e270a2Sthorpej #include <sys/ksem.h>
46*68e270a2Sthorpej
47*68e270a2Sthorpej ATF_TC(close_on_unnamed);
ATF_TC_HEAD(close_on_unnamed,tc)48*68e270a2Sthorpej ATF_TC_HEAD(close_on_unnamed, tc)
49*68e270a2Sthorpej {
50*68e270a2Sthorpej atf_tc_set_md_var(tc, "descr",
51*68e270a2Sthorpej "test for correct error on close of unnamed semaphore");
52*68e270a2Sthorpej }
ATF_TC_BODY(close_on_unnamed,tc)53*68e270a2Sthorpej ATF_TC_BODY(close_on_unnamed, tc)
54*68e270a2Sthorpej {
55*68e270a2Sthorpej intptr_t ksem;
56*68e270a2Sthorpej
57*68e270a2Sthorpej /* _ksem_close() is invalid on unnamed semaphore. */
58*68e270a2Sthorpej ksem = 0;
59*68e270a2Sthorpej ATF_REQUIRE_EQ(_ksem_init(0, &ksem), 0);
60*68e270a2Sthorpej ATF_REQUIRE(_ksem_close(ksem) == -1 && errno == EINVAL);
61*68e270a2Sthorpej ATF_REQUIRE_EQ(_ksem_destroy(ksem), 0);
62*68e270a2Sthorpej }
63*68e270a2Sthorpej
64*68e270a2Sthorpej ATF_TC(close_on_unnamed_pshared);
ATF_TC_HEAD(close_on_unnamed_pshared,tc)65*68e270a2Sthorpej ATF_TC_HEAD(close_on_unnamed_pshared, tc)
66*68e270a2Sthorpej {
67*68e270a2Sthorpej atf_tc_set_md_var(tc, "descr",
68*68e270a2Sthorpej "test for correct error on close of unnamed pshared semaphore");
69*68e270a2Sthorpej }
ATF_TC_BODY(close_on_unnamed_pshared,tc)70*68e270a2Sthorpej ATF_TC_BODY(close_on_unnamed_pshared, tc)
71*68e270a2Sthorpej {
72*68e270a2Sthorpej intptr_t ksem;
73*68e270a2Sthorpej
74*68e270a2Sthorpej /* Similar, but lifecycle of pshared is slightly different. */
75*68e270a2Sthorpej ksem = KSEM_PSHARED;
76*68e270a2Sthorpej ATF_REQUIRE_EQ(_ksem_init(0, &ksem), 0);
77*68e270a2Sthorpej ATF_REQUIRE(_ksem_close(ksem) == -1 && errno == EINVAL);
78*68e270a2Sthorpej ATF_REQUIRE_EQ(_ksem_destroy(ksem), 0);
79*68e270a2Sthorpej }
80*68e270a2Sthorpej
81*68e270a2Sthorpej ATF_TC_WITH_CLEANUP(destroy_on_named);
ATF_TC_HEAD(destroy_on_named,tc)82*68e270a2Sthorpej ATF_TC_HEAD(destroy_on_named, tc)
83*68e270a2Sthorpej {
84*68e270a2Sthorpej atf_tc_set_md_var(tc, "descr",
85*68e270a2Sthorpej "test for correct error on destroy of named semaphore");
86*68e270a2Sthorpej }
ATF_TC_BODY(destroy_on_named,tc)87*68e270a2Sthorpej ATF_TC_BODY(destroy_on_named, tc)
88*68e270a2Sthorpej {
89*68e270a2Sthorpej intptr_t ksem;
90*68e270a2Sthorpej
91*68e270a2Sthorpej /* Exercise open-unlinked semaphore lifecycle. */
92*68e270a2Sthorpej ATF_REQUIRE_EQ(_ksem_open("/ksem_x", O_CREAT | O_EXCL, 0644, 0, &ksem),
93*68e270a2Sthorpej 0);
94*68e270a2Sthorpej ATF_REQUIRE(_ksem_destroy(ksem) == -1 && errno == EINVAL);
95*68e270a2Sthorpej ATF_REQUIRE_EQ(_ksem_close(ksem), 0);
96*68e270a2Sthorpej ATF_REQUIRE_EQ(_ksem_unlink("/ksem_x"), 0);
97*68e270a2Sthorpej }
ATF_TC_CLEANUP(destroy_on_named,tc)98*68e270a2Sthorpej ATF_TC_CLEANUP(destroy_on_named, tc)
99*68e270a2Sthorpej {
100*68e270a2Sthorpej (void)_ksem_unlink("/ksem_x");
101*68e270a2Sthorpej }
102*68e270a2Sthorpej
103*68e270a2Sthorpej ATF_TC_WITH_CLEANUP(open_unlinked_lifecycle);
ATF_TC_HEAD(open_unlinked_lifecycle,tc)104*68e270a2Sthorpej ATF_TC_HEAD(open_unlinked_lifecycle, tc)
105*68e270a2Sthorpej {
106*68e270a2Sthorpej atf_tc_set_md_var(tc, "descr",
107*68e270a2Sthorpej "Exercises lifecycle of open-unlined semaphores");
108*68e270a2Sthorpej }
ATF_TC_BODY(open_unlinked_lifecycle,tc)109*68e270a2Sthorpej ATF_TC_BODY(open_unlinked_lifecycle, tc)
110*68e270a2Sthorpej {
111*68e270a2Sthorpej intptr_t ksem, ksem1;
112*68e270a2Sthorpej int val;
113*68e270a2Sthorpej
114*68e270a2Sthorpej /* Exercise open-unlinked semaphore lifecycle. */
115*68e270a2Sthorpej ATF_REQUIRE_EQ(_ksem_open("/ksem_b", O_CREAT | O_EXCL, 0644, 0, &ksem),
116*68e270a2Sthorpej 0);
117*68e270a2Sthorpej ATF_REQUIRE_EQ(_ksem_unlink("/ksem_b"), 0);
118*68e270a2Sthorpej val = 255;
119*68e270a2Sthorpej ATF_REQUIRE(_ksem_getvalue(ksem, &val) == 0 && val == 0);
120*68e270a2Sthorpej
121*68e270a2Sthorpej ATF_REQUIRE_EQ(_ksem_open("/ksem_b", O_CREAT | O_EXCL, 0644, 1, &ksem1),
122*68e270a2Sthorpej 0);
123*68e270a2Sthorpej ATF_REQUIRE_EQ(_ksem_unlink("/ksem_b"), 0);
124*68e270a2Sthorpej val = 255;
125*68e270a2Sthorpej ATF_REQUIRE(_ksem_getvalue(ksem1, &val) == 0 && val == 1);
126*68e270a2Sthorpej
127*68e270a2Sthorpej ATF_REQUIRE_EQ(_ksem_close(ksem), 0);
128*68e270a2Sthorpej ATF_REQUIRE_EQ(_ksem_close(ksem1), 0);
129*68e270a2Sthorpej }
ATF_TC_CLEANUP(open_unlinked_lifecycle,tc)130*68e270a2Sthorpej ATF_TC_CLEANUP(open_unlinked_lifecycle, tc)
131*68e270a2Sthorpej {
132*68e270a2Sthorpej (void)_ksem_unlink("/ksem_a");
133*68e270a2Sthorpej (void)_ksem_unlink("/ksem_b");
134*68e270a2Sthorpej }
135*68e270a2Sthorpej
ATF_TP_ADD_TCS(tp)136*68e270a2Sthorpej ATF_TP_ADD_TCS(tp)
137*68e270a2Sthorpej {
138*68e270a2Sthorpej
139*68e270a2Sthorpej ATF_TP_ADD_TC(tp, close_on_unnamed);
140*68e270a2Sthorpej ATF_TP_ADD_TC(tp, close_on_unnamed_pshared);
141*68e270a2Sthorpej ATF_TP_ADD_TC(tp, destroy_on_named);
142*68e270a2Sthorpej ATF_TP_ADD_TC(tp, open_unlinked_lifecycle);
143*68e270a2Sthorpej
144*68e270a2Sthorpej return atf_no_error();
145*68e270a2Sthorpej }
146