提交 d836d71b 编写于 作者: E Emilia Kasper

Simplify tests part 2

1) Remove some unnecessary fixtures
2) Add EXECUTE_TEST_NO_TEARDOWN shorthand when a fixture exists but has
no teardown.
3) Fix return values in ct_test.c (introduced by an earlier refactoring,
oops)

Note that for parameterized tests, the index (test vector) usually holds all the
customization, and there should be no need for a separate test
fixture. The CTS test is an exception: it demonstrates how to combine
customization with parameterization.
Reviewed-by: NRichard Levitte <levitte@openssl.org>
上级 8e47ee18
......@@ -507,20 +507,20 @@ static int test_encode_tls_sct()
SCT *sct = SCT_new();
if (!SCT_set_version(sct, SCT_VERSION_V1)) {
fprintf(stderr, "Failed to set SCT version\n");
return 1;
return 0;
}
if (!SCT_set1_log_id(sct, log_id, 32)) {
fprintf(stderr, "Failed to set SCT log ID\n");
return 1;
return 0;
}
SCT_set_timestamp(sct, 1);
if (!SCT_set_signature_nid(sct, NID_ecdsa_with_SHA256)) {
fprintf(stderr, "Failed to set SCT signature NID\n");
return 1;
return 0;
}
if (!SCT_set1_signature(sct, signature, 71)) {
fprintf(stderr, "Failed to set SCT signature\n");
return 1;
return 0;
}
sk_SCT_push(sct_list, sct);
......
......@@ -21,46 +21,6 @@ typedef struct {
const unsigned char expected[MDC2_DIGEST_LENGTH];
} TESTDATA;
typedef struct {
const char *case_name;
int num;
const TESTDATA *data;
} SIMPLE_FIXTURE;
/**********************************************************************
*
* Test of mdc2 internal functions
*
***/
static SIMPLE_FIXTURE setup_mdc2(const char *const test_case_name)
{
SIMPLE_FIXTURE fixture;
fixture.case_name = test_case_name;
return fixture;
}
static int execute_mdc2(SIMPLE_FIXTURE fixture)
{
unsigned char md[MDC2_DIGEST_LENGTH];
MDC2_CTX c;
MDC2_Init(&c);
MDC2_Update(&c, (const unsigned char *)fixture.data->input,
strlen(fixture.data->input));
MDC2_Final(&(md[0]), &c);
if (memcmp(fixture.data->expected, md, MDC2_DIGEST_LENGTH)) {
fprintf(stderr, "mdc2 test %d: unexpected output\n", fixture.num);
return 0;
}
return 1;
}
static void teardown_mdc2(SIMPLE_FIXTURE fixture)
{
}
/**********************************************************************
*
......@@ -78,17 +38,34 @@ static TESTDATA tests[] = {
}
};
static int drive_tests(int idx)
/**********************************************************************
*
* Test of mdc2 internal functions
*
***/
static int test_mdc2(int idx)
{
SETUP_TEST_FIXTURE(SIMPLE_FIXTURE, setup_mdc2);
fixture.num = idx;
fixture.data = &tests[idx];
EXECUTE_TEST(execute_mdc2, teardown_mdc2);
unsigned char md[MDC2_DIGEST_LENGTH];
MDC2_CTX c;
const TESTDATA testdata = tests[idx];
MDC2_Init(&c);
MDC2_Update(&c, (const unsigned char *)testdata.input,
strlen(testdata.input));
MDC2_Final(&(md[0]), &c);
if (memcmp(testdata.expected, md, MDC2_DIGEST_LENGTH)) {
fprintf(stderr, "mdc2 test %d: unexpected output\n", idx);
return 0;
}
return 1;
}
int main(int argc, char **argv)
{
ADD_ALL_TESTS(drive_tests, OSSL_NELEM(tests));
ADD_ALL_TESTS(test_mdc2, OSSL_NELEM(tests));
return run_tests(argv[0]);
}
此差异已折叠。
......@@ -28,25 +28,12 @@ typedef struct {
SIZED_DATA expected;
} TESTDATA;
typedef struct {
const char *test_case_name;
int test_num;
const TESTDATA *test_data;
} SIMPLE_FIXTURE;
/**********************************************************************
*
* Test of poly1305 internal functions
*
***/
static SIMPLE_FIXTURE setup_poly1305(const char *const test_case_name)
{
SIMPLE_FIXTURE fixture;
fixture.test_case_name = test_case_name;
return fixture;
}
/* TODO : hex decoder / encoder should be implemented in testutil.c */
static void hexdump(const unsigned char *a, size_t len)
{
......@@ -56,96 +43,6 @@ static void hexdump(const unsigned char *a, size_t len)
fprintf(stderr, "%02x", a[i]);
}
static int execute_poly1305(SIMPLE_FIXTURE fixture)
{
POLY1305 poly1305;
unsigned int i = fixture.test_num;
const TESTDATA *test = fixture.test_data;
const unsigned char *in = test->input.data;
size_t inlen = test->input.size;
const unsigned char *key = test->key.data;
const unsigned char *expected = test->expected.data;
size_t expectedlen = test->expected.size;
unsigned char out[16];
if (expectedlen != sizeof(out))
return 0;
Poly1305_Init(&poly1305, key);
Poly1305_Update(&poly1305, in, inlen);
Poly1305_Final(&poly1305, out);
if (memcmp(out, expected, expectedlen) != 0) {
fprintf(stderr, "Poly1305 test #%d failed.\n", i);
fprintf(stderr, "got: ");
hexdump(out, sizeof(out));
fprintf(stderr, "\nexpected: ");
hexdump(expected, expectedlen);
fprintf(stderr, "\n");
return 0;
}
if (inlen > 16) {
Poly1305_Init(&poly1305, key);
Poly1305_Update(&poly1305, in, 1);
Poly1305_Update(&poly1305, in+1, inlen-1);
Poly1305_Final(&poly1305, out);
if (memcmp(out, expected, expectedlen) != 0) {
fprintf(stderr, "Poly1305 test #%d/1+(N-1) failed.\n", i);
fprintf(stderr, "got: ");
hexdump(out, sizeof(out));
fprintf(stderr, "\nexpected: ");
hexdump(expected, expectedlen);
fprintf(stderr, "\n");
return 0;
}
}
if (inlen > 32) {
size_t half = inlen / 2;
Poly1305_Init(&poly1305, key);
Poly1305_Update(&poly1305, in, half);
Poly1305_Update(&poly1305, in+half, inlen-half);
Poly1305_Final(&poly1305, out);
if (memcmp(out, expected, expectedlen) != 0) {
fprintf(stderr, "Poly1305 test #%d/2 failed.\n", i);
fprintf(stderr, "got: ");
hexdump(out, sizeof(out));
fprintf(stderr, "\nexpected: ");
hexdump(expected, expectedlen);
fprintf(stderr, "\n");
return 0;
}
for (half = 16; half < inlen; half += 16) {
Poly1305_Init(&poly1305, key);
Poly1305_Update(&poly1305, in, half);
Poly1305_Update(&poly1305, in+half, inlen-half);
Poly1305_Final(&poly1305, out);
if (memcmp(out, expected, expectedlen) != 0) {
fprintf(stderr, "Poly1305 test #%d/%" OSSLzu "+%" OSSLzu " failed.\n",
i, half, inlen-half);
fprintf(stderr, "got: ");
hexdump(out, sizeof(out));
fprintf(stderr, "\nexpected: ");
hexdump(expected, expectedlen);
fprintf(stderr, "\n");
return 0;
}
}
}
return 1;
}
static void teardown_poly1305(SIMPLE_FIXTURE fixture)
{
}
static void benchmark_poly1305()
{
# ifdef OPENSSL_CPUID_OBJ
......@@ -186,12 +83,6 @@ static void benchmark_poly1305()
# endif
}
/**********************************************************************
*
* Test driver
*
***/
static TESTDATA tests[] = {
/*
* RFC7539
......@@ -1662,12 +1553,89 @@ static TESTDATA tests[] = {
}
};
static int drive_tests(int idx)
static int test_poly1305(int idx)
{
SETUP_TEST_FIXTURE(SIMPLE_FIXTURE, setup_poly1305);
fixture.test_num = idx;
fixture.test_data = &tests[idx];
EXECUTE_TEST(execute_poly1305, teardown_poly1305);
POLY1305 poly1305;
const TESTDATA test = tests[idx];
const unsigned char *in = test.input.data;
size_t inlen = test.input.size;
const unsigned char *key = test.key.data;
const unsigned char *expected = test.expected.data;
size_t expectedlen = test.expected.size;
unsigned char out[16];
if (expectedlen != sizeof(out))
return 0;
Poly1305_Init(&poly1305, key);
Poly1305_Update(&poly1305, in, inlen);
Poly1305_Final(&poly1305, out);
if (memcmp(out, expected, expectedlen) != 0) {
fprintf(stderr, "Poly1305 test #%d failed.\n", idx);
fprintf(stderr, "got: ");
hexdump(out, sizeof(out));
fprintf(stderr, "\nexpected: ");
hexdump(expected, expectedlen);
fprintf(stderr, "\n");
return 0;
}
if (inlen > 16) {
Poly1305_Init(&poly1305, key);
Poly1305_Update(&poly1305, in, 1);
Poly1305_Update(&poly1305, in+1, inlen-1);
Poly1305_Final(&poly1305, out);
if (memcmp(out, expected, expectedlen) != 0) {
fprintf(stderr, "Poly1305 test #%d/1+(N-1) failed.\n", idx);
fprintf(stderr, "got: ");
hexdump(out, sizeof(out));
fprintf(stderr, "\nexpected: ");
hexdump(expected, expectedlen);
fprintf(stderr, "\n");
return 0;
}
}
if (inlen > 32) {
size_t half = inlen / 2;
Poly1305_Init(&poly1305, key);
Poly1305_Update(&poly1305, in, half);
Poly1305_Update(&poly1305, in+half, inlen-half);
Poly1305_Final(&poly1305, out);
if (memcmp(out, expected, expectedlen) != 0) {
fprintf(stderr, "Poly1305 test #%d/2 failed.\n", idx);
fprintf(stderr, "got: ");
hexdump(out, sizeof(out));
fprintf(stderr, "\nexpected: ");
hexdump(expected, expectedlen);
fprintf(stderr, "\n");
return 0;
}
for (half = 16; half < inlen; half += 16) {
Poly1305_Init(&poly1305, key);
Poly1305_Update(&poly1305, in, half);
Poly1305_Update(&poly1305, in+half, inlen-half);
Poly1305_Final(&poly1305, out);
if (memcmp(out, expected, expectedlen) != 0) {
fprintf(stderr, "Poly1305 test #%d/%" OSSLzu "+%" OSSLzu " failed.\n",
idx, half, inlen-half);
fprintf(stderr, "got: ");
hexdump(out, sizeof(out));
fprintf(stderr, "\nexpected: ");
hexdump(expected, expectedlen);
fprintf(stderr, "\n");
return 0;
}
}
}
return 1;
}
int main(int argc, char **argv)
......@@ -1683,7 +1651,7 @@ int main(int argc, char **argv)
goto help;
}
ADD_ALL_TESTS(drive_tests, OSSL_NELEM(tests));
ADD_ALL_TESTS(test_poly1305, OSSL_NELEM(tests));
result = run_tests(argv[0]);
......
......@@ -23,18 +23,6 @@ static CONF *conf = NULL;
/* Currently the section names are of the form test-<number>, e.g. test-15. */
#define MAX_TESTCASE_NAME_LENGTH 100
typedef struct ssl_test_ctx_test_fixture {
const char *test_case_name;
char test_app[MAX_TESTCASE_NAME_LENGTH];
} SSL_TEST_FIXTURE;
static SSL_TEST_FIXTURE set_up(const char *const test_case_name)
{
SSL_TEST_FIXTURE fixture;
fixture.test_case_name = test_case_name;
return fixture;
}
static const char *print_alert(int alert)
{
return alert ? SSL_alert_desc_string_long(alert) : "no alert";
......@@ -222,15 +210,18 @@ static int check_test(HANDSHAKE_RESULT *result, SSL_TEST_CTX *test_ctx)
return ret;
}
static int execute_test(SSL_TEST_FIXTURE fixture)
static int test_handshake(int idx)
{
int ret = 0;
SSL_CTX *server_ctx = NULL, *server2_ctx = NULL, *client_ctx = NULL,
*resume_server_ctx = NULL, *resume_client_ctx = NULL;
SSL_TEST_CTX *test_ctx = NULL;
HANDSHAKE_RESULT *result = NULL;
char test_app[MAX_TESTCASE_NAME_LENGTH];
BIO_snprintf(test_app, sizeof(test_app), "test-%d", idx);
test_ctx = SSL_TEST_CTX_create(conf, fixture.test_app);
test_ctx = SSL_TEST_CTX_create(conf, test_app);
if (test_ctx == NULL)
goto err;
......@@ -272,7 +263,7 @@ static int execute_test(SSL_TEST_FIXTURE fixture)
TEST_check(server_ctx != NULL);
TEST_check(client_ctx != NULL);
TEST_check(CONF_modules_load(conf, fixture.test_app, 0) > 0);
TEST_check(CONF_modules_load(conf, test_app, 0) > 0);
if (!SSL_CTX_config(server_ctx, "server")
|| !SSL_CTX_config(client_ctx, "client")) {
......@@ -305,23 +296,6 @@ err:
return ret;
}
static void tear_down(SSL_TEST_FIXTURE fixture)
{
}
#define SETUP_SSL_TEST_FIXTURE() \
SETUP_TEST_FIXTURE(SSL_TEST_FIXTURE, set_up)
#define EXECUTE_SSL_TEST() \
EXECUTE_TEST(execute_test, tear_down)
static int test_handshake(int idx)
{
SETUP_SSL_TEST_FIXTURE();
BIO_snprintf(fixture.test_app, sizeof(fixture.test_app),
"test-%d", idx);
EXECUTE_SSL_TEST();
}
int main(int argc, char **argv)
{
int result = 0;
......
......@@ -216,20 +216,6 @@ static int execute_test(SSL_TEST_CTX_TEST_FIXTURE fixture)
return success;
}
static int execute_failure_test(SSL_TEST_CTX_TEST_FIXTURE fixture)
{
SSL_TEST_CTX *ctx = SSL_TEST_CTX_create(conf, fixture.test_section);
if (ctx != NULL) {
fprintf(stderr, "Parsing bad configuration %s succeeded.\n",
fixture.test_section);
SSL_TEST_CTX_free(ctx);
return 0;
}
return 1;
}
static void tear_down(SSL_TEST_CTX_TEST_FIXTURE fixture)
{
SSL_TEST_CTX_free(fixture.expected_ctx);
......@@ -239,8 +225,6 @@ static void tear_down(SSL_TEST_CTX_TEST_FIXTURE fixture)
SETUP_TEST_FIXTURE(SSL_TEST_CTX_TEST_FIXTURE, set_up)
#define EXECUTE_SSL_TEST_CTX_TEST() \
EXECUTE_TEST(execute_test, tear_down)
#define EXECUTE_SSL_TEST_CTX_FAILURE_TEST() \
EXECUTE_TEST(execute_failure_test, tear_down)
static int test_empty_configuration()
{
......@@ -307,9 +291,16 @@ static const char *bad_configurations[] = {
static int test_bad_configuration(int idx)
{
SETUP_SSL_TEST_CTX_TEST_FIXTURE();
fixture.test_section = bad_configurations[idx];
EXECUTE_SSL_TEST_CTX_FAILURE_TEST();
SSL_TEST_CTX *ctx = SSL_TEST_CTX_create(conf, bad_configurations[idx]);
if (ctx != NULL) {
fprintf(stderr, "Parsing bad configuration %s succeeded.\n",
bad_configurations[idx]);
SSL_TEST_CTX_free(ctx);
return 0;
}
return 1;
}
int main(int argc, char **argv)
......
......@@ -60,6 +60,11 @@
tear_down(fixture);\
return result
/* Shorthand if tear_down does nothing. */
# define EXECUTE_TEST_NO_TEARDOWN(execute_func)\
result = execute_func(fixture);\
return result
/*
* TEST_CASE_NAME is defined as the name of the test case function where
* possible; otherwise we get by with the file name and line number.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册