testutil.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /*-
  2. * Utilities for writing OpenSSL unit tests.
  3. *
  4. * More information:
  5. * http://wiki.openssl.org/index.php/How_To_Write_Unit_Tests_For_OpenSSL
  6. *
  7. * Author: Mike Bland (mbland@acm.org)
  8. * Date: 2014-07-15
  9. * ====================================================================
  10. * Copyright (c) 2014 The OpenSSL Project. All rights reserved.
  11. *
  12. * Redistribution and use in source and binary forms, with or without
  13. * modification, are permitted provided that the following conditions
  14. * are met:
  15. *
  16. * 1. Redistributions of source code must retain the above copyright
  17. * notice, this list of conditions and the following disclaimer.
  18. *
  19. * 2. Redistributions in binary form must reproduce the above copyright
  20. * notice, this list of conditions and the following disclaimer in
  21. * the documentation and/or other materials provided with the
  22. * distribution.
  23. *
  24. * 3. All advertising materials mentioning features or use of this
  25. * software must display the following acknowledgment:
  26. * "This product includes software developed by the OpenSSL Project
  27. * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
  28. *
  29. * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  30. * endorse or promote products derived from this software without
  31. * prior written permission. For written permission, please contact
  32. * licensing@OpenSSL.org.
  33. *
  34. * 5. Products derived from this software may not be called "OpenSSL"
  35. * nor may "OpenSSL" appear in their names without prior written
  36. * permission of the OpenSSL Project.
  37. *
  38. * 6. Redistributions of any form whatsoever must retain the following
  39. * acknowledgment:
  40. * "This product includes software developed by the OpenSSL Project
  41. * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
  42. *
  43. * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  44. * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  45. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  46. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
  47. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  48. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  49. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  50. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  51. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  52. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  53. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  54. * OF THE POSSIBILITY OF SUCH DAMAGE.
  55. * ====================================================================
  56. */
  57. #include "testutil.h"
  58. #include <assert.h>
  59. #include <stdlib.h>
  60. #include <stdio.h>
  61. #include "e_os.h"
  62. /*
  63. * Declares the structures needed to register each test case function.
  64. */
  65. typedef struct test_info {
  66. const char *test_case_name;
  67. int (*test_fn) ();
  68. } TEST_INFO;
  69. static TEST_INFO all_tests[1024];
  70. static int num_tests = 0;
  71. void add_test(const char *test_case_name, int (*test_fn) ())
  72. {
  73. assert(num_tests != OSSL_NELEM(all_tests));
  74. all_tests[num_tests].test_case_name = test_case_name;
  75. all_tests[num_tests].test_fn = test_fn;
  76. ++num_tests;
  77. }
  78. int run_tests(const char *test_prog_name)
  79. {
  80. int num_failed = 0;
  81. int i = 0;
  82. printf("%s: %d test case%s\n", test_prog_name, num_tests,
  83. num_tests == 1 ? "" : "s");
  84. for (i = 0; i != num_tests; ++i) {
  85. if (all_tests[i].test_fn()) {
  86. printf("** %s failed **\n--------\n",
  87. all_tests[i].test_case_name);
  88. ++num_failed;
  89. }
  90. }
  91. if (num_failed != 0) {
  92. printf("%s: %d test%s failed (out of %d)\n", test_prog_name,
  93. num_failed, num_failed != 1 ? "s" : "", num_tests);
  94. return EXIT_FAILURE;
  95. }
  96. printf(" All tests passed.\n");
  97. return EXIT_SUCCESS;
  98. }