Skip to content

Commit d97d37a

Browse files
M-Moawadkeith-packard
authored andcommitted
test: Add test for fgetc when reading from a non readable stream
For more details according to the test case, see this discussion: picolibc#717 Signed-off-by: Mohamed Moawad <[email protected]>
1 parent 021425b commit d97d37a

File tree

2 files changed

+81
-1
lines changed

2 files changed

+81
-1
lines changed

test/meson.build

+1-1
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,7 @@ foreach target : targets
533533

534534
# legacy stdio doesn't work on semihosting, so just skip it
535535
if tinystdio
536-
plain_tests += ['test-fopen', 'test-mktemp', 'test-tmpnam', 'test-fread-fwrite', 'test-ungetc-ftell']
536+
plain_tests += ['test-fopen', 'test-mktemp', 'test-tmpnam', 'test-fread-fwrite', 'test-ungetc-ftell', 'test-fgetc']
537537
endif
538538
endif
539539

test/test-fgetc.c

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* SPDX-License-Identifier: BSD-3-Clause
3+
*
4+
* Copyright © 2024, Synopsys Inc.
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions
8+
* are met:
9+
*
10+
* 1. Redistributions of source code must retain the above copyright
11+
* notice, this list of conditions and the following disclaimer.
12+
*
13+
* 2. Redistributions in binary form must reproduce the above
14+
* copyright notice, this list of conditions and the following
15+
* disclaimer in the documentation and/or other materials provided
16+
* with the distribution.
17+
*
18+
* 3. Neither the name of the copyright holder nor the names of its
19+
* contributors may be used to endorse or promote products derived
20+
* from this software without specific prior written permission.
21+
*
22+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25+
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26+
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27+
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
33+
* OF THE POSSIBILITY OF SUCH DAMAGE.
34+
*/
35+
#define _DEFAULT_SOURCE
36+
#include <stdio.h>
37+
#include <stdlib.h>
38+
39+
#ifndef TEST_FILE_NAME
40+
#define TEST_FILE_NAME "FGETC.TXT"
41+
#endif
42+
43+
#define check(condition, message) do { \
44+
if (!(condition)) { \
45+
printf("%s: %s\n", message, #condition); \
46+
if (f) \
47+
fclose(f); \
48+
(void) remove(TEST_FILE_NAME); \
49+
exit(1); \
50+
} \
51+
} while(0)
52+
53+
54+
int
55+
main(void)
56+
{
57+
FILE *f;
58+
int ch;
59+
60+
/* Make sure we can create a file */
61+
f = fopen(TEST_FILE_NAME, "w");
62+
check(f != NULL, "Error opening file");
63+
64+
// Get error indicator before reading
65+
check(ferror(f) == 0, "Error occured before reading");
66+
67+
// Attempt to read from the file
68+
ch = fgetc(f);
69+
check(ch == EOF, "fgetc returns non EOF");
70+
71+
// Get error indicator after reading
72+
check(ferror(f) != 0, "After reading from non readable stream, the error flag of straem f is not set");
73+
74+
// Close the file
75+
fclose(f);
76+
77+
(void) remove(TEST_FILE_NAME);
78+
79+
exit(0);
80+
}

0 commit comments

Comments
 (0)