Browse Source
1. We need to test all bits, not all bytes. 2. Both local and global features need to be supported. 3. Untested code is broken code. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>ppa-0.6.1
committed by
Christian Decker
2 changed files with 108 additions and 2 deletions
@ -0,0 +1,106 @@ |
|||||
|
#include "../features.c" |
||||
|
#include <ccan/err/err.h> |
||||
|
#include <ccan/mem/mem.h> |
||||
|
#include <ccan/str/hex/hex.h> |
||||
|
#include <common/utils.h> |
||||
|
#include <stdio.h> |
||||
|
#include <wally_core.h> |
||||
|
|
||||
|
/* AUTOGENERATED MOCKS START */ |
||||
|
/* AUTOGENERATED MOCKS END */ |
||||
|
|
||||
|
int main(void) |
||||
|
{ |
||||
|
u8 *bits, *lf, *gf; |
||||
|
|
||||
|
setup_locale(); |
||||
|
secp256k1_ctx = wally_get_secp_context(); |
||||
|
setup_tmpctx(); |
||||
|
|
||||
|
bits = tal_arr(tmpctx, u8, 0); |
||||
|
for (size_t i = 0; i < 100; i += 3) |
||||
|
set_bit(&bits, i); |
||||
|
for (size_t i = 0; i < 100; i++) |
||||
|
assert(test_bit(bits, i / 8, i % 8) == ((i % 3) == 0)); |
||||
|
|
||||
|
for (size_t i = 0; i < 100; i++) |
||||
|
assert(feature_set(bits, i) == ((i % 3) == 0)); |
||||
|
|
||||
|
/* Simple test: single byte */ |
||||
|
bits = tal_arr(tmpctx, u8, 1); |
||||
|
|
||||
|
/* Compulsory feature */ |
||||
|
bits[0] = (1 << 0); |
||||
|
assert(feature_offered(bits, 0)); |
||||
|
assert(!feature_offered(bits, 2)); |
||||
|
assert(!feature_offered(bits, 8)); |
||||
|
assert(!feature_offered(bits, 16)); |
||||
|
|
||||
|
/* Optional feature */ |
||||
|
bits[0] = (1 << 1); |
||||
|
assert(feature_offered(bits, 0)); |
||||
|
assert(!feature_offered(bits, 2)); |
||||
|
assert(!feature_offered(bits, 8)); |
||||
|
assert(!feature_offered(bits, 16)); |
||||
|
|
||||
|
/* Endian-sensitive test: big-endian means we frob last byte here */ |
||||
|
bits = tal_arrz(tmpctx, u8, 2); |
||||
|
|
||||
|
bits[1] = (1 << 0); |
||||
|
assert(feature_offered(bits, 0)); |
||||
|
assert(!feature_offered(bits, 2)); |
||||
|
assert(!feature_offered(bits, 8)); |
||||
|
assert(!feature_offered(bits, 16)); |
||||
|
|
||||
|
/* Optional feature */ |
||||
|
bits[1] = (1 << 1); |
||||
|
assert(feature_offered(bits, 0)); |
||||
|
assert(!feature_offered(bits, 2)); |
||||
|
assert(!feature_offered(bits, 8)); |
||||
|
assert(!feature_offered(bits, 16)); |
||||
|
|
||||
|
/* We always support no features. */ |
||||
|
memset(bits, 0, tal_len(bits)); |
||||
|
assert(features_supported(bits, bits)); |
||||
|
|
||||
|
/* We must support our own features. */ |
||||
|
lf = get_offered_global_features(tmpctx); |
||||
|
gf = get_offered_global_features(tmpctx); |
||||
|
assert(features_supported(gf, lf)); |
||||
|
|
||||
|
/* We can add random odd features, no problem. */ |
||||
|
for (size_t i = 1; i < 16; i += 2) { |
||||
|
bits = tal_dup_arr(tmpctx, u8, lf, tal_len(lf), 0); |
||||
|
set_bit(&bits, i); |
||||
|
assert(features_supported(gf, bits)); |
||||
|
|
||||
|
bits = tal_dup_arr(tmpctx, u8, gf, tal_len(gf), 0); |
||||
|
set_bit(&bits, i); |
||||
|
assert(features_supported(bits, lf)); |
||||
|
} |
||||
|
|
||||
|
/* We can't add random even features. */ |
||||
|
for (size_t i = 0; i < 16; i += 2) { |
||||
|
bits = tal_dup_arr(tmpctx, u8, lf, tal_len(lf), 0); |
||||
|
set_bit(&bits, i); |
||||
|
|
||||
|
/* Special case for missing compulsory feature */ |
||||
|
if (i == 2) { |
||||
|
assert(!features_supported(gf, bits)); |
||||
|
} else { |
||||
|
assert(features_supported(gf, bits) |
||||
|
== feature_supported(i, local_features, |
||||
|
ARRAY_SIZE(local_features))); |
||||
|
} |
||||
|
|
||||
|
bits = tal_dup_arr(tmpctx, u8, gf, tal_len(gf), 0); |
||||
|
set_bit(&bits, i); |
||||
|
assert(features_supported(bits, lf) |
||||
|
== feature_supported(i, global_features, |
||||
|
ARRAY_SIZE(global_features))); |
||||
|
} |
||||
|
|
||||
|
wally_cleanup(0); |
||||
|
tal_free(tmpctx); |
||||
|
return 0; |
||||
|
} |
Loading…
Reference in new issue