comparison packages/language/c/libc/signals/current/tests/signal1.c @ 115:6ed91473a1cd ecos-sw-2000-08-21

Merge from eCos master repository on 2000-08-21-22:40:54-BST
author jlarmour
date Fri, 25 Aug 2000 17:32:38 +0000
parents
children 0ec04793409a
comparison
equal deleted inserted replaced
114:5ad2b71d525e 115:6ed91473a1cd
1 //========================================================================
2 //
3 // signal1.c
4 //
5 // ISO C signal handling test
6 //
7 //========================================================================
8 //####COPYRIGHTBEGIN####
9 //
10 // -------------------------------------------
11 // The contents of this file are subject to the Red Hat eCos Public License
12 // Version 1.1 (the "License"); you may not use this file except in
13 // compliance with the License. You may obtain a copy of the License at
14 // http://www.redhat.com/
15 //
16 // Software distributed under the License is distributed on an "AS IS"
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
18 // License for the specific language governing rights and limitations under
19 // the License.
20 //
21 // The Original Code is eCos - Embedded Configurable Operating System,
22 // released September 30, 1998.
23 //
24 // The Initial Developer of the Original Code is Red Hat.
25 // Portions created by Red Hat are
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
27 // All Rights Reserved.
28 // -------------------------------------------
29 //
30 //####COPYRIGHTEND####
31 //========================================================================
32 //#####DESCRIPTIONBEGIN####
33 //
34 // Author(s): jlarmour
35 // Contributors:
36 // Date: 2000-04-18
37 // Purpose: Test signal functionality
38 // Description: This file contains a number of tests for ISO C signal
39 // handling
40 // Usage:
41 //
42 //####DESCRIPTIONEND####
43 //
44 //========================================================================
45
46 // CONFIGURATION
47
48 #include <pkgconf/libc_signals.h> // libc signals configuration
49
50 // INCLUDES
51
52 #include <cyg/infra/cyg_type.h> // Common type definitions and support
53 #include <cyg/infra/testcase.h> // Test infrastructure
54 #include <signal.h> // Signal functions
55 #include <setjmp.h> // setjmp(), longjmp()
56 #include <stdlib.h> // abort()
57
58 // STATICS
59
60 static int state;
61 static jmp_buf jbuf;
62
63 // FUNCTIONS
64
65 static void
66 myhandler1(int signal)
67 {
68 CYG_TEST_INFO("myhandler1 called");
69 ++state;
70 } // myhandler1()
71
72 static void
73 myhandler2(int signal)
74 {
75 CYG_TEST_INFO("myhandler2 called");
76 ++state;
77 longjmp(jbuf, 1);
78 } // myhandler2()
79
80 int
81 main( int argc, char *argv[] )
82 {
83 __sighandler_t handler1;
84 int rc;
85
86 // special callout to request GDB to alter its handling of signals
87 CYG_TEST_GDBCMD("handle SIGTERM nostop");
88 CYG_TEST_GDBCMD("handle SIGABRT nostop");
89
90 CYG_TEST_INIT();
91
92 CYG_TEST_INFO("Starting tests from testcase " __FILE__ " for C "
93 "library signal functions");
94
95 // Test 1
96
97 CYG_TEST_INFO("Test 1");
98 state = 1;
99 handler1 = signal(SIGTERM, &myhandler1);
100
101 CYG_TEST_PASS_FAIL(handler1 == SIG_DFL,
102 "SIGTERM handler initialized to default");
103
104 rc = raise(SIGTERM);
105
106 CYG_TEST_PASS_FAIL(0==rc, "raise(SIGTERM) did not return error");
107
108 CYG_TEST_PASS_FAIL(2==state, "SIGTERM handler returned correctly");
109
110 // Test 2
111
112 CYG_TEST_INFO("Test 2");
113
114 state = 2;
115 handler1 = signal(SIGTERM, &myhandler2);
116
117 CYG_TEST_PASS_FAIL(handler1 == SIG_DFL,
118 "SIGTERM handler reset to default after test 1");
119
120 handler1 = signal(SIGTERM, &myhandler1);
121
122 CYG_TEST_PASS_FAIL(handler1 == &myhandler2,
123 "SIGTERM handler was set correctly");
124
125 rc = raise(SIGTERM);
126
127 CYG_TEST_PASS_FAIL(0==rc, "raise(SIGTERM) did not return error");
128
129 CYG_TEST_PASS_FAIL(3==state, "SIGTERM handler returned correctly");
130
131 // Test 3
132
133 CYG_TEST_INFO("Test 3");
134
135 handler1 = signal(SIGTERM, &myhandler2);
136
137 CYG_TEST_PASS_FAIL(handler1 == SIG_DFL,
138 "SIGTERM handler reset to default after test 2");
139
140 handler1 = signal(SIGTERM, SIG_DFL);
141
142 CYG_TEST_PASS_FAIL(handler1 == &myhandler2,
143 "SIGTERM handler was set correctly");
144
145 // Test 4
146
147 CYG_TEST_INFO("Test 4");
148
149 state = 4;
150 handler1 = signal(SIGTERM, SIG_IGN);
151
152 CYG_TEST_PASS_FAIL(handler1 == SIG_DFL,
153 "SIGTERM handler was set correctly after test 3");
154 rc = raise(SIGTERM);
155
156 CYG_TEST_PASS_FAIL(0==rc, "raise(SIGTERM) did not return error");
157
158 CYG_TEST_PASS_FAIL(4==state, "SIGTERM ignored");
159
160 // Test 5
161
162 CYG_TEST_INFO("Test 5");
163
164 state = 5;
165 handler1 = signal(SIGTERM, &myhandler2);
166
167 // SIG_IGN doesn't reset back to SIG_DFL after a raise()
168 CYG_TEST_PASS_FAIL(handler1 == SIG_IGN,
169 "SIGTERM handler was set correctly after test 4");
170
171 if (0==setjmp(jbuf)) {
172 raise(SIGTERM);
173 CYG_TEST_FAIL("raise returned");
174 }
175
176 CYG_TEST_PASS_FAIL(6==state, "SIGTERM handler returned correctly");
177
178 // Test 6
179
180 CYG_TEST_INFO("Test 6");
181
182 state = 6;
183 handler1 = signal(SIGABRT, &myhandler2);
184
185 CYG_TEST_PASS_FAIL(handler1 == SIG_DFL,
186 "SIGABRT handler initialized to default");
187
188 if (0==setjmp(jbuf)) {
189 abort();
190 CYG_TEST_FAIL("abort returned");
191 }
192
193 CYG_TEST_PASS_FAIL(7==state, "SIGABRT handler returned correctly");
194
195 CYG_TEST_FINISH("Finished tests from testcase " __FILE__ " for C "
196 "library signal functions");
197
198 } // main()
199
200 // EOF signal1.c