printf_test.c revision 331722
1/* $FreeBSD: stable/11/share/examples/tests/tests/plain/printf_test.c 331722 2018-03-29 02:50:57Z eadler $ 2 * 3 * Copyright 2013 Google Inc. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: 9 * 10 * * Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * * Neither the name of Google Inc. nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 30 31/* 32 * INTRODUCTION 33 * 34 * This plain test program mimics the structure and contents of its 35 * ATF-based counterpart. It attempts to represent various test cases 36 * in different separate functions and just calls them all from main(). 37 * 38 * In reality, plain test programs can be much simpler. All they have 39 * to do is return 0 on success and non-0 otherwise. 40 */ 41 42#include <err.h> 43#include <stdio.h> 44#include <stdlib.h> 45#include <string.h> 46 47static void 48snprintf__two_formatters(void) 49{ 50 char buffer[128]; 51 52 if (snprintf(buffer, sizeof(buffer), "%s, %s!", "Hello", 53 "tests") <= 0) 54 errx(EXIT_FAILURE, "snprintf with two formatters failed"); 55 56 if (strcmp(buffer, "Hello, tests!") != 0) 57 errx(EXIT_FAILURE, "Bad formatting: got %s", buffer); 58} 59 60static void 61snprintf__overflow(void) 62{ 63 char buffer[10]; 64 65 if (snprintf(buffer, sizeof(buffer), "0123456789abcdef") != 16) 66 errx(EXIT_FAILURE, "snprintf did not return the expected " 67 "number of characters"); 68 69 if (strcmp(buffer, "012345678") != 0) 70 errx(EXIT_FAILURE, "Bad formatting: got %s", buffer); 71} 72 73static void 74fprintf__simple_string(void) 75{ 76 FILE *file; 77 char buffer[128]; 78 size_t length; 79 const char *contents = "This is a message\n"; 80 81 file = fopen("test.txt", "w+"); 82 if (fprintf(file, "%s", contents) <= 0) 83 err(EXIT_FAILURE, "fprintf failed to write to file"); 84 rewind(file); 85 length = fread(buffer, 1, sizeof(buffer) - 1, file); 86 if (length != strlen(contents)) 87 err(EXIT_FAILURE, "fread failed"); 88 buffer[length] = '\0'; 89 fclose(file); 90 91 if (strcmp(buffer, contents) != 0) 92 errx(EXIT_FAILURE, "Written and read data differ"); 93 94 /* Of special note here is that we are NOT deleting the temporary 95 * files we created in this test. Kyua takes care of this cleanup 96 * automatically and tests can (and should) rely on this behavior. */ 97} 98 99int 100main(void) 101{ 102 /* If you have read the printf_test.c counterpart in the atf/ 103 * directory, you may think that the sequencing of tests below and 104 * the exposed behavior to the user is very similar. But you'd be 105 * wrong. 106 * 107 * There are two major differences with this and the ATF version. 108 * The first is that the code below has no provisions to detect 109 * failures in one test and continue running the other tests: the 110 * first failure causes the whole test program to exit. The second 111 * is that this particular main() has no arguments: without ATF, 112 * all test programs may expose a different command-line interface, 113 * and this is an issue for consistency purposes. */ 114 snprintf__two_formatters(); 115 snprintf__overflow(); 116 fprintf__simple_string(); 117 118 return EXIT_SUCCESS; 119} 120