Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/modules/multiset/tests_impl.h
- This file was added.
/********************************************************************** | |||||
* Copyright (c) 2017 Tomas van der Wansem * | |||||
* Distributed under the MIT software license, see the accompanying * | |||||
* file COPYING or http://www.opensource.org/licenses/mit-license.php.* | |||||
**********************************************************************/ | |||||
#ifndef _SECP256K1_MODULE_MULTISET_TESTS_ | |||||
#define _SECP256K1_MODULE_MULTISET_TESTS_ | |||||
#include "include/secp256k1.h" | |||||
#include "include/secp256k1_multiset.h" | |||||
#include "util.h" | |||||
#include "testrand.h" | |||||
#define DATALEN 64*3 | |||||
#define DATACOUNT 100 | |||||
#define CHECK_EQUAL(a,b) { \ | |||||
unsigned char hash1[32]; \ | |||||
unsigned char hash2[32]; \ | |||||
secp256k1_multiset_finalize(ctx, hash1, (a)); \ | |||||
secp256k1_multiset_finalize(ctx, hash2, (b)); \ | |||||
CHECK(memcmp(hash1,hash2,sizeof(hash1))==0); \ | |||||
} | |||||
#define CHECK_NOTEQUAL(a,b) { \ | |||||
unsigned char hash1[32]; \ | |||||
unsigned char hash2[32]; \ | |||||
secp256k1_multiset_finalize(ctx, hash1, (a)); \ | |||||
secp256k1_multiset_finalize(ctx, hash2, (b)); \ | |||||
CHECK(memcmp(hash1,hash2,sizeof(hash1))!=0); \ | |||||
} | |||||
static unsigned char data[DATACOUNT][DATALEN]; | |||||
/* create random data */ | |||||
static void initdata(void) { | |||||
int n,m; | |||||
for(n=0; n < DATACOUNT; n++) { | |||||
for(m=0; m < DATALEN/4; m++) { | |||||
((uint32_t*) data[n])[m] = secp256k1_rand32(); | |||||
} | |||||
} | |||||
} | |||||
void test_unordered(void) { | |||||
secp256k1_multiset empty, r1,r2,r3; | |||||
secp256k1_multiset_init(ctx, &empty); | |||||
secp256k1_multiset_init(ctx, &r1); | |||||
secp256k1_multiset_init(ctx, &r2); | |||||
secp256k1_multiset_init(ctx, &r3); | |||||
secp256k1_multiset_add(ctx, &r1, data[0], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r2, data[1], DATALEN); | |||||
CHECK_NOTEQUAL(&r1,&r2); | |||||
secp256k1_multiset_add(ctx, &r1, data[1], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r2, data[0], DATALEN); | |||||
CHECK_EQUAL(&r1,&r2); | |||||
secp256k1_multiset_init(ctx, &r1); | |||||
secp256k1_multiset_init(ctx, &r2); | |||||
secp256k1_multiset_init(ctx, &r3); | |||||
CHECK_EQUAL(&r1,&r2); | |||||
secp256k1_multiset_add(ctx, &r1, data[0], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r1, data[1], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r1, data[2], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r2, data[2], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r2, data[0], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r2, data[1], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r3, data[1], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r3, data[0], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r3, data[2], DATALEN); | |||||
CHECK_EQUAL(&r1,&r2); | |||||
CHECK_EQUAL(&r1,&r3); | |||||
secp256k1_multiset_combine(ctx, &r3, &empty); | |||||
CHECK_EQUAL(&r1,&r3); | |||||
secp256k1_multiset_combine(ctx, &r3, &r2); | |||||
CHECK_NOTEQUAL(&r1,&r3); | |||||
} | |||||
deadalnix: A few comment on what's happening in all these tests would help. | |||||
void test_combine(void) { | |||||
secp256k1_multiset empty, r1,r2,r3; | |||||
secp256k1_multiset_init(ctx, &empty); | |||||
secp256k1_multiset_init(ctx, &r1); | |||||
secp256k1_multiset_init(ctx, &r2); | |||||
secp256k1_multiset_init(ctx, &r3); | |||||
secp256k1_multiset_add(ctx, &r1, data[0], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r2, data[1], DATALEN); | |||||
CHECK_NOTEQUAL(&r1,&r2); | |||||
secp256k1_multiset_add(ctx, &r1, data[1], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r2, data[0], DATALEN); | |||||
CHECK_EQUAL(&r1,&r2); | |||||
secp256k1_multiset_init(ctx, &r1); | |||||
secp256k1_multiset_init(ctx, &r2); | |||||
secp256k1_multiset_init(ctx, &r3); | |||||
CHECK_EQUAL(&r1,&r2); | |||||
secp256k1_multiset_add(ctx, &r1, data[0], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r1, data[1], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r1, data[2], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r2, data[2], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r3, data[0], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r3, data[1], DATALEN); | |||||
secp256k1_multiset_combine(ctx, &r2, &r3); | |||||
CHECK_EQUAL(&r1,&r2); | |||||
secp256k1_multiset_init(ctx, &r2); | |||||
secp256k1_multiset_init(ctx, &r3); | |||||
secp256k1_multiset_add(ctx, &r2, data[2], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r2, data[0], DATALEN); | |||||
secp256k1_multiset_add(ctx, &r3, data[1], DATALEN); | |||||
secp256k1_multiset_combine(ctx, &r2, &r3); | |||||
CHECK_EQUAL(&r1,&r2); | |||||
secp256k1_multiset_combine(ctx, &r2, &empty); | |||||
CHECK_EQUAL(&r1,&r2); | |||||
secp256k1_multiset_combine(ctx, &r2, &r1); | |||||
CHECK_NOTEQUAL(&r1,&r2); | |||||
} | |||||
deadalnixUnsubmitted Not Done Inline Actionsdito deadalnix: dito | |||||
void test_remove(void) { | |||||
secp256k1_multiset empty, r1,r2,r3; | |||||
secp256k1_multiset_init(ctx, &empty); | |||||
secp256k1_multiset_init(ctx, &r1); | |||||
secp256k1_multiset_init(ctx, &r2); | |||||
secp256k1_multiset_init(ctx, &r3); | |||||
CHECK_EQUAL(&r1,&r2); | |||||
secp256k1_multiset_add (ctx, &r1, data[0], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r1, data[1], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r1, data[3], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r1, data[9], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r1, data[8], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r2, data[1], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r2, data[9], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r2, data[11], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r2, data[10], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r2, data[0], DATALEN); | |||||
secp256k1_multiset_remove(ctx, &r2, data[10], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r2, data[3], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r2, data[8], DATALEN); | |||||
secp256k1_multiset_remove(ctx, &r2, data[11], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r3, data[9], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r3, data[15], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r3, data[15], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r3, data[1], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r3, data[9], DATALEN); | |||||
secp256k1_multiset_remove(ctx, &r3, data[15], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r3, data[0], DATALEN); | |||||
secp256k1_multiset_remove(ctx, &r3, data[15], DATALEN); | |||||
secp256k1_multiset_remove(ctx, &r3, data[9], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r3, data[3], DATALEN); | |||||
secp256k1_multiset_add (ctx, &r3, data[8], DATALEN); | |||||
CHECK_EQUAL(&r1,&r2); | |||||
CHECK_EQUAL(&r1,&r3); | |||||
CHECK_NOTEQUAL(&r1,&empty); | |||||
secp256k1_multiset_remove(ctx, &r3, data[8], DATALEN); | |||||
CHECK_NOTEQUAL(&r1,&r3); | |||||
secp256k1_multiset_remove(ctx, &r2, data[0], DATALEN); | |||||
secp256k1_multiset_remove(ctx, &r2, data[9], DATALEN); | |||||
secp256k1_multiset_remove(ctx, &r2, data[8], DATALEN); | |||||
secp256k1_multiset_remove(ctx, &r2, data[1], DATALEN); | |||||
secp256k1_multiset_remove(ctx, &r2, data[3], DATALEN); | |||||
CHECK_EQUAL(&r2,&empty); | |||||
deadalnixUnsubmitted Not Done Inline ActionsAs far as I can tell, this test doesn't try to add an element multiple times and remove it multiple time and check that everything behaves properly. ECMH can definitively have more than one instance of an element, even a negative number of them. deadalnix: As far as I can tell, this test doesn't try to add an element multiple times and remove it… | |||||
} | |||||
deadalnixUnsubmitted Not Done Inline Actionsdito deadalnix: dito | |||||
void test_empty(void) { | |||||
secp256k1_multiset empty, r1,r2; | |||||
secp256k1_multiset_init(ctx, &empty); | |||||
secp256k1_multiset_init(ctx, &r1); | |||||
secp256k1_multiset_init(ctx, &r2); | |||||
CHECK_EQUAL(&empty,&r1); | |||||
/* empty + empty = empty */ | |||||
secp256k1_multiset_combine(ctx, &r1, &r2); | |||||
CHECK_EQUAL(&empty, &r1); | |||||
deadalnixUnsubmitted Not Done Inline ActionsMaybe this should be added to the combine ? deadalnix: Maybe this should be added to the combine ? | |||||
} | |||||
void run_multiset_tests(void) { | |||||
initdata(); | |||||
test_unordered(); | |||||
test_combine(); | |||||
test_remove(); | |||||
test_empty(); | |||||
deadalnixUnsubmitted Not Done Inline ActionsPlease add test that check the result of the function for some predetermined input values so that a 3rd party implementation have something to check against. You should include internal functions as well. deadalnix: Please add test that check the result of the function for some predetermined input values so… | |||||
} | |||||
#endif |
A few comment on what's happening in all these tests would help.