mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-12 22:19:10 +00:00
Make numerous improvements
- Python static hello world now 1.8mb - Python static fully loaded now 10mb - Python HTTPS client now uses MbedTLS - Python REPL now completes import stmts - Increase stack size for Python for now - Begin synthesizing posixpath and ntpath - Restore Python \N{UNICODE NAME} support - Restore Python NFKD symbol normalization - Add optimized code path for Intel SHA-NI - Get more Python unit tests passing faster - Get Python help() pagination working on NT - Python hashlib now supports MbedTLS PBKDF2 - Make memcpy/memmove/memcmp/bcmp/etc. faster - Add Mersenne Twister and Vigna to LIBC_RAND - Provide privileged __printf() for error code - Fix zipos opendir() so that it reports ENOTDIR - Add basic chmod() implementation for Windows NT - Add Cosmo's best functions to Python cosmo module - Pin function trace indent depth to that of caller - Show memory diagram on invalid access in MODE=dbg - Differentiate stack overflow on crash in MODE=dbg - Add stb_truetype and tools for analyzing font files - Upgrade to UNICODE 13 and reduce its binary footprint - COMPILE.COM now logs resource usage of build commands - Start implementing basic poll() support on bare metal - Set getauxval(AT_EXECFN) to GetModuleFileName() on NT - Add descriptions to strerror() in non-TINY build modes - Add COUNTBRANCH() macro to help with micro-optimizations - Make error / backtrace / asan / memory code more unbreakable - Add fast perfect C implementation of μ-Law and a-Law audio codecs - Make strtol() functions consistent with other libc implementations - Improve Linenoise implementation (see also github.com/jart/bestline) - COMPILE.COM now suppresses stdout/stderr of successful build commands
This commit is contained in:
parent
fa7b4f5bd1
commit
39bf41f4eb
806 changed files with 77494 additions and 63859 deletions
194
test/dsp/core/alaw_test.c
Normal file
194
test/dsp/core/alaw_test.c
Normal file
|
@ -0,0 +1,194 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "dsp/core/core.h"
|
||||
#include "libc/macros.internal.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/hyperion.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
TEST(unalaw, outOfRange_modulo256) {
|
||||
EXPECT_EQ(880, unalaw(-2));
|
||||
EXPECT_EQ(880, unalaw(-2 & 255));
|
||||
EXPECT_EQ(5248, unalaw(-127));
|
||||
EXPECT_EQ(5248, unalaw(-127 & 255));
|
||||
}
|
||||
|
||||
TEST(alaw, test) {
|
||||
int i;
|
||||
static const int V[][2] = {
|
||||
{42, -32768}, {42, -32691}, {42, -32376}, {42, -32328}, {42, -32235},
|
||||
{42, -31923}, {43, -31645}, {43, -31328}, {43, -31147}, {43, -31129},
|
||||
{43, -31110}, {43, -31092}, {43, -30824}, {43, -30728}, {40, -30473},
|
||||
{40, -30297}, {40, -30074}, {40, -30013}, {40, -29972}, {40, -29830},
|
||||
{40, -29707}, {41, -29595}, {41, -29384}, {41, -29235}, {41, -28959},
|
||||
{41, -28947}, {41, -28816}, {41, -28708}, {46, -28580}, {46, -28538},
|
||||
{46, -28483}, {46, -28256}, {46, -27976}, {46, -27829}, {47, -27644},
|
||||
{47, -27471}, {47, -27189}, {47, -27042}, {47, -26999}, {47, -26707},
|
||||
{44, -26610}, {44, -26464}, {44, -26145}, {44, -25897}, {44, -25722},
|
||||
{44, -25638}, {45, -25556}, {45, -25310}, {45, -25310}, {45, -25083},
|
||||
{45, -24986}, {45, -24920}, {45, -24676}, {45, -24650}, {34, -24565},
|
||||
{34, -24531}, {34, -24349}, {34, -24203}, {34, -24073}, {34, -23997},
|
||||
{34, -23804}, {34, -23714}, {34, -23654}, {35, -23435}, {35, -23370},
|
||||
{35, -23060}, {35, -22908}, {35, -22784}, {32, -22493}, {32, -22409},
|
||||
{32, -22342}, {32, -22018}, {32, -21952}, {32, -21866}, {32, -21699},
|
||||
{33, -21436}, {33, -21161}, {33, -21041}, {33, -20744}, {33, -20711},
|
||||
{38, -20430}, {38, -20300}, {38, -20162}, {38, -19939}, {38, -19820},
|
||||
{38, -19765}, {38, -19576}, {39, -19427}, {39, -19268}, {39, -19098},
|
||||
{39, -19049}, {39, -18888}, {39, -18845}, {39, -18803}, {39, -18528},
|
||||
{36, -18424}, {36, -18119}, {36, -17808}, {36, -17685}, {36, -17589},
|
||||
{36, -17481}, {37, -17397}, {37, -17190}, {37, -17119}, {37, -16916},
|
||||
{37, -16910}, {37, -16747}, {37, -16706}, {37, -16682}, {37, -16406},
|
||||
{58, -16311}, {58, -16292}, {58, -16187}, {58, -16103}, {59, -15864},
|
||||
{59, -15753}, {59, -15520}, {59, -15373}, {56, -15289}, {56, -15020},
|
||||
{57, -14748}, {57, -14604}, {57, -14538}, {62, -14315}, {62, -14236},
|
||||
{62, -14046}, {62, -14043}, {62, -13985}, {63, -13664}, {63, -13453},
|
||||
{60, -13143}, {60, -13099}, {60, -13044}, {60, -12802}, {61, -12538},
|
||||
{61, -12476}, {61, -12411}, {61, -12340}, {50, -12073}, {51, -11760},
|
||||
{51, -11442}, {48, -11133}, {48, -11102}, {48, -10928}, {48, -10791},
|
||||
{49, -10697}, {49, -10534}, {49, -10331}, {49, -10257}, {54, -9991},
|
||||
{54, -9732}, {55, -9714}, {55, -9544}, {55, -9389}, {55, -9385},
|
||||
{55, -9245}, {52, -9102}, {52, -8838}, {53, -8534}, {53, -8405},
|
||||
{53, -8321}, {53, -8232}, {10, -8101}, {11, -7879}, {8, -7650},
|
||||
{8, -7630}, {8, -7616}, {8, -7559}, {8, -7442}, {9, -7305},
|
||||
{9, -7267}, {14, -7141}, {14, -6962}, {15, -6838}, {15, -6734},
|
||||
{12, -6502}, {12, -6479}, {13, -6162}, {2, -6142}, {2, -5933},
|
||||
{3, -5648}, {0, -5523}, {1, -5291}, {1, -5149}, {6, -4868},
|
||||
{7, -4807}, {7, -4677}, {4, -4556}, {4, -4484}, {4, -4353},
|
||||
{5, -4149}, {26, -4048}, {27, -3935}, {24, -3720}, {31, -3447},
|
||||
{31, -3392}, {28, -3313}, {29, -3106}, {19, -2891}, {19, -2838},
|
||||
{16, -2745}, {17, -2663}, {22, -2481}, {20, -2184}, {21, -2084},
|
||||
{105, -1847}, {105, -1808}, {98, -1520}, {99, -1471}, {103, -1168},
|
||||
{126, -876}, {112, -673}, {119, -578}, {68, -287}, {88, -220},
|
||||
{81, -76}, {85, -13}, {213, 13}, {218, 253}, {197, 256},
|
||||
{245, 540}, {246, 634}, {248, 931}, {229, 1063}, {229, 1066},
|
||||
{225, 1305}, {227, 1451}, {239, 1715}, {239, 1725}, {235, 1982},
|
||||
{149, 2122}, {148, 2205}, {148, 2219}, {150, 2539}, {145, 2679},
|
||||
{144, 2752}, {146, 3025}, {156, 3239}, {156, 3239}, {159, 3346},
|
||||
{153, 3633}, {153, 3649}, {153, 3704}, {152, 3799}, {152, 3799},
|
||||
{154, 4089}, {132, 4369}, {132, 4606}, {135, 4712}, {134, 5031},
|
||||
{129, 5183}, {129, 5211}, {128, 5396}, {128, 5535}, {131, 5761},
|
||||
{131, 5821}, {131, 5878}, {130, 5970}, {141, 6156}, {141, 6206},
|
||||
{141, 6307}, {140, 6607}, {143, 6661}, {142, 6915}, {142, 7126},
|
||||
{137, 7296}, {137, 7391}, {139, 7684}, {139, 7707}, {139, 7736},
|
||||
{139, 7820}, {138, 7982}, {181, 8300}, {181, 8335}, {181, 8582},
|
||||
{181, 8655}, {180, 8850}, {180, 8961}, {180, 9008}, {183, 9301},
|
||||
{183, 9597}, {183, 9605}, {183, 9697}, {182, 9921}, {182, 10143},
|
||||
{182, 10223}, {177, 10477}, {177, 10749}, {176, 10951}, {176, 11121},
|
||||
{179, 11321}, {179, 11620}, {179, 11645}, {179, 11708}, {179, 11716},
|
||||
{179, 11763}, {178, 11949}, {178, 12271}, {178, 12287}, {189, 12514},
|
||||
{189, 12561}, {189, 12575}, {188, 12844}, {188, 13162}, {191, 13337},
|
||||
{191, 13631}, {190, 13957}, {190, 14175}, {190, 14270}, {185, 14411},
|
||||
{185, 14720}, {184, 14975}, {184, 15047}, {184, 15135}, {184, 15246},
|
||||
{187, 15477}, {187, 15491}, {187, 15581}, {187, 15646}, {187, 15785},
|
||||
{186, 15983}, {186, 15993}, {186, 16169}, {186, 16178}, {186, 16355},
|
||||
{165, 16536}, {165, 16850}, {165, 17132}, {165, 17366}, {164, 17593},
|
||||
{164, 17667}, {164, 17679}, {164, 17765}, {164, 17771}, {164, 17807},
|
||||
{164, 17843}, {164, 18079}, {164, 18325}, {167, 18625}, {167, 18931},
|
||||
{167, 19160}, {167, 19381}, {166, 19677}, {166, 19805}, {166, 19972},
|
||||
{166, 20140}, {166, 20404}, {161, 20515}, {161, 20767}, {161, 21071},
|
||||
{161, 21339}, {161, 21369}, {161, 21411}, {160, 21685}, {160, 21701},
|
||||
{160, 21963}, {160, 22109}, {160, 22187}, {160, 22197}, {160, 22378},
|
||||
{163, 22670}, {163, 22990}, {163, 23063}, {163, 23156}, {163, 23158},
|
||||
{163, 23459}, {163, 23471}, {162, 23792}, {162, 23955}, {162, 24163},
|
||||
{162, 24300}, {173, 24589}, {173, 24722}, {173, 24865}, {173, 25135},
|
||||
{173, 25225}, {173, 25341}, {173, 25480}, {172, 25653}, {172, 25779},
|
||||
{172, 26018}, {172, 26257}, {172, 26576}, {175, 26894}, {175, 27191},
|
||||
{175, 27294}, {175, 27468}, {175, 27498}, {175, 27575}, {175, 27644},
|
||||
{174, 27723}, {174, 27764}, {174, 27954}, {174, 27969}, {174, 27979},
|
||||
{174, 28059}, {174, 28124}, {174, 28330}, {174, 28408}, {174, 28627},
|
||||
{169, 28704}, {169, 28880}, {169, 29014}, {169, 29095}, {169, 29301},
|
||||
{169, 29429}, {169, 29515}, {169, 29520}, {169, 29661}, {168, 29812},
|
||||
{168, 30030}, {168, 30157}, {168, 30405}, {168, 30476}, {171, 30760},
|
||||
{171, 30883}, {171, 31029}, {171, 31249}, {171, 31482}, {171, 31578},
|
||||
{171, 31696}, {170, 31902}, {170, 32116}, {170, 32440}, {170, 32472},
|
||||
{170, 32711},
|
||||
};
|
||||
for (i = 0; i < ARRAYLEN(V); ++i) {
|
||||
ASSERT_EQ(V[i][0], alaw(V[i][1]));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(unalaw, test) {
|
||||
int i;
|
||||
static const int V[][2] = {
|
||||
{-5504, 0}, {-5248, 1}, {-6016, 2}, {-5760, 3}, {-4480, 4},
|
||||
{-4224, 5}, {-4992, 6}, {-4736, 7}, {-7552, 8}, {-7296, 9},
|
||||
{-8064, 10}, {-7808, 11}, {-6528, 12}, {-6272, 13}, {-7040, 14},
|
||||
{-6784, 15}, {-2752, 16}, {-2624, 17}, {-3008, 18}, {-2880, 19},
|
||||
{-2240, 20}, {-2112, 21}, {-2496, 22}, {-2368, 23}, {-3776, 24},
|
||||
{-3648, 25}, {-4032, 26}, {-3904, 27}, {-3264, 28}, {-3136, 29},
|
||||
{-3520, 30}, {-3392, 31}, {-22016, 32}, {-20992, 33}, {-24064, 34},
|
||||
{-23040, 35}, {-17920, 36}, {-16896, 37}, {-19968, 38}, {-18944, 39},
|
||||
{-30208, 40}, {-29184, 41}, {-32256, 42}, {-31232, 43}, {-26112, 44},
|
||||
{-25088, 45}, {-28160, 46}, {-27136, 47}, {-11008, 48}, {-10496, 49},
|
||||
{-12032, 50}, {-11520, 51}, {-8960, 52}, {-8448, 53}, {-9984, 54},
|
||||
{-9472, 55}, {-15104, 56}, {-14592, 57}, {-16128, 58}, {-15616, 59},
|
||||
{-13056, 60}, {-12544, 61}, {-14080, 62}, {-13568, 63}, {-344, 64},
|
||||
{-328, 65}, {-376, 66}, {-360, 67}, {-280, 68}, {-264, 69},
|
||||
{-312, 70}, {-296, 71}, {-472, 72}, {-456, 73}, {-504, 74},
|
||||
{-488, 75}, {-408, 76}, {-392, 77}, {-440, 78}, {-424, 79},
|
||||
{-88, 80}, {-72, 81}, {-120, 82}, {-104, 83}, {-24, 84},
|
||||
{-8, 85}, {-56, 86}, {-40, 87}, {-216, 88}, {-200, 89},
|
||||
{-248, 90}, {-232, 91}, {-152, 92}, {-136, 93}, {-184, 94},
|
||||
{-168, 95}, {-1376, 96}, {-1312, 97}, {-1504, 98}, {-1440, 99},
|
||||
{-1120, 100}, {-1056, 101}, {-1248, 102}, {-1184, 103}, {-1888, 104},
|
||||
{-1824, 105}, {-2016, 106}, {-1952, 107}, {-1632, 108}, {-1568, 109},
|
||||
{-1760, 110}, {-1696, 111}, {-688, 112}, {-656, 113}, {-752, 114},
|
||||
{-720, 115}, {-560, 116}, {-528, 117}, {-624, 118}, {-592, 119},
|
||||
{-944, 120}, {-912, 121}, {-1008, 122}, {-976, 123}, {-816, 124},
|
||||
{-784, 125}, {-880, 126}, {-848, 127}, {5504, 128}, {5248, 129},
|
||||
{6016, 130}, {5760, 131}, {4480, 132}, {4224, 133}, {4992, 134},
|
||||
{4736, 135}, {7552, 136}, {7296, 137}, {8064, 138}, {7808, 139},
|
||||
{6528, 140}, {6272, 141}, {7040, 142}, {6784, 143}, {2752, 144},
|
||||
{2624, 145}, {3008, 146}, {2880, 147}, {2240, 148}, {2112, 149},
|
||||
{2496, 150}, {2368, 151}, {3776, 152}, {3648, 153}, {4032, 154},
|
||||
{3904, 155}, {3264, 156}, {3136, 157}, {3520, 158}, {3392, 159},
|
||||
{22016, 160}, {20992, 161}, {24064, 162}, {23040, 163}, {17920, 164},
|
||||
{16896, 165}, {19968, 166}, {18944, 167}, {30208, 168}, {29184, 169},
|
||||
{32256, 170}, {31232, 171}, {26112, 172}, {25088, 173}, {28160, 174},
|
||||
{27136, 175}, {11008, 176}, {10496, 177}, {12032, 178}, {11520, 179},
|
||||
{8960, 180}, {8448, 181}, {9984, 182}, {9472, 183}, {15104, 184},
|
||||
{14592, 185}, {16128, 186}, {15616, 187}, {13056, 188}, {12544, 189},
|
||||
{14080, 190}, {13568, 191}, {344, 192}, {328, 193}, {376, 194},
|
||||
{360, 195}, {280, 196}, {264, 197}, {312, 198}, {296, 199},
|
||||
{472, 200}, {456, 201}, {504, 202}, {488, 203}, {408, 204},
|
||||
{392, 205}, {440, 206}, {424, 207}, {88, 208}, {72, 209},
|
||||
{120, 210}, {104, 211}, {24, 212}, {8, 213}, {56, 214},
|
||||
{40, 215}, {216, 216}, {200, 217}, {248, 218}, {232, 219},
|
||||
{152, 220}, {136, 221}, {184, 222}, {168, 223}, {1376, 224},
|
||||
{1312, 225}, {1504, 226}, {1440, 227}, {1120, 228}, {1056, 229},
|
||||
{1248, 230}, {1184, 231}, {1888, 232}, {1824, 233}, {2016, 234},
|
||||
{1952, 235}, {1632, 236}, {1568, 237}, {1760, 238}, {1696, 239},
|
||||
{688, 240}, {656, 241}, {752, 242}, {720, 243}, {560, 244},
|
||||
{528, 245}, {624, 246}, {592, 247}, {944, 248}, {912, 249},
|
||||
{1008, 250}, {976, 251}, {816, 252}, {784, 253}, {880, 254},
|
||||
{848, 255},
|
||||
};
|
||||
for (i = 0; i < ARRAYLEN(V); ++i) {
|
||||
ASSERT_EQ(V[i][0], unalaw(V[i][1]));
|
||||
}
|
||||
}
|
||||
|
||||
BENCH(alaw, bench) {
|
||||
char *p = gc(malloc(kHyperionSize));
|
||||
EZBENCH2("alaw -32k", donothing, alaw(-32768));
|
||||
EZBENCH2("alaw 32k", donothing, alaw(32767));
|
||||
EZBENCH2("unalaw 0", donothing, unalaw(0));
|
||||
EZBENCH2("unalaw 255", donothing, unalaw(255));
|
||||
}
|
138
test/dsp/core/mulaw_test.c
Normal file
138
test/dsp/core/mulaw_test.c
Normal file
|
@ -0,0 +1,138 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "dsp/core/core.h"
|
||||
#include "dsp/core/ituround.h"
|
||||
#include "libc/assert.h"
|
||||
#include "libc/macros.internal.h"
|
||||
#include "libc/math.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
TEST(mulaw, outOfRange) {
|
||||
EXPECT_EQ(0, mulaw(-32769));
|
||||
EXPECT_EQ(128, mulaw(32768));
|
||||
EXPECT_EQ(0, mulaw(-131072));
|
||||
EXPECT_EQ(128, mulaw(131072));
|
||||
}
|
||||
|
||||
TEST(unmulaw, outOfRange_modulo256) {
|
||||
EXPECT_EQ(8, unmulaw(-2));
|
||||
EXPECT_EQ(8, unmulaw(-2 & 255));
|
||||
EXPECT_EQ(31100, unmulaw(-127));
|
||||
EXPECT_EQ(31100, unmulaw(-127 & 255));
|
||||
}
|
||||
|
||||
TEST(mulaw, regressiontest) {
|
||||
int i;
|
||||
static const int V[][2] = {
|
||||
{13, -18474}, {143, 17241}, {131, 28876}, {10, -21786}, {146, 15194},
|
||||
{16, -16141}, {137, 23194}, {10, -22282}, {157, 9513}, {128, 31674},
|
||||
{143, 16891}, {13, -19214}, {15, -17028}, {172, 4896}, {11, -21318},
|
||||
{131, 28684}, {149, 13594}, {197, 1567}, {132, 27860}, {135, 25141},
|
||||
{147, 14699}, {144, 15757}, {140, 19422}, {29, -9374}, {4, -28099},
|
||||
{137, 22448}, {176, 3876}, {7, -24928}, {157, 9553}, {167, 6048},
|
||||
{133, 26527}, {9, -23278}, {29, -9188}, {24, -12091}, {136, 23694},
|
||||
{169, 5722}, {17, -15670}, {149, 13674}, {135, 24796}, {156, 10013},
|
||||
{201, 1279}, {144, 15844}, {21, -13686}, {8, -24136}, {161, 7629},
|
||||
{18, -15082}, {29, -9484}, {11, -20731}, {131, 28975}, {158, 8866},
|
||||
{134, 25514}, {36, -6936}, {29, -9348}, {167, 6082}, {25, -11235},
|
||||
{139, 20776}, {45, -4650}, {236, 179}, {141, 18807}, {10, -21498},
|
||||
{9, -22455}, {141, 19222}, {1, -31252}, {7, -25035}, {87, -665},
|
||||
{134, 25759}, {30, -9037}, {13, -18312}, {13, -18782}, {139, 21031},
|
||||
{187, 2466}, {141, 19229}, {131, 29425}, {7, -25428}, {10, -22393},
|
||||
{203, 1156}, {13, -19223}, {155, 10566}, {133, 27311}, {45, -4603},
|
||||
{134, 25985}, {161, 7595}, {1, -31305}, {130, 30274}, {133, 27410},
|
||||
{24, -11919}, {130, 29752}, {40, -5901}, {9, -22472}, {145, 15486},
|
||||
{62, -2154}, {172, 4888}, {140, 19967}, {142, 17750}, {7, -25279},
|
||||
{56, -2846}, {10, -21643}, {2, -30140}, {201, 1307}, {0, -32480},
|
||||
};
|
||||
for (i = 0; i < ARRAYLEN(V); ++i) {
|
||||
EXPECT_EQ(V[i][0], mulaw(V[i][1]));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(unmulaw, test) {
|
||||
int i;
|
||||
static const int V[][2] = {
|
||||
{-32124, 0}, {-31100, 1}, {-30076, 2}, {-29052, 3}, {-28028, 4},
|
||||
{-27004, 5}, {-25980, 6}, {-24956, 7}, {-23932, 8}, {-22908, 9},
|
||||
{-21884, 10}, {-20860, 11}, {-19836, 12}, {-18812, 13}, {-17788, 14},
|
||||
{-16764, 15}, {-15996, 16}, {-15484, 17}, {-14972, 18}, {-14460, 19},
|
||||
{-13948, 20}, {-13436, 21}, {-12924, 22}, {-12412, 23}, {-11900, 24},
|
||||
{-11388, 25}, {-10876, 26}, {-10364, 27}, {-9852, 28}, {-9340, 29},
|
||||
{-8828, 30}, {-8316, 31}, {-7932, 32}, {-7676, 33}, {-7420, 34},
|
||||
{-7164, 35}, {-6908, 36}, {-6652, 37}, {-6396, 38}, {-6140, 39},
|
||||
{-5884, 40}, {-5628, 41}, {-5372, 42}, {-5116, 43}, {-4860, 44},
|
||||
{-4604, 45}, {-4348, 46}, {-4092, 47}, {-3900, 48}, {-3772, 49},
|
||||
{-3644, 50}, {-3516, 51}, {-3388, 52}, {-3260, 53}, {-3132, 54},
|
||||
{-3004, 55}, {-2876, 56}, {-2748, 57}, {-2620, 58}, {-2492, 59},
|
||||
{-2364, 60}, {-2236, 61}, {-2108, 62}, {-1980, 63}, {-1884, 64},
|
||||
{-1820, 65}, {-1756, 66}, {-1692, 67}, {-1628, 68}, {-1564, 69},
|
||||
{-1500, 70}, {-1436, 71}, {-1372, 72}, {-1308, 73}, {-1244, 74},
|
||||
{-1180, 75}, {-1116, 76}, {-1052, 77}, {-988, 78}, {-924, 79},
|
||||
{-876, 80}, {-844, 81}, {-812, 82}, {-780, 83}, {-748, 84},
|
||||
{-716, 85}, {-684, 86}, {-652, 87}, {-620, 88}, {-588, 89},
|
||||
{-556, 90}, {-524, 91}, {-492, 92}, {-460, 93}, {-428, 94},
|
||||
{-396, 95}, {-372, 96}, {-356, 97}, {-340, 98}, {-324, 99},
|
||||
{-308, 100}, {-292, 101}, {-276, 102}, {-260, 103}, {-244, 104},
|
||||
{-228, 105}, {-212, 106}, {-196, 107}, {-180, 108}, {-164, 109},
|
||||
{-148, 110}, {-132, 111}, {-120, 112}, {-112, 113}, {-104, 114},
|
||||
{-96, 115}, {-88, 116}, {-80, 117}, {-72, 118}, {-64, 119},
|
||||
{-56, 120}, {-48, 121}, {-40, 122}, {-32, 123}, {-24, 124},
|
||||
{-16, 125}, {-8, 126}, {0, 127}, {32124, 128}, {31100, 129},
|
||||
{30076, 130}, {29052, 131}, {28028, 132}, {27004, 133}, {25980, 134},
|
||||
{24956, 135}, {23932, 136}, {22908, 137}, {21884, 138}, {20860, 139},
|
||||
{19836, 140}, {18812, 141}, {17788, 142}, {16764, 143}, {15996, 144},
|
||||
{15484, 145}, {14972, 146}, {14460, 147}, {13948, 148}, {13436, 149},
|
||||
{12924, 150}, {12412, 151}, {11900, 152}, {11388, 153}, {10876, 154},
|
||||
{10364, 155}, {9852, 156}, {9340, 157}, {8828, 158}, {8316, 159},
|
||||
{7932, 160}, {7676, 161}, {7420, 162}, {7164, 163}, {6908, 164},
|
||||
{6652, 165}, {6396, 166}, {6140, 167}, {5884, 168}, {5628, 169},
|
||||
{5372, 170}, {5116, 171}, {4860, 172}, {4604, 173}, {4348, 174},
|
||||
{4092, 175}, {3900, 176}, {3772, 177}, {3644, 178}, {3516, 179},
|
||||
{3388, 180}, {3260, 181}, {3132, 182}, {3004, 183}, {2876, 184},
|
||||
{2748, 185}, {2620, 186}, {2492, 187}, {2364, 188}, {2236, 189},
|
||||
{2108, 190}, {1980, 191}, {1884, 192}, {1820, 193}, {1756, 194},
|
||||
{1692, 195}, {1628, 196}, {1564, 197}, {1500, 198}, {1436, 199},
|
||||
{1372, 200}, {1308, 201}, {1244, 202}, {1180, 203}, {1116, 204},
|
||||
{1052, 205}, {988, 206}, {924, 207}, {876, 208}, {844, 209},
|
||||
{812, 210}, {780, 211}, {748, 212}, {716, 213}, {684, 214},
|
||||
{652, 215}, {620, 216}, {588, 217}, {556, 218}, {524, 219},
|
||||
{492, 220}, {460, 221}, {428, 222}, {396, 223}, {372, 224},
|
||||
{356, 225}, {340, 226}, {324, 227}, {308, 228}, {292, 229},
|
||||
{276, 230}, {260, 231}, {244, 232}, {228, 233}, {212, 234},
|
||||
{196, 235}, {180, 236}, {164, 237}, {148, 238}, {132, 239},
|
||||
{120, 240}, {112, 241}, {104, 242}, {96, 243}, {88, 244},
|
||||
{80, 245}, {72, 246}, {64, 247}, {56, 248}, {48, 249},
|
||||
{40, 250}, {32, 251}, {24, 252}, {16, 253}, {8, 254},
|
||||
{0, 255},
|
||||
};
|
||||
for (i = 0; i < ARRAYLEN(V); ++i) {
|
||||
EXPECT_EQ(V[i][0], unmulaw(V[i][1]));
|
||||
}
|
||||
}
|
||||
|
||||
BENCH(mulaw, bench) {
|
||||
EZBENCH2("mulaw -32k", donothing, mulaw(-32768));
|
||||
EZBENCH2("mulaw 32k", donothing, mulaw(32767));
|
||||
EZBENCH2("unmulaw 0", donothing, unmulaw(0));
|
||||
EZBENCH2("unmulaw 255", donothing, unmulaw(255));
|
||||
}
|
50
test/libc/bits/countbits_test.c
Normal file
50
test/libc/bits/countbits_test.c
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/bits/bits.h"
|
||||
#include "libc/bits/popcnt.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/hyperion.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
TEST(_countbits, testLow) {
|
||||
int i;
|
||||
char p[2];
|
||||
for (i = 0; i < 65536; ++i) {
|
||||
p[0] = i >> 0;
|
||||
p[1] = i >> 8;
|
||||
ASSERT_EQ(__builtin_popcount(i), _countbits(p, 2), "i=%d", i);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(_countbits, test) {
|
||||
int i;
|
||||
char *p = gc(memset(malloc(256), 0x55, 256));
|
||||
for (i = 0; i < 256; ++i) {
|
||||
ASSERT_EQ(i * CHAR_BIT / 2, _countbits(p, i), "i=%d", i);
|
||||
}
|
||||
}
|
||||
|
||||
BENCH(countbits, bench) {
|
||||
EZBENCH_N("_countbits", 7, _countbits(kHyperion, 7));
|
||||
EZBENCH_N("_countbits", 8, _countbits(kHyperion, 8));
|
||||
EZBENCH_N("_countbits", 16, _countbits(kHyperion, 16));
|
||||
EZBENCH_N("_countbits", kHyperionSize, _countbits(kHyperion, kHyperionSize));
|
||||
}
|
|
@ -25,6 +25,8 @@ TEST_LIBC_BITS_CHECKS = \
|
|||
TEST_LIBC_BITS_DIRECTDEPS = \
|
||||
LIBC_BITS \
|
||||
LIBC_INTRIN \
|
||||
LIBC_MEM \
|
||||
LIBC_RUNTIME \
|
||||
LIBC_NEXGEN32E \
|
||||
LIBC_STUBS \
|
||||
LIBC_TESTLIB \
|
||||
|
|
|
@ -49,24 +49,12 @@ TEST(mkntcmdline, spaceInArgument_getQuotesWrappedAround) {
|
|||
EXPECT_STREQ(u"echo \"hello there\" world", cmdline);
|
||||
}
|
||||
|
||||
TEST(mkntcmdline, justQuote) {
|
||||
char *argv[] = {"\"", NULL};
|
||||
EXPECT_NE(-1, mkntcmdline(cmdline, argv[0], argv));
|
||||
EXPECT_STREQ(u"\"\\\"\"", cmdline);
|
||||
}
|
||||
|
||||
TEST(mkntcmdline, justSlash) {
|
||||
char *argv[] = {"\\", NULL};
|
||||
EXPECT_NE(-1, mkntcmdline(cmdline, argv[0], argv));
|
||||
EXPECT_STREQ(u"\\", cmdline);
|
||||
}
|
||||
|
||||
TEST(mkntcmdline, justSlashQuote) {
|
||||
char *argv[] = {"\\\"", NULL};
|
||||
EXPECT_NE(-1, mkntcmdline(cmdline, argv[0], argv));
|
||||
EXPECT_STREQ(u"\"\\\\\\\"\"" /* "\\\"" */, cmdline);
|
||||
}
|
||||
|
||||
TEST(mkntcmdline, basicQuoting) {
|
||||
char *argv[] = {"a\"b c", "d", NULL};
|
||||
EXPECT_NE(-1, mkntcmdline(cmdline, argv[0], argv));
|
||||
|
@ -83,3 +71,16 @@ TEST(mkntcmdline, testUnicode) {
|
|||
EXPECT_STREQ(u"(╯°□°)╯ \"要依法治国是赞美那些谁是公义的和惩罚恶人。 - 韩非\"",
|
||||
cmdline);
|
||||
}
|
||||
|
||||
TEST(mkntcmdline, fix) {
|
||||
char *argv1[] = {
|
||||
"C:/WINDOWS/system32/cmd.exe",
|
||||
"/C",
|
||||
"more < \"C:\\Users\\jtunn\\AppData\\Local\\Temp\\tmplquaa_d6\"",
|
||||
NULL,
|
||||
};
|
||||
EXPECT_NE(-1, mkntcmdline(cmdline, argv1[0], argv1));
|
||||
EXPECT_STREQ(u"C:\\WINDOWS\\system32\\cmd.exe /C \"more < "
|
||||
u"\\\"C:\\Users\\jtunn\\AppData\\Local\\Temp\\tmplquaa_d6\\\"\"",
|
||||
cmdline);
|
||||
}
|
||||
|
|
|
@ -442,22 +442,126 @@ TEST(wcstol, testBase36) {
|
|||
EXPECT_EQ(29234652, wcstol(L"HELLO", 0, 36));
|
||||
}
|
||||
|
||||
BENCH(atoi, bench) {
|
||||
EZBENCH2("atoi", donothing, EXPROPRIATE(atoi(VEIL("r", "123456789"))));
|
||||
EZBENCH2("strtol", donothing,
|
||||
EXPROPRIATE(strtol(VEIL("r", "123456789"), 0, 10)));
|
||||
EZBENCH2("strtoul", donothing,
|
||||
EXPROPRIATE(strtol(VEIL("r", "123456789"), 0, 10)));
|
||||
EZBENCH2("wcstol", donothing,
|
||||
EXPROPRIATE(wcstol(VEIL("r", L"123456789"), 0, 10)));
|
||||
EZBENCH2("wcstoul", donothing,
|
||||
EXPROPRIATE(wcstol(VEIL("r", L"123456789"), 0, 10)));
|
||||
EZBENCH2("strtoimax", donothing,
|
||||
EXPROPRIATE(strtoimax(VEIL("r", "123456789"), 0, 10)));
|
||||
EZBENCH2("strtoumax", donothing,
|
||||
EXPROPRIATE(strtoimax(VEIL("r", "123456789"), 0, 10)));
|
||||
EZBENCH2("wcstoimax", donothing,
|
||||
EXPROPRIATE(wcstoimax(VEIL("r", L"123456789"), 0, 10)));
|
||||
EZBENCH2("wcstoumax", donothing,
|
||||
EXPROPRIATE(wcstoimax(VEIL("r", L"123456789"), 0, 10)));
|
||||
TEST(strtol, testWormsMeat) {
|
||||
ASSERT_EQ(0x4e00, strtol("0x4e00", 0, 0));
|
||||
}
|
||||
|
||||
TEST(strtol, testIBM) {
|
||||
char *e;
|
||||
ASSERT_EQ(1, strtol("1e-", &e, 10));
|
||||
ASSERT_STREQ("e-", e);
|
||||
ASSERT_EQ(0, strtol("-", &e, 10));
|
||||
ASSERT_STREQ("-", e);
|
||||
ASSERT_EQ(0, strtol("0f", &e, 10));
|
||||
ASSERT_STREQ("f", e);
|
||||
}
|
||||
|
||||
TEST(strtoul, testIBM) {
|
||||
char *e;
|
||||
ASSERT_EQ(1, strtoul("1e-", &e, 10));
|
||||
ASSERT_STREQ("e-", e);
|
||||
ASSERT_EQ(0, strtoul("-", &e, 10));
|
||||
ASSERT_STREQ("-", e);
|
||||
ASSERT_EQ(0, strtoul("0f", &e, 10));
|
||||
ASSERT_STREQ("f", e);
|
||||
}
|
||||
|
||||
TEST(strtoll, testIBM) {
|
||||
char *e;
|
||||
ASSERT_EQ(1, strtoll("1e-", &e, 10));
|
||||
ASSERT_STREQ("e-", e);
|
||||
ASSERT_EQ(0, strtoll("-", &e, 10));
|
||||
ASSERT_STREQ("-", e);
|
||||
ASSERT_EQ(0, strtoll("0f", &e, 10));
|
||||
ASSERT_STREQ("f", e);
|
||||
}
|
||||
|
||||
TEST(strtoull, testIBM) {
|
||||
char *e;
|
||||
ASSERT_EQ(1, strtoull("1e-", &e, 10));
|
||||
ASSERT_STREQ("e-", e);
|
||||
ASSERT_EQ(0, strtoull("-", &e, 10));
|
||||
ASSERT_STREQ("-", e);
|
||||
ASSERT_EQ(0, strtoull("0f", &e, 10));
|
||||
ASSERT_STREQ("f", e);
|
||||
}
|
||||
|
||||
TEST(strtoimax, testIBM) {
|
||||
char *e;
|
||||
ASSERT_EQ(1, strtoimax("1e-", &e, 10));
|
||||
ASSERT_STREQ("e-", e);
|
||||
ASSERT_EQ(0, strtoimax("-", &e, 10));
|
||||
ASSERT_STREQ("-", e);
|
||||
ASSERT_EQ(0, strtoimax("0f", &e, 10));
|
||||
ASSERT_STREQ("f", e);
|
||||
}
|
||||
|
||||
TEST(strtoumax, testIBM) {
|
||||
char *e;
|
||||
ASSERT_EQ(1, strtoumax("1e-", &e, 10));
|
||||
ASSERT_STREQ("e-", e);
|
||||
ASSERT_EQ(0, strtoumax("-", &e, 10));
|
||||
ASSERT_STREQ("-", e);
|
||||
ASSERT_EQ(0, strtoumax("0f", &e, 10));
|
||||
ASSERT_STREQ("f", e);
|
||||
}
|
||||
|
||||
TEST(wcstol, testIBM) {
|
||||
wchar_t *e;
|
||||
ASSERT_EQ(1, wcstol(L"1e-", &e, 10));
|
||||
ASSERT_STREQ(L"e-", e);
|
||||
ASSERT_EQ(0, wcstol(L"-", &e, 10));
|
||||
ASSERT_STREQ(L"-", e);
|
||||
ASSERT_EQ(0, wcstol(L"0f", &e, 10));
|
||||
ASSERT_STREQ(L"f", e);
|
||||
}
|
||||
|
||||
TEST(wcstoul, testIBM) {
|
||||
wchar_t *e;
|
||||
ASSERT_EQ(1, wcstoul(L"1e-", &e, 10));
|
||||
ASSERT_STREQ(L"e-", e);
|
||||
ASSERT_EQ(0, wcstoul(L"-", &e, 10));
|
||||
ASSERT_STREQ(L"-", e);
|
||||
ASSERT_EQ(0, wcstoul(L"0f", &e, 10));
|
||||
ASSERT_STREQ(L"f", e);
|
||||
}
|
||||
|
||||
TEST(wcstoimax, testIBM) {
|
||||
wchar_t *e;
|
||||
ASSERT_EQ(1, wcstoimax(L"1e-", &e, 10));
|
||||
ASSERT_STREQ(L"e-", e);
|
||||
ASSERT_EQ(0, wcstoimax(L"-", &e, 10));
|
||||
ASSERT_STREQ(L"-", e);
|
||||
ASSERT_EQ(0, wcstoimax(L"0f", &e, 10));
|
||||
ASSERT_STREQ(L"f", e);
|
||||
}
|
||||
|
||||
TEST(wcstoumax, testIBM) {
|
||||
wchar_t *e;
|
||||
ASSERT_EQ(1, wcstoumax(L"1e-", &e, 10));
|
||||
ASSERT_STREQ(L"e-", e);
|
||||
ASSERT_EQ(0, wcstoumax(L"-", &e, 10));
|
||||
ASSERT_STREQ(L"-", e);
|
||||
ASSERT_EQ(0, wcstoumax(L"0f", &e, 10));
|
||||
ASSERT_STREQ(L"f", e);
|
||||
}
|
||||
|
||||
BENCH(atoi, bench) {
|
||||
EZBENCH2("atoi 10⁸", donothing, EXPROPRIATE(atoi(VEIL("r", "100000000"))));
|
||||
EZBENCH2("strtol 10⁸", donothing,
|
||||
EXPROPRIATE(strtol(VEIL("r", "100000000"), 0, 10)));
|
||||
EZBENCH2("strtoul 10⁸", donothing,
|
||||
EXPROPRIATE(strtol(VEIL("r", "100000000"), 0, 10)));
|
||||
EZBENCH2("wcstol 10⁸", donothing,
|
||||
EXPROPRIATE(wcstol(VEIL("r", L"100000000"), 0, 10)));
|
||||
EZBENCH2("wcstoul 10⁸", donothing,
|
||||
EXPROPRIATE(wcstol(VEIL("r", L"100000000"), 0, 10)));
|
||||
EZBENCH2("strtoimax 10⁸", donothing,
|
||||
EXPROPRIATE(strtoimax(VEIL("r", "100000000"), 0, 10)));
|
||||
EZBENCH2("strtoumax 10⁸", donothing,
|
||||
EXPROPRIATE(strtoimax(VEIL("r", "100000000"), 0, 10)));
|
||||
EZBENCH2("wcstoimax 10⁸", donothing,
|
||||
EXPROPRIATE(wcstoimax(VEIL("r", L"100000000"), 0, 10)));
|
||||
EZBENCH2("wcstoumax 10⁸", donothing,
|
||||
EXPROPRIATE(wcstoimax(VEIL("r", L"100000000"), 0, 10)));
|
||||
}
|
||||
|
|
83
test/libc/fmt/formatint64thousands_test.c
Normal file
83
test/libc/fmt/formatint64thousands_test.c
Normal file
|
@ -0,0 +1,83 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/fmt/itoa.h"
|
||||
#include "libc/limits.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
TEST(FormatUint64Thousands, test) {
|
||||
char s[27];
|
||||
EXPECT_EQ(s + 1, FormatUint64Thousands(s, 0));
|
||||
EXPECT_STREQ("0", s);
|
||||
EXPECT_EQ(s + 1, FormatUint64Thousands(s, 1));
|
||||
EXPECT_STREQ("1", s);
|
||||
EXPECT_EQ(s + 3, FormatUint64Thousands(s, 999));
|
||||
EXPECT_STREQ("999", s);
|
||||
EXPECT_EQ(s + 5, FormatUint64Thousands(s, 1000));
|
||||
EXPECT_STREQ("1,000", s);
|
||||
EXPECT_EQ(s + 7, FormatUint64Thousands(s, 999999));
|
||||
EXPECT_STREQ("999,999", s);
|
||||
EXPECT_EQ(s + 9, FormatUint64Thousands(s, 1000000));
|
||||
EXPECT_STREQ("1,000,000", s);
|
||||
EXPECT_EQ(s + 7, FormatUint64Thousands(s, 104040));
|
||||
EXPECT_STREQ("104,040", s);
|
||||
}
|
||||
|
||||
TEST(FormatInt64Thousands, testPositive) {
|
||||
char s[27];
|
||||
EXPECT_EQ(s + 1, FormatInt64Thousands(s, 0));
|
||||
EXPECT_STREQ("0", s);
|
||||
EXPECT_EQ(s + 1, FormatInt64Thousands(s, 1));
|
||||
EXPECT_STREQ("1", s);
|
||||
EXPECT_EQ(s + 3, FormatInt64Thousands(s, 999));
|
||||
EXPECT_STREQ("999", s);
|
||||
EXPECT_EQ(s + 5, FormatInt64Thousands(s, 1000));
|
||||
EXPECT_STREQ("1,000", s);
|
||||
EXPECT_EQ(s + 7, FormatInt64Thousands(s, 999999));
|
||||
EXPECT_STREQ("999,999", s);
|
||||
EXPECT_EQ(s + 9, FormatInt64Thousands(s, 1000000));
|
||||
EXPECT_STREQ("1,000,000", s);
|
||||
}
|
||||
|
||||
TEST(FormatInt64Thousands, testNegative) {
|
||||
char s[27];
|
||||
EXPECT_EQ(s + 2, FormatInt64Thousands(s, -1));
|
||||
EXPECT_STREQ("-1", s);
|
||||
EXPECT_EQ(s + 4, FormatInt64Thousands(s, -999));
|
||||
EXPECT_STREQ("-999", s);
|
||||
EXPECT_EQ(s + 6, FormatInt64Thousands(s, -1000));
|
||||
EXPECT_STREQ("-1,000", s);
|
||||
EXPECT_EQ(s + 8, FormatInt64Thousands(s, -999999));
|
||||
EXPECT_STREQ("-999,999", s);
|
||||
EXPECT_EQ(s + 10, FormatInt64Thousands(s, -1000000));
|
||||
EXPECT_STREQ("-1,000,000", s);
|
||||
}
|
||||
|
||||
BENCH(FormatInt64Thousands, bench) {
|
||||
char s[27];
|
||||
EZBENCH2("int64toarray_radix10(MAX)", donothing,
|
||||
int64toarray_radix10(INT64_MAX, s));
|
||||
EZBENCH2("FormatInt64Thousands(MAX)", donothing,
|
||||
FormatInt64Thousands(s, INT64_MAX));
|
||||
EZBENCH2("FormatInt64Thousands(MIN)", donothing,
|
||||
FormatInt64Thousands(s, INT64_MIN));
|
||||
EZBENCH2("FormatUint64Thousands(MIN)", donothing,
|
||||
FormatUint64Thousands(s, UINT64_MAX));
|
||||
}
|
|
@ -30,26 +30,55 @@
|
|||
*/
|
||||
|
||||
TEST(strerror, e2big) {
|
||||
EXPECT_STARTSWITH("E2BIG", strerror(E2BIG));
|
||||
if (IsTiny()) {
|
||||
EXPECT_STARTSWITH("E2BIG", strerror(E2BIG));
|
||||
} else {
|
||||
EXPECT_STARTSWITH("E2BIG[Arg list too long]", strerror(E2BIG));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(strerror, enosys) {
|
||||
EXPECT_STARTSWITH("ENOSYS", strerror(ENOSYS));
|
||||
if (IsTiny()) {
|
||||
EXPECT_STARTSWITH("ENOSYS", strerror(ENOSYS));
|
||||
} else {
|
||||
EXPECT_STARTSWITH("ENOSYS[Function not implemented]", strerror(ENOSYS));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(strerror, einval) {
|
||||
EXPECT_STARTSWITH("EINVAL", strerror(EINVAL));
|
||||
if (IsTiny()) {
|
||||
EXPECT_STARTSWITH("EINVAL", strerror(EINVAL));
|
||||
} else {
|
||||
EXPECT_STARTSWITH("EINVAL[Invalid argument]", strerror(EINVAL));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(strerror, symbolizingTheseNumbersAsErrorsIsHeresyInUnixStyle) {
|
||||
EXPECT_STARTSWITH("EUNKNOWN", strerror(0));
|
||||
EXPECT_STARTSWITH("EUNKNOWN", strerror(-1));
|
||||
if (IsTiny()) {
|
||||
EXPECT_STARTSWITH("EUNKNOWN", strerror(0));
|
||||
} else {
|
||||
EXPECT_STARTSWITH("EUNKNOWN[No error information]", strerror(0));
|
||||
}
|
||||
if (IsTiny()) {
|
||||
EXPECT_STARTSWITH("EUNKNOWN", strerror(-1));
|
||||
} else {
|
||||
EXPECT_STARTSWITH("EUNKNOWN[No error information]", strerror(-1));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(strerror, enotconn_orLinkerIsntUsingLocaleC_orCodeIsOutOfSync) {
|
||||
EXPECT_STARTSWITH("ENOTCONN", strerror(ENOTCONN));
|
||||
if (IsTiny()) {
|
||||
EXPECT_STARTSWITH("ENOTCONN", strerror(ENOTCONN));
|
||||
} else {
|
||||
EXPECT_STARTSWITH("ENOTCONN[Transport endpoint is not connected]",
|
||||
strerror(ENOTCONN));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(strerror, exfull_orLinkerIsntUsingLocaleC_orCodeIsOutOfSync) {
|
||||
EXPECT_STARTSWITH("ETXTBSY", strerror(ETXTBSY));
|
||||
if (IsTiny()) {
|
||||
EXPECT_STARTSWITH("ETXTBSY", strerror(ETXTBSY));
|
||||
} else {
|
||||
EXPECT_STARTSWITH("ETXTBSY[Text file busy]", strerror(ETXTBSY));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,8 +17,14 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/dce.h"
|
||||
#include "libc/fmt/fmt.h"
|
||||
#include "libc/intrin/asan.internal.h"
|
||||
#include "libc/log/log.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
TEST(asan, test) {
|
||||
|
@ -40,3 +46,45 @@ TEST(asan, test) {
|
|||
EXPECT_TRUE(__asan_is_valid(p + 1, 64 + 2));
|
||||
EXPECT_FALSE(__asan_is_valid(p + 1, 64 + 3));
|
||||
}
|
||||
|
||||
TEST(asan, testEmptySize_isAlwaysValid) {
|
||||
if (!IsAsan()) return;
|
||||
EXPECT_TRUE(__asan_is_valid(0, 0));
|
||||
EXPECT_TRUE(__asan_is_valid((void *)(intptr_t)-2, 0));
|
||||
EXPECT_TRUE(__asan_is_valid((void *)(intptr_t)9999, 0));
|
||||
}
|
||||
|
||||
TEST(asan, testBigSize_worksFine) {
|
||||
char *p;
|
||||
if (!IsAsan()) return;
|
||||
p = malloc(64 * 1024);
|
||||
EXPECT_TRUE(__asan_is_valid(p, 64 * 1024));
|
||||
EXPECT_FALSE(__asan_is_valid(p - 1, 64 * 1024));
|
||||
EXPECT_FALSE(__asan_is_valid(p + 1, 64 * 1024));
|
||||
EXPECT_TRUE(__asan_is_valid(p + 1, 64 * 1024 - 1));
|
||||
free(p);
|
||||
}
|
||||
|
||||
TEST(asan, testUnmappedShadowMemory_doesntSegfault) {
|
||||
if (!IsAsan()) return;
|
||||
EXPECT_FALSE(__asan_is_valid(0, 1));
|
||||
EXPECT_FALSE(__asan_is_valid((void *)(intptr_t)-1, 1));
|
||||
EXPECT_FALSE(__asan_is_valid((void *)(intptr_t)-2, 1));
|
||||
EXPECT_FALSE(__asan_is_valid((void *)(intptr_t)9999, 1));
|
||||
EXPECT_FALSE(__asan_is_valid(0, 7));
|
||||
EXPECT_FALSE(__asan_is_valid((void *)(intptr_t)-1, 7));
|
||||
EXPECT_FALSE(__asan_is_valid((void *)(intptr_t)-2, 7));
|
||||
EXPECT_FALSE(__asan_is_valid((void *)(intptr_t)9999, 7));
|
||||
}
|
||||
|
||||
BENCH(asan, bench) {
|
||||
char *p;
|
||||
size_t n, m;
|
||||
if (!IsAsan()) return;
|
||||
m = 4 * 1024 * 1024;
|
||||
p = gc(malloc(m));
|
||||
EZBENCH_N("__asan_check", 0, __asan_check(p, 0));
|
||||
for (n = 2; n <= m; n *= 2) {
|
||||
EZBENCH_N("__asan_check", n, __asan_check(p, n));
|
||||
}
|
||||
}
|
||||
|
|
341
test/libc/intrin/memcmp_test.c
Normal file
341
test/libc/intrin/memcmp_test.c
Normal file
|
@ -0,0 +1,341 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/fastrandomstring.h"
|
||||
#include "libc/testlib/hyperion.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
int golden(const void *p, const void *q, size_t n) {
|
||||
int c;
|
||||
size_t i;
|
||||
for (i = 0; i < n; ++i) {
|
||||
if ((c = ((const unsigned char *)p)[i] - ((const unsigned char *)q)[i])) {
|
||||
return c;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
TEST(memcmp, test) {
|
||||
EXPECT_EQ(0, memcmp("hi", "hi", 2));
|
||||
EXPECT_NE(0, memcmp("hi", "HI", 2));
|
||||
EXPECT_EQ(-1, memcmp("a", "b", 1));
|
||||
EXPECT_EQ(+1, memcmp("b", "a", 1));
|
||||
}
|
||||
|
||||
TEST(memcmp, hug) {
|
||||
int i, j, g;
|
||||
char a[128] = {0};
|
||||
char b[128] = {0};
|
||||
for (j = 0; j < 128; ++j) {
|
||||
for (i = 0; i < j; ++i) {
|
||||
a[i] = 1;
|
||||
g = golden(a, b, j);
|
||||
ASSERT_EQ(g, memcmp(a, b, j), "i=%d j=%d", i, j);
|
||||
ASSERT_EQ(!!g, !!bcmp(a, b, j), "i=%d j=%d", i, j);
|
||||
ASSERT_EQ(!!g, !!timingsafe_bcmp(a, b, j), "i=%d", i);
|
||||
ASSERT_EQ(MAX(-1, MIN(1, g)), timingsafe_memcmp(a, b, j), "i=%d", i);
|
||||
a[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(memcmp, fuzz) {
|
||||
int i, o, n, g;
|
||||
char a[256], b[256];
|
||||
for (i = 0; i < 100000; ++i) {
|
||||
rngset(a, sizeof(a), rand64, -1);
|
||||
memcpy(b, a, sizeof(a));
|
||||
if (rand() & 1) {
|
||||
a[rand() % sizeof(a)] += rand();
|
||||
} else {
|
||||
b[rand() % sizeof(a)] += rand();
|
||||
}
|
||||
if (rand() & 1) {
|
||||
a[rand() % sizeof(a)] += rand();
|
||||
} else {
|
||||
b[rand() % sizeof(a)] += rand();
|
||||
}
|
||||
o = rand() & 31;
|
||||
n = rand() % (sizeof(a) - o);
|
||||
g = golden(a + o, b + o, n);
|
||||
ASSERT_EQ(g, memcmp(a + o, b + o, n), "n=%d o=%d", n, o);
|
||||
ASSERT_EQ(!!g, !!bcmp(a + o, b + o, n), "n=%d o=%d", n, o);
|
||||
ASSERT_EQ(!!g, !!timingsafe_bcmp(a + o, b + o, n), "n=%d o=%d", n, o);
|
||||
ASSERT_EQ(MAX(-1, MIN(1, g)), timingsafe_memcmp(a + o, b + o, n),
|
||||
"n=%d o=%d", n, o);
|
||||
}
|
||||
}
|
||||
|
||||
int buncmp(const void *, const void *, size_t) asm("bcmp");
|
||||
int funcmp(const void *, const void *, size_t) asm("memcmp");
|
||||
|
||||
BENCH(bcmp, bench) {
|
||||
volatile int v;
|
||||
const char *volatile a;
|
||||
const char *volatile b;
|
||||
b = a = "123456789123456789123456789123456789123456789123456789";
|
||||
b = gc(strdup(b));
|
||||
EZBENCH_N("bcmp", 0, v = buncmp(a, b, 0));
|
||||
EZBENCH_N("bcmp", 1, v = buncmp(a, b, 1));
|
||||
EZBENCH_N("bcmp", 2, v = buncmp(a, b, 2));
|
||||
EZBENCH_N("bcmp", 3, v = buncmp(a, b, 3));
|
||||
EZBENCH_N("𝗯𝗰𝗺𝗽", 4, v = buncmp(a, b, 4));
|
||||
EZBENCH_N("bcmp", 5, v = buncmp(a, b, 5));
|
||||
EZBENCH_N("bcmp", 6, v = buncmp(a, b, 6));
|
||||
EZBENCH_N("bcmp", 7, v = buncmp(a, b, 7));
|
||||
EZBENCH_N("𝗯𝗰𝗺𝗽", 8, v = buncmp(a, b, 8));
|
||||
EZBENCH_N("bcmp", 9, v = buncmp(a, b, 9));
|
||||
EZBENCH_N("bcmp", 15, v = buncmp(a, b, 15));
|
||||
EZBENCH_N("𝗯𝗰𝗺𝗽", 16, v = buncmp(a, b, 16));
|
||||
EZBENCH_N("bcmp", 17, v = buncmp(a, b, 17));
|
||||
EZBENCH_N("bcmp", 31, v = buncmp(a, b, 31));
|
||||
EZBENCH_N("bcmp", 32, v = buncmp(a, b, 32));
|
||||
a = kHyperion;
|
||||
b = gc(strdup(kHyperion));
|
||||
EZBENCH_N("bcmp", 33, v = buncmp(a, b, 33));
|
||||
EZBENCH_N("bcmp", 79, v = buncmp(a, b, 79));
|
||||
EZBENCH_N("𝗯𝗰𝗺𝗽", 80, v = buncmp(a, b, 80));
|
||||
EZBENCH_N("bcmp", 128, v = buncmp(a, b, 128));
|
||||
EZBENCH_N("bcmp", 256, v = buncmp(a, b, 256));
|
||||
a = gc(malloc(16 * 1024));
|
||||
b = gc(malloc(16 * 1024));
|
||||
rngset(a, 16 * 1024, vigna, -1);
|
||||
memcpy(b, a, 16 * 1024);
|
||||
EZBENCH_N("bcmp", 16384, v = buncmp(a, b, 16384));
|
||||
a = gc(malloc(32 * 1024));
|
||||
b = gc(malloc(32 * 1024));
|
||||
rngset(a, 32 * 1024, vigna, -1);
|
||||
memcpy(b, a, 32 * 1024);
|
||||
EZBENCH_N("bcmp", 32768, v = buncmp(a, b, 32768));
|
||||
a = gc(malloc(128 * 1024));
|
||||
b = gc(malloc(128 * 1024));
|
||||
rngset(a, 128 * 1024, vigna, -1);
|
||||
memcpy(b, a, 128 * 1024);
|
||||
EZBENCH_N("bcmp", 131072, v = buncmp(a, b, 131072));
|
||||
}
|
||||
|
||||
BENCH(memcmp, bench) {
|
||||
volatile int v;
|
||||
const char *volatile a;
|
||||
const char *volatile b;
|
||||
b = a = "123456789123456789123456789123456789123456789123456789";
|
||||
b = gc(strdup(b));
|
||||
EZBENCH_N("memcmp", 0, v = funcmp(a, b, 0));
|
||||
EZBENCH_N("memcmp", 1, v = funcmp(a, b, 1));
|
||||
EZBENCH_N("memcmp", 2, v = funcmp(a, b, 2));
|
||||
EZBENCH_N("memcmp", 3, v = funcmp(a, b, 3));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗺𝗽", 4, v = funcmp(a, b, 4));
|
||||
EZBENCH_N("memcmp", 5, v = funcmp(a, b, 5));
|
||||
EZBENCH_N("memcmp", 6, v = funcmp(a, b, 6));
|
||||
EZBENCH_N("memcmp", 7, v = funcmp(a, b, 7));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗺𝗽", 8, v = funcmp(a, b, 8));
|
||||
EZBENCH_N("memcmp", 9, v = funcmp(a, b, 9));
|
||||
EZBENCH_N("memcmp", 15, v = funcmp(a, b, 15));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗺𝗽", 16, v = funcmp(a, b, 16));
|
||||
EZBENCH_N("memcmp", 17, v = funcmp(a, b, 17));
|
||||
EZBENCH_N("memcmp", 31, v = funcmp(a, b, 31));
|
||||
EZBENCH_N("memcmp", 32, v = funcmp(a, b, 32));
|
||||
a = kHyperion;
|
||||
b = gc(strdup(kHyperion));
|
||||
EZBENCH_N("memcmp", 33, v = funcmp(a, b, 33));
|
||||
EZBENCH_N("memcmp", 79, v = funcmp(a, b, 79));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗺𝗽", 80, v = funcmp(a, b, 80));
|
||||
EZBENCH_N("memcmp", 128, v = funcmp(a, b, 128));
|
||||
EZBENCH_N("memcmp", 256, v = funcmp(a, b, 256));
|
||||
a = gc(malloc(16 * 1024));
|
||||
b = gc(malloc(16 * 1024));
|
||||
rngset(a, 16 * 1024, vigna, -1);
|
||||
memcpy(b, a, 16 * 1024);
|
||||
EZBENCH_N("memcmp", 16384, v = funcmp(a, b, 16384));
|
||||
a = gc(malloc(32 * 1024));
|
||||
b = gc(malloc(32 * 1024));
|
||||
rngset(a, 32 * 1024, vigna, -1);
|
||||
memcpy(b, a, 32 * 1024);
|
||||
EZBENCH_N("memcmp", 32768, v = funcmp(a, b, 32768));
|
||||
a = gc(malloc(128 * 1024));
|
||||
b = gc(malloc(128 * 1024));
|
||||
rngset(a, 128 * 1024, vigna, -1);
|
||||
memcpy(b, a, 128 * 1024);
|
||||
EZBENCH_N("memcmp", 131072, v = funcmp(a, b, 131072));
|
||||
}
|
||||
|
||||
BENCH(timingsafe_memcmp, bench) {
|
||||
volatile int v;
|
||||
const char *volatile a;
|
||||
const char *volatile b;
|
||||
b = a = "123456789123456789123456789123456789123456789123456789";
|
||||
b = gc(strdup(b));
|
||||
EZBENCH_N("timingsafe_memcmp", 0, v = timingsafe_memcmp(a, b, 0));
|
||||
EZBENCH_N("timingsafe_memcmp", 1, v = timingsafe_memcmp(a, b, 1));
|
||||
EZBENCH_N("timingsafe_memcmp", 2, v = timingsafe_memcmp(a, b, 2));
|
||||
EZBENCH_N("timingsafe_memcmp", 3, v = timingsafe_memcmp(a, b, 3));
|
||||
EZBENCH_N("𝘁𝗶𝗺𝗶𝗻𝗴𝘀𝗮𝗳𝗲_𝗺𝗲𝗺𝗰𝗺𝗽", 4, v = timingsafe_memcmp(a, b, 4));
|
||||
EZBENCH_N("timingsafe_memcmp", 5, v = timingsafe_memcmp(a, b, 5));
|
||||
EZBENCH_N("timingsafe_memcmp", 6, v = timingsafe_memcmp(a, b, 6));
|
||||
EZBENCH_N("timingsafe_memcmp", 7, v = timingsafe_memcmp(a, b, 7));
|
||||
EZBENCH_N("𝘁𝗶𝗺𝗶𝗻𝗴𝘀𝗮𝗳𝗲_𝗺𝗲𝗺𝗰𝗺𝗽", 8, v = timingsafe_memcmp(a, b, 8));
|
||||
EZBENCH_N("timingsafe_memcmp", 9, v = timingsafe_memcmp(a, b, 9));
|
||||
EZBENCH_N("timingsafe_memcmp", 15, v = timingsafe_memcmp(a, b, 15));
|
||||
EZBENCH_N("𝘁𝗶𝗺𝗶𝗻𝗴𝘀𝗮𝗳𝗲_𝗺𝗲𝗺𝗰𝗺𝗽", 16, v = timingsafe_memcmp(a, b, 16));
|
||||
EZBENCH_N("timingsafe_memcmp", 17, v = timingsafe_memcmp(a, b, 17));
|
||||
EZBENCH_N("timingsafe_memcmp", 31, v = timingsafe_memcmp(a, b, 31));
|
||||
EZBENCH_N("timingsafe_memcmp", 32, v = timingsafe_memcmp(a, b, 32));
|
||||
a = kHyperion;
|
||||
b = gc(strdup(kHyperion));
|
||||
EZBENCH_N("timingsafe_memcmp", 33, v = timingsafe_memcmp(a, b, 33));
|
||||
EZBENCH_N("timingsafe_memcmp", 79, v = timingsafe_memcmp(a, b, 79));
|
||||
EZBENCH_N("𝘁𝗶𝗺𝗶𝗻𝗴𝘀𝗮𝗳𝗲_𝗺𝗲𝗺𝗰𝗺𝗽", 80, v = timingsafe_memcmp(a, b, 80));
|
||||
EZBENCH_N("timingsafe_memcmp", 128, v = timingsafe_memcmp(a, b, 128));
|
||||
EZBENCH_N("timingsafe_memcmp", 256, v = timingsafe_memcmp(a, b, 256));
|
||||
a = gc(malloc(16 * 1024));
|
||||
b = gc(malloc(16 * 1024));
|
||||
rngset(a, 16 * 1024, vigna, -1);
|
||||
memcpy(b, a, 16 * 1024);
|
||||
EZBENCH_N("timingsafe_memcmp", 16384, v = timingsafe_memcmp(a, b, 16384));
|
||||
a = gc(malloc(32 * 1024));
|
||||
b = gc(malloc(32 * 1024));
|
||||
rngset(a, 32 * 1024, vigna, -1);
|
||||
memcpy(b, a, 32 * 1024);
|
||||
EZBENCH_N("timingsafe_memcmp", 32768, v = timingsafe_memcmp(a, b, 32768));
|
||||
a = gc(malloc(128 * 1024));
|
||||
b = gc(malloc(128 * 1024));
|
||||
rngset(a, 128 * 1024, vigna, -1);
|
||||
memcpy(b, a, 128 * 1024);
|
||||
EZBENCH_N("timingsafe_memcmp", 131072, v = timingsafe_memcmp(a, b, 131072));
|
||||
}
|
||||
|
||||
BENCH(timingsafe_bcmp, bench) {
|
||||
volatile int v;
|
||||
const char *volatile a;
|
||||
const char *volatile b;
|
||||
b = a = "123456789123456789123456789123456789123456789123456789";
|
||||
b = gc(strdup(b));
|
||||
EZBENCH_N("timingsafe_bcmp", 0, v = timingsafe_bcmp(a, b, 0));
|
||||
EZBENCH_N("timingsafe_bcmp", 1, v = timingsafe_bcmp(a, b, 1));
|
||||
EZBENCH_N("timingsafe_bcmp", 2, v = timingsafe_bcmp(a, b, 2));
|
||||
EZBENCH_N("timingsafe_bcmp", 3, v = timingsafe_bcmp(a, b, 3));
|
||||
EZBENCH_N("𝘁𝗶𝗺𝗶𝗻𝗴𝘀𝗮𝗳𝗲_𝗯𝗰𝗺𝗽", 4, v = timingsafe_bcmp(a, b, 4));
|
||||
EZBENCH_N("timingsafe_bcmp", 5, v = timingsafe_bcmp(a, b, 5));
|
||||
EZBENCH_N("timingsafe_bcmp", 6, v = timingsafe_bcmp(a, b, 6));
|
||||
EZBENCH_N("timingsafe_bcmp", 7, v = timingsafe_bcmp(a, b, 7));
|
||||
EZBENCH_N("𝘁𝗶𝗺𝗶𝗻𝗴𝘀𝗮𝗳𝗲_𝗯𝗰𝗺𝗽", 8, v = timingsafe_bcmp(a, b, 8));
|
||||
EZBENCH_N("timingsafe_bcmp", 9, v = timingsafe_bcmp(a, b, 9));
|
||||
EZBENCH_N("timingsafe_bcmp", 15, v = timingsafe_bcmp(a, b, 15));
|
||||
EZBENCH_N("𝘁𝗶𝗺𝗶𝗻𝗴𝘀𝗮𝗳𝗲_𝗯𝗰𝗺𝗽", 16, v = timingsafe_bcmp(a, b, 16));
|
||||
EZBENCH_N("timingsafe_bcmp", 17, v = timingsafe_bcmp(a, b, 17));
|
||||
EZBENCH_N("timingsafe_bcmp", 31, v = timingsafe_bcmp(a, b, 31));
|
||||
EZBENCH_N("timingsafe_bcmp", 32, v = timingsafe_bcmp(a, b, 32));
|
||||
a = kHyperion;
|
||||
b = gc(strdup(kHyperion));
|
||||
EZBENCH_N("timingsafe_bcmp", 33, v = timingsafe_bcmp(a, b, 33));
|
||||
EZBENCH_N("timingsafe_bcmp", 79, v = timingsafe_bcmp(a, b, 79));
|
||||
EZBENCH_N("𝘁𝗶𝗺𝗶𝗻𝗴𝘀𝗮𝗳𝗲_𝗯𝗰𝗺𝗽", 80, v = timingsafe_bcmp(a, b, 80));
|
||||
EZBENCH_N("timingsafe_bcmp", 128, v = timingsafe_bcmp(a, b, 128));
|
||||
EZBENCH_N("timingsafe_bcmp", 256, v = timingsafe_bcmp(a, b, 256));
|
||||
a = gc(malloc(16 * 1024));
|
||||
b = gc(malloc(16 * 1024));
|
||||
rngset(a, 16 * 1024, vigna, -1);
|
||||
memcpy(b, a, 16 * 1024);
|
||||
EZBENCH_N("timingsafe_bcmp", 16384, v = timingsafe_bcmp(a, b, 16384));
|
||||
a = gc(malloc(32 * 1024));
|
||||
b = gc(malloc(32 * 1024));
|
||||
rngset(a, 32 * 1024, vigna, -1);
|
||||
memcpy(b, a, 32 * 1024);
|
||||
EZBENCH_N("timingsafe_bcmp", 32768, v = timingsafe_bcmp(a, b, 32768));
|
||||
a = gc(malloc(128 * 1024));
|
||||
b = gc(malloc(128 * 1024));
|
||||
rngset(a, 128 * 1024, vigna, -1);
|
||||
memcpy(b, a, 128 * 1024);
|
||||
EZBENCH_N("timingsafe_bcmp", 131072, v = timingsafe_bcmp(a, b, 131072));
|
||||
}
|
||||
|
||||
BENCH(memcasecmp, bench) {
|
||||
volatile int v;
|
||||
const char *volatile a;
|
||||
const char *volatile b;
|
||||
b = a = "123456789123456789123456789123456789123456789123456789";
|
||||
b = gc(strdup(b));
|
||||
EZBENCH_N("memcasecmp", 0, v = memcasecmp(a, b, 0));
|
||||
EZBENCH_N("memcasecmp", 1, v = memcasecmp(a, b, 1));
|
||||
EZBENCH_N("memcasecmp", 2, v = memcasecmp(a, b, 2));
|
||||
EZBENCH_N("memcasecmp", 3, v = memcasecmp(a, b, 3));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗮𝘀𝗲𝗰𝗺𝗽", 4, v = memcasecmp(a, b, 4));
|
||||
EZBENCH_N("memcasecmp", 5, v = memcasecmp(a, b, 5));
|
||||
EZBENCH_N("memcasecmp", 6, v = memcasecmp(a, b, 6));
|
||||
EZBENCH_N("memcasecmp", 7, v = memcasecmp(a, b, 7));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗮𝘀𝗲𝗰𝗺𝗽", 8, v = memcasecmp(a, b, 8));
|
||||
EZBENCH_N("memcasecmp", 9, v = memcasecmp(a, b, 9));
|
||||
EZBENCH_N("memcasecmp", 15, v = memcasecmp(a, b, 15));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗮𝘀𝗲𝗰𝗺𝗽", 16, v = memcasecmp(a, b, 16));
|
||||
EZBENCH_N("memcasecmp", 17, v = memcasecmp(a, b, 17));
|
||||
EZBENCH_N("memcasecmp", 31, v = memcasecmp(a, b, 31));
|
||||
EZBENCH_N("memcasecmp", 32, v = memcasecmp(a, b, 32));
|
||||
a = kHyperion;
|
||||
b = gc(strdup(kHyperion));
|
||||
EZBENCH_N("memcasecmp", 33, v = memcasecmp(a, b, 33));
|
||||
EZBENCH_N("memcasecmp", 79, v = memcasecmp(a, b, 79));
|
||||
EZBENCH_N("𝗺𝗲𝗺𝗰𝗮𝘀𝗲𝗰𝗺𝗽", 80, v = memcasecmp(a, b, 80));
|
||||
EZBENCH_N("memcasecmp", 128, v = memcasecmp(a, b, 128));
|
||||
EZBENCH_N("memcasecmp", 256, v = memcasecmp(a, b, 256));
|
||||
a = gc(malloc(16 * 1024));
|
||||
b = gc(malloc(16 * 1024));
|
||||
rngset(a, 16 * 1024, vigna, -1);
|
||||
memcpy(b, a, 16 * 1024);
|
||||
EZBENCH_N("memcasecmp", 16384, v = memcasecmp(a, b, 16384));
|
||||
a = gc(malloc(32 * 1024));
|
||||
b = gc(malloc(32 * 1024));
|
||||
rngset(a, 32 * 1024, vigna, -1);
|
||||
memcpy(b, a, 32 * 1024);
|
||||
EZBENCH_N("memcasecmp", 32768, v = memcasecmp(a, b, 32768));
|
||||
a = gc(malloc(128 * 1024));
|
||||
b = gc(malloc(128 * 1024));
|
||||
rngset(a, 128 * 1024, vigna, -1);
|
||||
memcpy(b, a, 128 * 1024);
|
||||
EZBENCH_N("memcasecmp", 131072, v = memcasecmp(a, b, 131072));
|
||||
}
|
||||
|
||||
BENCH(timingsafe_memcmp, demonstration) {
|
||||
int bcmp_(const void *, const void *, size_t) asm("bcmp");
|
||||
int memcmp_(const void *, const void *, size_t) asm("memcmp");
|
||||
char a[256], b[256];
|
||||
rngset(a, 256, vigna, -1);
|
||||
memcpy(b, a, 256);
|
||||
++a[0];
|
||||
EZBENCH_N("bcmp ne", 256, bcmp_(a, b, 256));
|
||||
a[0] = b[0];
|
||||
EZBENCH_N("bcmp eq", 256, bcmp_(a, b, 256));
|
||||
++a[0];
|
||||
EZBENCH_N("memcmp ne", 256, memcmp_(a, b, 256));
|
||||
a[0] = b[0];
|
||||
EZBENCH_N("memcmp eq", 256, memcmp_(a, b, 256));
|
||||
++a[0];
|
||||
EZBENCH_N("timingsafe_bcmp ne", 256, timingsafe_bcmp(a, b, 256));
|
||||
a[0] = b[0];
|
||||
EZBENCH_N("timingsafe_bcmp eq", 256, timingsafe_bcmp(a, b, 256));
|
||||
++a[0];
|
||||
EZBENCH_N("timingsafe_memcmp ne", 256, timingsafe_memcmp(a, b, 256));
|
||||
a[0] = b[0];
|
||||
EZBENCH_N("timingsafe_memcmp eq", 256, timingsafe_memcmp(a, b, 256));
|
||||
}
|
97
test/libc/intrin/memmove_test.c
Normal file
97
test/libc/intrin/memmove_test.c
Normal file
|
@ -0,0 +1,97 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/macros.internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/nexgen32e/nexgen32e.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
static void *golden(void *a, const void *b, size_t n) {
|
||||
size_t i;
|
||||
char *d = a;
|
||||
const char *s = b;
|
||||
if (d > s) {
|
||||
for (i = n; i--;) {
|
||||
d[i] = s[i];
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < n; ++i) {
|
||||
d[i] = s[i];
|
||||
}
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
TEST(memmove, hug) {
|
||||
char *a, *b, *c;
|
||||
int i, o1, o2;
|
||||
int N[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||
15, 16, 17, 18, 31, 32, 33, 63, 64, 65, 80, 81, 1000, 1024, 1025};
|
||||
a = gc(malloc(1104));
|
||||
b = gc(malloc(1104));
|
||||
for (o1 = 0; o1 < 48; ++o1) {
|
||||
for (o2 = 0; o2 < 48; ++o2) {
|
||||
for (i = 0; i < ARRAYLEN(N); ++i) {
|
||||
rngset(a, 1104, 0, 0);
|
||||
memcpy(b, a, 1104);
|
||||
ASSERT_EQ(a + o2, golden(a + o2, a + o1, N[i]));
|
||||
ASSERT_EQ(b + o2, memmove(b + o2, b + o1, N[i]));
|
||||
ASSERT_EQ(0, timingsafe_bcmp(a, b, 1104), "%d %d %d", o1, o2, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(memmove, bighug) {
|
||||
char *a, *b, *c;
|
||||
int i, o1, o2;
|
||||
int N[] = {5 * 1024 * 1024};
|
||||
a = gc(malloc(6291456));
|
||||
b = gc(malloc(6291456));
|
||||
for (o1 = 0; o1 < 40; o1 += 10) {
|
||||
for (o2 = 0; o2 < 40; o2 += 10) {
|
||||
for (i = 0; i < ARRAYLEN(N); ++i) {
|
||||
rngset(a, 6291456, 0, 0);
|
||||
memcpy(b, a, 6291456);
|
||||
ASSERT_EQ(a + o2, golden(a + o2, a + o1, N[i]));
|
||||
ASSERT_EQ(b + o2, memmove(b + o2, b + o1, N[i]));
|
||||
ASSERT_EQ(0, timingsafe_bcmp(a, b, 6291456), "%d %d %d", o1, o2, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BENCH(memmove, bench) {
|
||||
volatile char *r;
|
||||
int n, max = 8 * 1024 * 1024;
|
||||
char *volatile p = gc(calloc(max, 1));
|
||||
char *volatile q = gc(calloc(max, 1));
|
||||
EZBENCH_N("memmove", 0, memmove(p, q, 0));
|
||||
for (n = 0; n < 127; ++n) {
|
||||
EZBENCH_N("memmove", n, r = memmove(p, q, n));
|
||||
}
|
||||
for (n = 128; n <= max; n *= 2) {
|
||||
EZBENCH_N("memmove", n - 1, r = memmove(p, q, n - 1));
|
||||
EZBENCH_N("memmove", n, r = memmove(p, q, n));
|
||||
}
|
||||
}
|
|
@ -16,59 +16,80 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/fastrandomstring.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
int unfancy_memcmp(const void *a, const void *b, size_t n) {
|
||||
int c;
|
||||
static void *golden(void *p, int c, size_t n) {
|
||||
size_t i;
|
||||
const unsigned char *x, *y;
|
||||
for (x = a, y = b, i = 0; i < n; ++i) {
|
||||
if ((c = x[i] - y[i])) {
|
||||
return c;
|
||||
for (i = 0; i < n; ++i) ((char *)p)[i] = c;
|
||||
return p;
|
||||
}
|
||||
|
||||
TEST(memset, hug) {
|
||||
char *a, *b;
|
||||
int i, j, c;
|
||||
for (i = 0; i < 1025; ++i) {
|
||||
for (j = 0; j < 1025 - i; ++j) {
|
||||
a = malloc(i + j);
|
||||
b = malloc(i + j);
|
||||
c = vigna();
|
||||
rngset(a, i + j, vigna, 0);
|
||||
memcpy(b, a, i + j);
|
||||
ASSERT_EQ(a + i, golden(a + i, c, j));
|
||||
ASSERT_EQ(b + i, memset(b + i, c, j));
|
||||
ASSERT_EQ(0, timingsafe_bcmp(a, b, i + j));
|
||||
free(b);
|
||||
free(a);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
TEST(memcmp, test) {
|
||||
EXPECT_EQ(0, memcmp("hi", "hi", 2));
|
||||
EXPECT_NE(0, memcmp("hi", "HI", 2));
|
||||
EXPECT_EQ(-1, memcmp("a", "b", 1));
|
||||
EXPECT_EQ(+1, memcmp("b", "a", 1));
|
||||
}
|
||||
|
||||
TEST(memcmp, fuzz) {
|
||||
int i, n;
|
||||
char a[32], b[32];
|
||||
for (i = 0; i < 1000; ++i) {
|
||||
n = rand() & 31;
|
||||
rngset(a, n, rand64, -1);
|
||||
rngset(b, n, rand64, -1);
|
||||
ASSERT_EQ(unfancy_memcmp(a, b, n), memcmp(a, b, n), "n=%d", n);
|
||||
TEST(bzero, hug) {
|
||||
char *a, *b;
|
||||
int i, j;
|
||||
for (i = 0; i < 1025; ++i) {
|
||||
for (j = 0; j < 1025 - i; ++j) {
|
||||
a = malloc(i + j);
|
||||
b = malloc(i + j);
|
||||
rngset(a, i + j, vigna, 0);
|
||||
memcpy(b, a, i + j);
|
||||
golden(a + i, 0, j);
|
||||
bzero(b + i, j);
|
||||
ASSERT_EQ(0, timingsafe_bcmp(a, b, i + j));
|
||||
free(b);
|
||||
free(a);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BENCH(memcmp, bench) {
|
||||
extern int funcmp(const void *a, const void *b, size_t n) asm("memcmp");
|
||||
volatile int v;
|
||||
const char *volatile a;
|
||||
const char *volatile b;
|
||||
b = a = "123456789123456789123456789123456789123456789123456789";
|
||||
EZBENCH2("memcmp same", donothing, v = funcmp(a, b, 7));
|
||||
b = gc(strdup(b));
|
||||
EZBENCH2("memcmp 1", donothing, v = funcmp(a, b, 1));
|
||||
EZBENCH2("memcmp 2", donothing, v = funcmp(a, b, 2));
|
||||
EZBENCH2("memcmp 3", donothing, v = funcmp(a, b, 3));
|
||||
EZBENCH2("memcmp 4", donothing, v = funcmp(a, b, 4));
|
||||
EZBENCH2("memcmp 5", donothing, v = funcmp(a, b, 5));
|
||||
EZBENCH2("memcmp 6", donothing, v = funcmp(a, b, 6));
|
||||
EZBENCH2("memcmp 7", donothing, v = funcmp(a, b, 7));
|
||||
EZBENCH2("memcmp 8", donothing, v = funcmp(a, b, 8));
|
||||
EZBENCH2("memcmp 9", donothing, v = funcmp(a, b, 9));
|
||||
EZBENCH2("memcmp 16", donothing, v = funcmp(a, b, 16));
|
||||
EZBENCH2("memcmp 32", donothing, v = funcmp(a, b, 32));
|
||||
BENCH(memset, bench) {
|
||||
int n, max = 8 * 1024 * 1024;
|
||||
char *volatile p = gc(malloc(max));
|
||||
EZBENCH_N("memset", 0, memset(p, -1, 0));
|
||||
for (n = 2; n <= max; n *= 2) {
|
||||
EZBENCH_N("memset", n - 1, memset(p, -1, n - 1));
|
||||
EZBENCH_N("memset", n, memset(p, -1, n));
|
||||
}
|
||||
EZBENCH_N("bzero", 0, bzero(p, 0));
|
||||
for (n = 2; n <= max; n *= 2) {
|
||||
EZBENCH_N("bzero", n - 1, bzero(p, n - 1));
|
||||
EZBENCH_N("bzero", n, bzero(p, n));
|
||||
}
|
||||
}
|
||||
|
||||
BENCH(strlen, bench) {
|
||||
volatile size_t r;
|
||||
int n, max = 8 * 1024 * 1024;
|
||||
char *volatile p = gc(calloc(max + 1, 1));
|
||||
EZBENCH_N("strlen", 0, strlen(p));
|
||||
for (n = 2; n <= max; n *= 2) {
|
||||
memset(p, -1, n - 1);
|
||||
EZBENCH_N("strlen", n - 1, r = strlen(p));
|
||||
p[n - 1] = -1;
|
||||
EZBENCH_N("strlen", n, r = strlen(p));
|
||||
}
|
||||
}
|
|
@ -23,6 +23,8 @@ TEST_LIBC_INTRIN_CHECKS = \
|
|||
$(TEST_LIBC_INTRIN_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
|
||||
|
||||
TEST_LIBC_INTRIN_DIRECTDEPS = \
|
||||
LIBC_CALLS \
|
||||
LIBC_STDIO \
|
||||
LIBC_FMT \
|
||||
LIBC_INTRIN \
|
||||
LIBC_LOG \
|
||||
|
@ -53,6 +55,10 @@ o/$(MODE)/test/libc/intrin/%.com.dbg: \
|
|||
$(APE)
|
||||
@$(APELINK)
|
||||
|
||||
$(TEST_LIBC_INTRIN_OBJS): \
|
||||
OVERRIDE_CFLAGS += \
|
||||
-fno-builtin
|
||||
|
||||
.PHONY: o/$(MODE)/test/libc/intrin
|
||||
o/$(MODE)/test/libc/intrin: \
|
||||
$(TEST_LIBC_INTRIN_BINS) \
|
||||
|
|
177
test/libc/log/backtrace_test.c
Normal file
177
test/libc/log/backtrace_test.c
Normal file
|
@ -0,0 +1,177 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/errno.h"
|
||||
#include "libc/log/log.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/stdio/append.internal.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/sysv/consts/o.h"
|
||||
#include "libc/sysv/consts/sig.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
#include "libc/x/x.h"
|
||||
#include "net/http/escape.h"
|
||||
|
||||
typedef char xmm_t __attribute__((__vector_size__(16)));
|
||||
|
||||
noinline void ThisIsAnFpeCrash(void) {
|
||||
xmm_t v = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
|
||||
0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
|
||||
volatile int x = 0;
|
||||
asm volatile("fldpi");
|
||||
asm volatile("mov\t%0,%%r15" : /* no outputs */ : "g"(0x3133731337));
|
||||
asm volatile("movaps\t%0,%%xmm15" : /* no outputs */ : "x"(v));
|
||||
fputc(7 / x, stdout);
|
||||
}
|
||||
|
||||
void SetUp(void) {
|
||||
ShowCrashReports();
|
||||
if (__argc == 2 && !strcmp(__argv[1], "1")) {
|
||||
ThisIsAnFpeCrash();
|
||||
}
|
||||
}
|
||||
|
||||
// error: Uncaught SIGFPE (FPE_INTDIV) on nightmare pid 11724
|
||||
// /home/jart/cosmo/o/dbg/test/libc/log/backtrace_test.com.tmp.11721
|
||||
// ENOTTY[25]
|
||||
// Linux nightmare SMP Thu, 12 Aug 2021 06:16:45 UTC
|
||||
//
|
||||
// 0x0000000000414659: ThisIsAnFpeCrash at test/libc/log/backtrace_test.c:35
|
||||
// 0x000000000045003b: testlib_runtestcases at libc/testlib/testrunner.c:98
|
||||
// 0x000000000044b770: testlib_runalltests at libc/testlib/runner.c:37
|
||||
// 0x000000000040278e: main at libc/testlib/testmain.c:86
|
||||
// 0x0000000000403210: cosmo at libc/runtime/cosmo.S:65
|
||||
// 0x0000000000402247: _start at libc/crt/crt.S:67
|
||||
//
|
||||
// RAX 0000000000000007 RBX 00006fffffffff10 RDI 00007ffe0745fde1 ST(0) 0.0
|
||||
// RCX 0000000000000000 RDX 0000000000000000 RSI 0000000000489900 ST(1) 0.0
|
||||
// RBP 00006fffffffff70 RSP 00006fffffffff10 RIP 000000000041465a ST(2) 0.0
|
||||
// R8 0000000000000001 R9 00006ffffffffcc0 R10 00006ffffffffe60 ST(3) 0.0
|
||||
// R11 000000000000000d R12 00000dffffffffe2 R13 00006fffffffff10 ST(4) 0.0
|
||||
// R14 0000000000000003 R15 000000000049b700 VF PF ZF IF
|
||||
//
|
||||
// XMM0 00000000000000000000000000000000 XMM8 00000000000000000000000000000000
|
||||
// XMM1 000000008000000400000000004160ea XMM9 00000000000000000000000000000000
|
||||
// XMM2 00000000000000000000000000000000 XMM10 00000000000000000000000000000000
|
||||
// XMM3 00000000000000000000000000000000 XMM11 00000000000000000000000000000000
|
||||
// XMM4 00000000000000000000000000000000 XMM12 00000000000000000000000000000000
|
||||
// XMM5 00000000000000000000000000000000 XMM13 00000000000000000000000000000000
|
||||
// XMM6 00000000000000000000000000000000 XMM14 00000000000000000000000000000000
|
||||
// XMM7 00000000000000000000000000000000 XMM15 00000000000000000000000000000000
|
||||
//
|
||||
// mm->i == 4;
|
||||
// mm->p[ 0]=={0x00008007,0x00008008,-1,3,50}; /* 2 */
|
||||
// /* 234,881,012 */
|
||||
// mm->p[ 1]=={0x0e007ffd,0x0e007fff,-1,3,50}; /* 3 */
|
||||
// /* 33,538,280 */
|
||||
// mm->p[ 2]=={0x100040e8,0x100040e8,-1,3,50}; /* 1 */
|
||||
// /* 1,610,596,103 */
|
||||
// mm->p[ 3]=={0x6ffffff0,0x6fffffff,12884901888,306,0}; /* 16 */
|
||||
// /* 22 frames mapped w/ 1,879,015,395 frames gapped */
|
||||
//
|
||||
// 00400000-0045b000 r-xp 00000000 08:03 4587526
|
||||
// /home/jart/cosmo/o/dbg/test/libc/log/backtrace_test.com.tmp.11721
|
||||
// 0045b000-00461000 rw-p 0005b000 08:03 4587526
|
||||
// /home/jart/cosmo/o/dbg/test/libc/log/backtrace_test.com.tmp.11721
|
||||
// 00461000-004a0000 rw-p 00000000 00:00 0
|
||||
// 80070000-80090000 rw-p 00000000 00:00 0
|
||||
// e007ffd0000-e0080000000 rw-p 00000000 00:00 0
|
||||
// 100040e80000-100040e90000 rw-p 00000000 00:00 0
|
||||
// 6ffffff00000-700000000000 rw-p 00000000 00:00 0
|
||||
// 7ffe0743f000-7ffe07460000 rw-p 00000000 00:00 0 [stack]
|
||||
// 7ffe075a8000-7ffe075ab000 r--p 00000000 00:00 0 [vvar]
|
||||
// 7ffe075ab000-7ffe075ac000 r-xp 00000000 00:00 0 [vdso]
|
||||
//
|
||||
// /home/jart/cosmo/o/dbg/test/libc/log/backtrace_test.com.tmp.11721 1
|
||||
|
||||
TEST(ShowCrashReports, testDivideByZero) {
|
||||
size_t got;
|
||||
ssize_t rc;
|
||||
int ws, pid, fds[2];
|
||||
char *output, buf[512];
|
||||
ASSERT_NE(-1, pipe2(fds, O_CLOEXEC));
|
||||
ASSERT_NE(-1, (pid = vfork()));
|
||||
if (!pid) {
|
||||
dup2(fds[1], 1);
|
||||
dup2(fds[1], 2);
|
||||
execv(program_executable_name,
|
||||
(char *const[]){program_executable_name, "1", 0});
|
||||
_exit(127);
|
||||
}
|
||||
close(fds[1]);
|
||||
output = 0;
|
||||
appends(&output, "");
|
||||
for (;;) {
|
||||
rc = read(fds[0], buf, sizeof(buf));
|
||||
if (rc == -1) {
|
||||
ASSERT_EQ(EINTR, errno);
|
||||
continue;
|
||||
}
|
||||
if ((got = rc)) {
|
||||
appendd(&output, buf, got);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
ASSERT_NE(-1, wait(&ws));
|
||||
EXPECT_TRUE(WIFEXITED(ws));
|
||||
EXPECT_EQ(128 + SIGFPE, WEXITSTATUS(ws));
|
||||
|
||||
/* NULL is stopgap until we can copy symbol tablces into binary */
|
||||
if (!strstr(output, "ThisIsAnFpeCrash") && !strstr(output, "NULL")) {
|
||||
fprintf(stderr, "ERROR: crash report didn't have backtrace\n%s\n",
|
||||
gc(IndentLines(output, -1, 0, 4)));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!strstr(output, gc(xasprintf("%d", pid)))) {
|
||||
fprintf(stderr, "ERROR: crash report didn't have pid\n%s\n",
|
||||
gc(IndentLines(output, -1, 0, 4)));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!strstr(output, "SIGFPE")) {
|
||||
fprintf(stderr, "ERROR: crash report didn't have signal name\n%s\n",
|
||||
gc(IndentLines(output, -1, 0, 4)));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!strstr(output, "3.141")) {
|
||||
fprintf(stderr, "ERROR: crash report didn't have fpu register\n%s\n",
|
||||
gc(IndentLines(output, -1, 0, 4)));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!strstr(output, "0f0e0d0c0b0a09080706050403020100")) {
|
||||
fprintf(stderr, "ERROR: crash report didn't have sse register\n%s\n",
|
||||
gc(IndentLines(output, -1, 0, 4)));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!strstr(output, "3133731337")) {
|
||||
fprintf(stderr, "ERROR: crash report didn't have general register\n%s\n",
|
||||
gc(IndentLines(output, -1, 0, 4)));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
free(output);
|
||||
}
|
60
test/libc/log/test.mk
Normal file
60
test/libc/log/test.mk
Normal file
|
@ -0,0 +1,60 @@
|
|||
#-*-mode:makefile-gmake;indent-tabs-mode:t;tab-width:8;coding:utf-8-*-┐
|
||||
#───vi: set et ft=make ts=8 tw=8 fenc=utf-8 :vi───────────────────────┘
|
||||
|
||||
PKGS += TEST_LIBC_LOG
|
||||
|
||||
TEST_LIBC_LOG_SRCS := $(wildcard test/libc/log/*.c)
|
||||
TEST_LIBC_LOG_SRCS_TEST = $(filter %_test.c,$(TEST_LIBC_LOG_SRCS))
|
||||
|
||||
TEST_LIBC_LOG_OBJS = \
|
||||
$(TEST_LIBC_LOG_SRCS:%.c=o/$(MODE)/%.o)
|
||||
|
||||
TEST_LIBC_LOG_COMS = \
|
||||
$(TEST_LIBC_LOG_SRCS:%.c=o/$(MODE)/%.com)
|
||||
|
||||
TEST_LIBC_LOG_BINS = \
|
||||
$(TEST_LIBC_LOG_COMS) \
|
||||
$(TEST_LIBC_LOG_COMS:%=%.dbg)
|
||||
|
||||
TEST_LIBC_LOG_TESTS = \
|
||||
$(TEST_LIBC_LOG_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
|
||||
|
||||
TEST_LIBC_LOG_CHECKS = \
|
||||
$(TEST_LIBC_LOG_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
|
||||
|
||||
TEST_LIBC_LOG_DIRECTDEPS = \
|
||||
LIBC_CALLS \
|
||||
LIBC_RUNTIME \
|
||||
NET_HTTP \
|
||||
LIBC_STDIO \
|
||||
LIBC_X \
|
||||
LIBC_INTRIN \
|
||||
LIBC_MEM \
|
||||
LIBC_NEXGEN32E \
|
||||
LIBC_LOG \
|
||||
LIBC_STR \
|
||||
LIBC_STUBS \
|
||||
LIBC_TESTLIB \
|
||||
LIBC_SYSV \
|
||||
LIBC_LOG
|
||||
|
||||
TEST_LIBC_LOG_DEPS := \
|
||||
$(call uniq,$(foreach x,$(TEST_LIBC_LOG_DIRECTDEPS),$($(x))))
|
||||
|
||||
o/$(MODE)/test/libc/log/log.pkg: \
|
||||
$(TEST_LIBC_LOG_OBJS) \
|
||||
$(foreach x,$(TEST_LIBC_LOG_DIRECTDEPS),$($(x)_A).pkg)
|
||||
|
||||
o/$(MODE)/test/libc/log/%.com.dbg: \
|
||||
$(TEST_LIBC_LOG_DEPS) \
|
||||
o/$(MODE)/test/libc/log/%.o \
|
||||
o/$(MODE)/test/libc/log/log.pkg \
|
||||
$(LIBC_TESTMAIN) \
|
||||
$(CRT) \
|
||||
$(APE)
|
||||
@$(APELINK)
|
||||
|
||||
.PHONY: o/$(MODE)/test/libc/log
|
||||
o/$(MODE)/test/libc/log: \
|
||||
$(TEST_LIBC_LOG_BINS) \
|
||||
$(TEST_LIBC_LOG_CHECKS)
|
|
@ -35,6 +35,14 @@
|
|||
#define N 1024
|
||||
#define M 20
|
||||
|
||||
TEST(malloc, zeroMeansOne) {
|
||||
ASSERT_GE(malloc_usable_size(malloc(0)), 1);
|
||||
}
|
||||
|
||||
TEST(calloc, zerosMeansOne) {
|
||||
ASSERT_GE(malloc_usable_size(calloc(0, 0)), 1);
|
||||
}
|
||||
|
||||
TEST(malloc, test) {
|
||||
static struct stat st;
|
||||
static volatile int i, j, k, *A[4096], fds[M], *maps[M], mapsizes[M];
|
||||
|
|
|
@ -61,29 +61,6 @@ TEST(MemMove, overlapping) {
|
|||
}
|
||||
}
|
||||
|
||||
TEST(memmove$pure, overlapping) {
|
||||
for (i = 0; i < N; i += S) {
|
||||
for (j = 0; j < N; j += S) {
|
||||
for (n = MIN(N - i, N - j) + 1; n--;) {
|
||||
b0 = rngset(malloc(N), N, rand64, -1);
|
||||
b1 = memcpy(malloc(N), b0, N);
|
||||
b2 = memcpy(malloc(N), b0, N);
|
||||
ASSERT_EQ(b1 + j, memmove_pure(b1 + j, b1 + i, n));
|
||||
ASSERT_EQ(b2 + j, PosixMemmove(b2 + j, b2 + i, n));
|
||||
ASSERT_EQ(0, memcmp(b1, b2, N),
|
||||
"j=%ld i=%ld n=%ld\n"
|
||||
"\t%#.*s data\n"
|
||||
"\t%#.*s memmove\n"
|
||||
"\t%#.*s posix",
|
||||
j, i, n, n, b0, n, b1, n, b2);
|
||||
free(b2);
|
||||
free(b1);
|
||||
free(b0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(MemCpy, overlapping) {
|
||||
for (i = 0; i < N; i += S) {
|
||||
for (j = 0; j < N; j += S) {
|
||||
|
|
|
@ -66,52 +66,8 @@ TEST(memset, size5) {
|
|||
EXPECT_EQ(7, b[4]);
|
||||
}
|
||||
|
||||
TEST(memset, testMulTrick4) {
|
||||
long i, j;
|
||||
unsigned long x;
|
||||
long di, si, dx, ax;
|
||||
volatile uint8_t *b;
|
||||
b = gc(malloc(4));
|
||||
for (i = 0; i < 255; ++i) {
|
||||
for (j = -1; j < 1; ++j) {
|
||||
x = j;
|
||||
x &= ~0xff;
|
||||
x |= i;
|
||||
asm volatile("call\tmemset"
|
||||
: "=D"(di), "=S"(si), "=d"(dx), "=a"(ax)
|
||||
: "0"(b), "1"(x), "2"(4)
|
||||
: "rcx", "memory", "cc");
|
||||
ASSERT_EQ(x & 0xff, b[0]);
|
||||
ASSERT_EQ(x & 0xff, b[1]);
|
||||
ASSERT_EQ(x & 0xff, b[2]);
|
||||
ASSERT_EQ(x & 0xff, b[3]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(memset, testMulTrick8) {
|
||||
long i, j;
|
||||
unsigned long x;
|
||||
long di, si, dx, ax;
|
||||
volatile uint8_t *b;
|
||||
b = gc(malloc(8));
|
||||
for (i = 0; i < 255; ++i) {
|
||||
for (j = -1; j < 1; ++j) {
|
||||
x = j;
|
||||
x &= ~0xff;
|
||||
x |= i;
|
||||
asm volatile("call\tmemset"
|
||||
: "=D"(di), "=S"(si), "=d"(dx), "=a"(ax)
|
||||
: "0"(b), "1"(x), "2"(8)
|
||||
: "rcx", "memory", "cc");
|
||||
ASSERT_EQ(x & 0xff, b[0]);
|
||||
ASSERT_EQ(x & 0xff, b[1]);
|
||||
ASSERT_EQ(x & 0xff, b[2]);
|
||||
ASSERT_EQ(x & 0xff, b[3]);
|
||||
ASSERT_EQ(x & 0xff, b[4]);
|
||||
ASSERT_EQ(x & 0xff, b[5]);
|
||||
ASSERT_EQ(x & 0xff, b[6]);
|
||||
ASSERT_EQ(x & 0xff, b[7]);
|
||||
}
|
||||
}
|
||||
TEST(memset, wut) {
|
||||
char buf[128], *p, *q;
|
||||
_memset(buf, -1, sizeof(buf));
|
||||
EXPECT_EQ(255, buf[8] & 255);
|
||||
}
|
||||
|
|
|
@ -184,22 +184,6 @@ uint64_t Rand64LowByte(void) {
|
|||
return x;
|
||||
}
|
||||
|
||||
uint64_t GetRandomNoRdrrnd(void) {
|
||||
uint64_t x;
|
||||
ASSERT_EQ(8, getrandom(&x, 8, GRND_NORDRND));
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t GetRandomNoSystem(void) {
|
||||
uint64_t x;
|
||||
if (X86_HAVE(RDRND) || X86_HAVE(RDSEED)) {
|
||||
ASSERT_EQ(8, getrandom(&x, 8, GRND_NOSYSTEM));
|
||||
} else {
|
||||
ASSERT_EQ(8, getrandom(&x, 8, 0));
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t GetRandom(void) {
|
||||
uint64_t x;
|
||||
ASSERT_EQ(8, getrandom(&x, 8, 0));
|
||||
|
@ -220,8 +204,6 @@ static const struct RandomFunction {
|
|||
{"KnuthLcg", KnuthLcg, false}, //
|
||||
{"rand64", rand64, true}, //
|
||||
{"Rand64LowByte", Rand64LowByte, true}, //
|
||||
{"GetRandomNoRdrrnd", GetRandomNoRdrrnd, true}, //
|
||||
{"GetRandomNoSystem", GetRandomNoSystem, true}, //
|
||||
{"GetRandom", GetRandom, true}, //
|
||||
};
|
||||
|
||||
|
|
|
@ -18,9 +18,11 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/hyperion.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
#include "libc/x/x.h"
|
||||
|
||||
TEST(MeasureEntropy, test) {
|
||||
MeasureEntropy(kMoby, 1000);
|
||||
|
|
212
test/libc/rand/mt19937_test.c
Normal file
212
test/libc/rand/mt19937_test.c
Normal file
|
@ -0,0 +1,212 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/bits/bits.h"
|
||||
#include "libc/log/check.h"
|
||||
#include "libc/macros.internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/sysv/consts/grnd.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
#include "third_party/mbedtls/ctr_drbg.h"
|
||||
|
||||
void GetRandom(void *p, size_t n) {
|
||||
ssize_t rc;
|
||||
size_t i, m;
|
||||
for (i = 0; i < n; i += rc) {
|
||||
m = MIN(n - i, 256);
|
||||
rc = getrandom((char *)p + i, m, 0);
|
||||
if (rc == -1 && errno == EINTR) continue;
|
||||
if (rc <= 0) abort();
|
||||
}
|
||||
}
|
||||
|
||||
int GetEntropy1(void *c, unsigned char *p, size_t n) {
|
||||
rngset(p, n, rdseed, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ctrdrbg1(void *p, size_t n) {
|
||||
int rc;
|
||||
size_t i, m;
|
||||
mbedtls_ctr_drbg_context rng;
|
||||
mbedtls_ctr_drbg_init(&rng);
|
||||
DCHECK_EQ(0, mbedtls_ctr_drbg_seed(&rng, GetEntropy1, 0, "justine", 7));
|
||||
for (i = 0; i < n; i += m) {
|
||||
m = MIN(n - i, MBEDTLS_CTR_DRBG_MAX_REQUEST);
|
||||
DCHECK_EQ(0, mbedtls_ctr_drbg_random(&rng, (unsigned char *)p + i, m));
|
||||
}
|
||||
mbedtls_ctr_drbg_free(&rng);
|
||||
}
|
||||
|
||||
int GetEntropy2(void *c, unsigned char *p, size_t n) {
|
||||
rngset(p, n, rdseed, -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ctrdrbg2(void *p, size_t n) {
|
||||
int rc;
|
||||
size_t i, m;
|
||||
mbedtls_ctr_drbg_context rng;
|
||||
mbedtls_ctr_drbg_init(&rng);
|
||||
DCHECK_EQ(0, mbedtls_ctr_drbg_seed(&rng, GetEntropy2, 0, "justine", 7));
|
||||
for (i = 0; i < n; i += m) {
|
||||
m = MIN(n - i, MBEDTLS_CTR_DRBG_MAX_REQUEST);
|
||||
DCHECK_EQ(0, mbedtls_ctr_drbg_random(&rng, (unsigned char *)p + i, m));
|
||||
}
|
||||
mbedtls_ctr_drbg_free(&rng);
|
||||
}
|
||||
|
||||
noinline uint64_t xorshift(void) {
|
||||
static uint64_t s = 88172645463325252;
|
||||
uint64_t x = s;
|
||||
x ^= x << 13;
|
||||
x ^= x >> 7;
|
||||
x ^= x << 17;
|
||||
return (s = x);
|
||||
}
|
||||
|
||||
noinline void xorshifta(char *p, size_t n) {
|
||||
static uint64_t s = 88172645463325252;
|
||||
uint64_t x = s;
|
||||
while (n >= 8) {
|
||||
x ^= x << 13;
|
||||
x ^= x >> 7;
|
||||
x ^= x << 17;
|
||||
__builtin_memcpy(p, &x, 8);
|
||||
n -= 8;
|
||||
p += 8;
|
||||
}
|
||||
s = x;
|
||||
while (n--) {
|
||||
*p++ = x;
|
||||
x >>= 8;
|
||||
}
|
||||
}
|
||||
|
||||
noinline uint64_t knuth(void) {
|
||||
uint64_t a, b;
|
||||
static uint64_t x = 1;
|
||||
x *= 6364136223846793005;
|
||||
x += 1442695040888963407;
|
||||
a = x >> 32;
|
||||
x *= 6364136223846793005;
|
||||
x += 1442695040888963407;
|
||||
b = x >> 32;
|
||||
return a | b << 32;
|
||||
}
|
||||
|
||||
noinline void knutha(char *p, size_t n) {
|
||||
static uint64_t s = 1;
|
||||
uint32_t u;
|
||||
uint64_t x = s;
|
||||
while (n >= 4) {
|
||||
x *= 6364136223846793005;
|
||||
x += 1442695040888963407;
|
||||
u = x >> 32;
|
||||
p[0] = (0x000000FF & u) >> 000;
|
||||
p[1] = (0x0000FF00 & u) >> 010;
|
||||
p[2] = (0x00FF0000 & u) >> 020;
|
||||
p[3] = (0xFF000000 & u) >> 030;
|
||||
n -= 4;
|
||||
p += 4;
|
||||
}
|
||||
s = x;
|
||||
while (n--) {
|
||||
*p++ = x;
|
||||
x >>= 8;
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t urandom(void) {
|
||||
return random();
|
||||
}
|
||||
|
||||
TEST(mt19937, test) {
|
||||
uint64_t init[] = {0x12345ULL, 0x23456ULL, 0x34567ULL, 0x45678ULL};
|
||||
uint64_t want[] = {
|
||||
7266447313870364031ull, 4946485549665804864ull, 16945909448695747420ull,
|
||||
16394063075524226720ull, 4873882236456199058ull,
|
||||
};
|
||||
_Smt19937(init, ARRAYLEN(init));
|
||||
for (int i = 0; i < ARRAYLEN(want); i++) {
|
||||
ASSERT_EQ(want[i], _mt19937());
|
||||
}
|
||||
}
|
||||
|
||||
BENCH(mt19937, bench8) {
|
||||
volatile uint64_t x;
|
||||
EZBENCH2("vigna", donothing, x = vigna());
|
||||
EZBENCH2("vigna_r", donothing, vigna_r(&x));
|
||||
EZBENCH2("xorshift", donothing, x = xorshift());
|
||||
EZBENCH2("knuth", donothing, x = knuth());
|
||||
EZBENCH2("random", donothing, x = urandom());
|
||||
EZBENCH2("mt19937", donothing, x = _mt19937());
|
||||
EZBENCH2("rand64char", donothing, x = rand64());
|
||||
size_t i = 0;
|
||||
volatile uint8_t *p = gc(malloc(3 * 2048 * 2 * 8));
|
||||
EZBENCH3("rdrand", 2048, donothing, p[i++] = rdrand());
|
||||
EZBENCH3("rdseed", 2048, donothing, p[i++] = rdseed());
|
||||
EZBENCH3("getrandom", 2048, donothing, GetRandom(p + i++, 8));
|
||||
}
|
||||
|
||||
BENCH(mt19937, bench32k) {
|
||||
volatile char *p = gc(malloc(32768));
|
||||
EZBENCH_N("rngset(rand64,-1)", 32768, rngset(p, 32768, rand64, -1));
|
||||
EZBENCH_N("rngset(rdseed,512)", 32768, rngset(p, 32768, rdseed, 512));
|
||||
EZBENCH_N("ctrdrbg+rdseed [blk]", 32768, ctrdrbg1(p, 32768));
|
||||
EZBENCH_N("getrandom [block]", 32768, GetRandom(p, 32768));
|
||||
EZBENCH_N("vigna [word]", 32768, rngset(p, 32768, vigna, 0));
|
||||
EZBENCH_N("xorshift [word]", 32768, xorshifta(p, 32768));
|
||||
EZBENCH_N("knuth [word]", 32768, knutha(p, 32768));
|
||||
EZBENCH_N("random [word]", 32768, rngset(p, 32768, urandom, 0));
|
||||
EZBENCH_N("mt19937 [word]", 32768, rngset(p, 32768, _mt19937, 0));
|
||||
EZBENCH_N("rand64 [word]", 32768, rngset(p, 32768, rand64, 0));
|
||||
EZBENCH_N("rdrand [word]", 32768, rngset(p, 32768, rdrand, 0));
|
||||
EZBENCH_N("rdseed [word]", 32768, rngset(p, 32768, rdseed, 0));
|
||||
}
|
||||
|
||||
BENCH(mt19937, bench48) {
|
||||
volatile char *p = gc(malloc(48));
|
||||
EZBENCH_N("rngset(rdrand,0)", 48, rngset(p, 48, rdrand, 0));
|
||||
EZBENCH_N("rngset(rdseed,0)", 48, rngset(p, 48, rdseed, 0));
|
||||
EZBENCH_N("getrandom", 48, GetRandom(p, 48));
|
||||
}
|
||||
|
||||
#if 0
|
||||
TEST(mt19937, test) {
|
||||
int i;
|
||||
uint64_t init[4] = {0x12345ULL, 0x23456ULL, 0x34567ULL, 0x45678ULL};
|
||||
uint64_t length = 4;
|
||||
mt19937_init_by_array64(init, length);
|
||||
printf("1000 outputs of genrand64_int64()\n");
|
||||
for (i = 0; i < 1000; i++) {
|
||||
printf("%20llu ", mt19937_genrand64_int64());
|
||||
if (i % 5 == 4) printf("\n");
|
||||
}
|
||||
printf("\n1000 outputs of genrand64_real2()\n");
|
||||
for (i = 0; i < 1000; i++) {
|
||||
printf("%10.8f ", mt19937_genrand64_real2());
|
||||
if (i % 5 == 4) printf("\n");
|
||||
}
|
||||
}
|
||||
#endif
|
67
test/libc/rand/rngset_test.c
Normal file
67
test/libc/rand/rngset_test.c
Normal file
|
@ -0,0 +1,67 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/bits/bits.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
uint64_t counter(void) {
|
||||
static uint8_t t;
|
||||
return 0x0101010101010101ull * t++;
|
||||
}
|
||||
|
||||
TEST(rngset, testZeroReseedInterval_doesntApplyPrng) {
|
||||
char buf[32];
|
||||
EXPECT_EQ(buf, rngset(buf, sizeof(buf), counter, 0));
|
||||
EXPECT_EQ(0x0000000000000000, READ64LE(buf + 0));
|
||||
EXPECT_EQ(0x0101010101010101, READ64LE(buf + 8));
|
||||
EXPECT_EQ(0x0202020202020202, READ64LE(buf + 16));
|
||||
EXPECT_EQ(0x0303030303030303, READ64LE(buf + 24));
|
||||
}
|
||||
|
||||
uint64_t eleet(void) {
|
||||
return 0x31337;
|
||||
}
|
||||
|
||||
TEST(rngset, testReseedIsNeg_usesInternalVignaPrng) {
|
||||
char buf[32];
|
||||
svigna(0x31337);
|
||||
EXPECT_EQ(buf, rngset(buf, sizeof(buf), eleet, -1));
|
||||
EXPECT_EQ(vigna(), READ64LE(buf + 0));
|
||||
EXPECT_EQ(vigna(), READ64LE(buf + 8));
|
||||
EXPECT_EQ(vigna(), READ64LE(buf + 16));
|
||||
EXPECT_EQ(vigna(), READ64LE(buf + 24));
|
||||
}
|
||||
|
||||
TEST(rngset, testNullSeedFunction_reseedBecomesVignaSeed) {
|
||||
char buf[32];
|
||||
svigna(123);
|
||||
EXPECT_EQ(buf, rngset(buf, sizeof(buf), 0, 123));
|
||||
EXPECT_EQ(vigna(), READ64LE(buf + 0));
|
||||
EXPECT_EQ(vigna(), READ64LE(buf + 8));
|
||||
EXPECT_EQ(vigna(), READ64LE(buf + 16));
|
||||
EXPECT_EQ(vigna(), READ64LE(buf + 24));
|
||||
}
|
||||
|
||||
TEST(rngset, testWeirdlyShaped_doesntCrash) {
|
||||
char buf[7];
|
||||
rngset(buf, sizeof(buf), 0, 0);
|
||||
rngset(buf, sizeof(buf), vigna, 0);
|
||||
rngset(buf, sizeof(buf), vigna, 9);
|
||||
rngset(buf, sizeof(buf), vigna, 8);
|
||||
}
|
|
@ -29,12 +29,14 @@ TEST_LIBC_RAND_DIRECTDEPS = \
|
|||
LIBC_STDIO \
|
||||
LIBC_STR \
|
||||
LIBC_STUBS \
|
||||
LIBC_CALLS \
|
||||
LIBC_LOG \
|
||||
LIBC_SYSV \
|
||||
LIBC_TESTLIB \
|
||||
LIBC_UNICODE \
|
||||
LIBC_X \
|
||||
THIRD_PARTY_GDTOA
|
||||
THIRD_PARTY_GDTOA \
|
||||
THIRD_PARTY_MBEDTLS
|
||||
|
||||
TEST_LIBC_RAND_DEPS := \
|
||||
$(call uniq,$(foreach x,$(TEST_LIBC_RAND_DIRECTDEPS),$($(x))))
|
||||
|
|
|
@ -23,5 +23,3 @@ if CLANG=$(command -v clang); then
|
|||
o/$MODE/cosmopolitan.a || exit
|
||||
o/$MODE/test/libc/release/smokeclang2.com.dbg || exit
|
||||
fi
|
||||
|
||||
touch o/$MODE/test/libc/release/clang.ok
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
#!/bin/sh
|
||||
|
||||
if [ "$MODE" = dbg ]; then
|
||||
touch o/$MODE/test/libc/release/emulate.ok
|
||||
exit # TODO
|
||||
fi
|
||||
|
||||
if [ "$MODE" = opt ]; then
|
||||
touch o/$MODE/test/libc/release/emulate.ok
|
||||
exit
|
||||
fi
|
||||
|
||||
|
@ -14,7 +12,6 @@ fi
|
|||
CMD="o/$MODE/tool/build/blinkenlights.com.dbg o/$MODE/examples/hello.com"
|
||||
if OUTPUT="$($CMD)"; then
|
||||
if [ x"$OUTPUT" = x"hello world" ]; then
|
||||
touch o/$MODE/test/libc/release/emulate.ok
|
||||
exit 0
|
||||
else
|
||||
printf '%s\n' "error: $CMD printed wrong output: $OUTPUT" >&2
|
||||
|
|
|
@ -25,5 +25,3 @@ if CLANG=$(command -v clang); then
|
|||
o/$MODE/cosmopolitan.a || exit
|
||||
o/$MODE/test/libc/release/smokeclang.com.dbg || exit
|
||||
fi
|
||||
|
||||
touch o/$MODE/test/libc/release/lld.ok
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
#!/bin/sh
|
||||
|
||||
# TODO(jart): Stack size increase probably broke this.
|
||||
exit
|
||||
|
||||
if [ "$MODE" = dbg ]; then
|
||||
touch o/$MODE/test/libc/release/metal.ok
|
||||
exit # TODO
|
||||
fi
|
||||
|
||||
if [ "$MODE" = opt ]; then
|
||||
touch o/$MODE/test/libc/release/metal.ok
|
||||
exit
|
||||
fi
|
||||
|
||||
|
@ -16,7 +17,6 @@ mkdir -p o/$MODE/test/libc/release/
|
|||
CMD="o/$MODE/tool/build/blinkenlights.com.dbg -r o/$MODE/examples/hello.com"
|
||||
if OUTPUT="$($CMD)"; then
|
||||
if [ x"$OUTPUT" = x"hello world" ]; then
|
||||
touch o/$MODE/test/libc/release/metal.ok
|
||||
exit 0
|
||||
else
|
||||
printf '%s\n' "error: $CMD printed wrong output: $OUTPUT" >&2
|
||||
|
|
|
@ -8,8 +8,8 @@ o/$(MODE)/test/libc/release/cosmopolitan.zip: \
|
|||
o/$(MODE)/ape/ape.o \
|
||||
o/$(MODE)/ape/ape-no-modify-self.o \
|
||||
o/$(MODE)/cosmopolitan.a \
|
||||
o/$(MODE)/host/third_party/infozip/zip.com
|
||||
@$(COMPILE) -AZIP -T$@ o/$(MODE)/host/third_party/infozip/zip.com -qj $@ o/cosmopolitan.h o/$(MODE)/ape/ape.lds o/$(MODE)/libc/crt/crt.o o/$(MODE)/ape/ape.o o/$(MODE)/ape/ape-no-modify-self.o o/$(MODE)/cosmopolitan.a
|
||||
o/$(MODE)/third_party/infozip/zip.com
|
||||
@$(COMPILE) -AZIP -T$@ o/$(MODE)/third_party/infozip/zip.com -qj $@ o/cosmopolitan.h o/$(MODE)/ape/ape.lds o/$(MODE)/libc/crt/crt.o o/$(MODE)/ape/ape.o o/$(MODE)/ape/ape-no-modify-self.o o/$(MODE)/cosmopolitan.a
|
||||
|
||||
o/$(MODE)/test/libc/release/smoke.com: \
|
||||
o/$(MODE)/test/libc/release/smoke.com.dbg
|
||||
|
@ -124,7 +124,7 @@ o/$(MODE)/test/libc/release/clang.ok: \
|
|||
o/$(MODE)/libc/crt/crt.o \
|
||||
o/$(MODE)/ape/ape.o \
|
||||
o/$(MODE)/cosmopolitan.a
|
||||
@$(COMPILE) -ASHTEST -T$< $<
|
||||
@$(COMPILE) -ASHTEST -tT$< $<
|
||||
|
||||
o/$(MODE)/test/libc/release/lld.ok: \
|
||||
test/libc/release/lld.sh \
|
||||
|
@ -134,19 +134,19 @@ o/$(MODE)/test/libc/release/lld.ok: \
|
|||
o/$(MODE)/libc/crt/crt.o \
|
||||
o/$(MODE)/ape/ape.o \
|
||||
o/$(MODE)/cosmopolitan.a
|
||||
@$(COMPILE) -ASHTEST -T$< $<
|
||||
@$(COMPILE) -ASHTEST -tT$< $<
|
||||
|
||||
o/$(MODE)/test/libc/release/metal.ok: \
|
||||
test/libc/release/metal.sh \
|
||||
o/$(MODE)/examples/hello.com \
|
||||
o/$(MODE)/tool/build/blinkenlights.com.dbg
|
||||
@$(COMPILE) -ASHTEST -T$< $<
|
||||
@$(COMPILE) -ASHTEST -tT$< $<
|
||||
|
||||
o/$(MODE)/test/libc/release/emulate.ok: \
|
||||
test/libc/release/emulate.sh \
|
||||
o/$(MODE)/examples/hello.com \
|
||||
o/$(MODE)/tool/build/blinkenlights.com.dbg
|
||||
@$(COMPILE) -ASHTEST -T$< $<
|
||||
@$(COMPILE) -ASHTEST -tT$< $<
|
||||
|
||||
.PHONY: o/$(MODE)/test/libc/release
|
||||
o/$(MODE)/test/libc/release: \
|
||||
|
|
|
@ -25,9 +25,9 @@ TEST(GetDosEnviron, testOneVariable) {
|
|||
#define kEnv u"A=Und wird die Welt auch in Flammen stehen\0"
|
||||
size_t max = 2;
|
||||
size_t size = sizeof(kEnv) >> 1;
|
||||
char *block = malloc(size);
|
||||
char16_t *env = memcpy(malloc(sizeof(kEnv)), kEnv, sizeof(kEnv));
|
||||
char **envp = malloc(max * sizeof(char *));
|
||||
char *block = calloc(1, size);
|
||||
char16_t *env = memcpy(calloc(1, sizeof(kEnv)), kEnv, sizeof(kEnv));
|
||||
char **envp = calloc(1, max * sizeof(char *));
|
||||
EXPECT_EQ(1, GetDosEnviron(env, block, size, envp, max));
|
||||
EXPECT_STREQ("A=Und wird die Welt auch in Flammen stehen", envp[0]);
|
||||
EXPECT_EQ(NULL, envp[1]);
|
||||
|
@ -44,9 +44,9 @@ TEST(GetDosEnviron, testTwoVariables) {
|
|||
u"𐌴𐌵𐌶𐌷=Wir werden wieder auferstehen\0")
|
||||
size_t max = 3;
|
||||
size_t size = 1024;
|
||||
char *block = malloc(size);
|
||||
char16_t *env = memcpy(malloc(sizeof(kEnv)), kEnv, sizeof(kEnv));
|
||||
char **envp = malloc(max * sizeof(char *));
|
||||
char *block = calloc(1, size);
|
||||
char16_t *env = memcpy(calloc(1, sizeof(kEnv)), kEnv, sizeof(kEnv));
|
||||
char **envp = calloc(1, max * sizeof(char *));
|
||||
EXPECT_EQ(2, GetDosEnviron(env, block, size, envp, max));
|
||||
EXPECT_STREQ("𐌰𐌱𐌲𐌳=Und wird die Welt auch in Flammen stehen", envp[0]);
|
||||
EXPECT_STREQ("𐌴𐌵𐌶𐌷=Wir werden wieder auferstehen", envp[1]);
|
||||
|
@ -61,9 +61,9 @@ TEST(GetDosEnviron, testOverrun_truncatesWithGrace) {
|
|||
#define kEnv u"A=Und wird die Welt auch in Flammen stehen\0"
|
||||
size_t max = 2;
|
||||
size_t size = sizeof(kEnv) >> 2;
|
||||
char *block = malloc(size);
|
||||
char16_t *env = memcpy(malloc(sizeof(kEnv)), kEnv, sizeof(kEnv));
|
||||
char **envp = malloc(max * sizeof(char *));
|
||||
char *block = calloc(1, size);
|
||||
char16_t *env = memcpy(calloc(1, sizeof(kEnv)), kEnv, sizeof(kEnv));
|
||||
char **envp = calloc(1, max * sizeof(char *));
|
||||
EXPECT_EQ(1, GetDosEnviron(env, block, size, envp, max));
|
||||
EXPECT_STREQ("A=Und wird die Welt ", envp[0]);
|
||||
EXPECT_EQ(NULL, envp[1]);
|
||||
|
@ -80,7 +80,7 @@ TEST(GetDosEnviron, testEmpty_doesntTouchMemory) {
|
|||
|
||||
TEST(GetDosEnviron, testEmpty_zeroTerminatesWheneverPossible_1) {
|
||||
size_t max = 1;
|
||||
char **envp = malloc(max * sizeof(char *));
|
||||
char **envp = calloc(1, max * sizeof(char *));
|
||||
EXPECT_EQ(0, GetDosEnviron(u"", NULL, 0, envp, max));
|
||||
EXPECT_EQ(NULL, envp[0]);
|
||||
free(envp);
|
||||
|
@ -88,7 +88,7 @@ TEST(GetDosEnviron, testEmpty_zeroTerminatesWheneverPossible_1) {
|
|||
|
||||
TEST(GetDosEnviron, testEmpty_zeroTerminatesWheneverPossible_2) {
|
||||
size_t size = 1;
|
||||
char *block = malloc(size);
|
||||
char *block = calloc(1, size);
|
||||
EXPECT_EQ(0, GetDosEnviron(u"", block, size, NULL, 0));
|
||||
EXPECT_BINEQ(u" ", block);
|
||||
free(block);
|
||||
|
@ -96,7 +96,7 @@ TEST(GetDosEnviron, testEmpty_zeroTerminatesWheneverPossible_2) {
|
|||
|
||||
TEST(GetDosEnviron, testEmpty_zeroTerminatesWheneverPossible_3) {
|
||||
size_t size = 2;
|
||||
char *block = malloc(size);
|
||||
char *block = calloc(1, size);
|
||||
EXPECT_EQ(0, GetDosEnviron(u"", block, size, NULL, 0));
|
||||
EXPECT_BINEQ(u" ", block);
|
||||
free(block);
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
#include "libc/limits.h"
|
||||
#include "libc/macros.internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/nt/enum/version.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
|
|
@ -320,19 +320,3 @@ TEST(ReleaseMemoryIntervals, TestWeirdGap) {
|
|||
mm[1].p = mm[1].s;
|
||||
EXPECT_NE(-1, RunReleaseMemoryIntervalsTest(mm, 15, 25));
|
||||
}
|
||||
|
||||
TEST(ReleaseMemoryIntervals, TestOutOfMemory_AllocatesMore) {
|
||||
int i;
|
||||
struct MemoryIntervals *mm;
|
||||
mm = calloc(1, sizeof(struct MemoryIntervals));
|
||||
mm->n = OPEN_MAX;
|
||||
mm->p = mm->s;
|
||||
for (i = 0; i < OPEN_MAX * 2; ++i) {
|
||||
CHECK_NE(-1, TrackMemoryInterval(mm, i * 10, i * 10 + 8, 0, 0, 0));
|
||||
}
|
||||
CheckMemoryIntervalsAreOk(mm);
|
||||
CHECK_EQ(0, ReleaseMemoryIntervals(mm, 4, 4, NULL));
|
||||
CheckMemoryIntervalsAreOk(mm);
|
||||
free(mm->p);
|
||||
free(mm);
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "libc/sysv/consts/af.h"
|
||||
#include "libc/sysv/consts/inaddr.h"
|
||||
#include "libc/sysv/consts/ipproto.h"
|
||||
#include "libc/sysv/consts/poll.h"
|
||||
#include "libc/sysv/consts/sock.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
#include "libc/x/x.h"
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/calls/struct/dirent.h"
|
||||
#include "libc/errno.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
|
@ -30,6 +31,8 @@ STATIC_YOINK("zip_uri_support");
|
|||
TEST(dirstream, test) {
|
||||
DIR *dir;
|
||||
struct dirent *ent;
|
||||
bool hasfoo = false;
|
||||
bool hasbar = false;
|
||||
char *dpath, *file1, *file2;
|
||||
dpath = gc(xasprintf("%s%s%lu", kTmpPath, "dirstream", rand64()));
|
||||
file1 = gc(xasprintf("%s/%s", dpath, "foo"));
|
||||
|
@ -38,8 +41,6 @@ TEST(dirstream, test) {
|
|||
EXPECT_NE(-1, touch(file1, 0644));
|
||||
EXPECT_NE(-1, touch(file2, 0644));
|
||||
EXPECT_TRUE(NULL != (dir = opendir(dpath)));
|
||||
bool hasfoo = false;
|
||||
bool hasbar = false;
|
||||
while ((ent = readdir(dir))) {
|
||||
if (strcmp(ent->d_name, "foo")) hasfoo = true;
|
||||
if (strcmp(ent->d_name, "bar")) hasbar = true;
|
||||
|
@ -69,6 +70,8 @@ TEST(dirstream, zipTest) {
|
|||
TEST(rewinddir, test) {
|
||||
DIR *dir;
|
||||
struct dirent *ent;
|
||||
bool hasfoo = false;
|
||||
bool hasbar = false;
|
||||
char *dpath, *file1, *file2;
|
||||
dpath = gc(xasprintf("%s%s%lu", kTmpPath, "dirstream", rand64()));
|
||||
file1 = gc(xasprintf("%s/%s", dpath, "foo"));
|
||||
|
@ -81,8 +84,6 @@ TEST(rewinddir, test) {
|
|||
readdir(dir);
|
||||
readdir(dir);
|
||||
rewinddir(dir);
|
||||
bool hasfoo = false;
|
||||
bool hasbar = false;
|
||||
while ((ent = readdir(dir))) {
|
||||
if (strcmp(ent->d_name, "foo")) hasfoo = true;
|
||||
if (strcmp(ent->d_name, "bar")) hasbar = true;
|
||||
|
@ -94,3 +95,8 @@ TEST(rewinddir, test) {
|
|||
EXPECT_NE(-1, unlink(file1));
|
||||
EXPECT_NE(-1, rmdir(dpath));
|
||||
}
|
||||
|
||||
TEST(dirstream, zipTest_notDir) {
|
||||
ASSERT_EQ(NULL, opendir("/zip/usr/share/zoneinfo/New_York"));
|
||||
ASSERT_EQ(ENOTDIR, errno);
|
||||
}
|
||||
|
|
|
@ -16,8 +16,10 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/assert.h"
|
||||
#include "libc/bits/bits.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/runtime/symbols.internal.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/assert.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/str/blake2.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
|
@ -83,8 +84,16 @@ TEST(BLAKE2B256Test, ABC) {
|
|||
}
|
||||
|
||||
BENCH(blake2, bench) {
|
||||
EZBENCH2("blake2b256 0", donothing, EZBLAKE2B256(0, 0));
|
||||
EZBENCH2("blake2b256 8", donothing, EZBLAKE2B256("helloooo", 8));
|
||||
EZBENCH2("blake2b256 22851", donothing,
|
||||
EZBLAKE2B256(kHyperion, kHyperionSize));
|
||||
char fun[256];
|
||||
rngset(fun, 256, rand64, -1);
|
||||
EZBENCH_N("blake2b256", 0, EZBLAKE2B256(0, 0));
|
||||
EZBENCH_N("blake2b256", 8, EZBLAKE2B256("helloooo", 8));
|
||||
EZBENCH_N("blake2b256", 31, EZBLAKE2B256(fun, 31));
|
||||
EZBENCH_N("blake2b256", 32, EZBLAKE2B256(fun, 32));
|
||||
EZBENCH_N("blake2b256", 63, EZBLAKE2B256(fun, 63));
|
||||
EZBENCH_N("blake2b256", 64, EZBLAKE2B256(fun, 64));
|
||||
EZBENCH_N("blake2b256", 128, EZBLAKE2B256(fun, 128));
|
||||
EZBENCH_N("blake2b256", 256, EZBLAKE2B256(fun, 256));
|
||||
EZBENCH_N("blake2b256", kHyperionSize,
|
||||
EZBLAKE2B256(kHyperion, kHyperionSize));
|
||||
}
|
||||
|
|
|
@ -16,9 +16,12 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/bits/bits.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/nexgen32e/crc32.h"
|
||||
#include "libc/nexgen32e/x86feature.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/hyperion.h"
|
||||
|
@ -40,6 +43,10 @@ TEST(crc32c, test) {
|
|||
EXPECT_EQ(0x6d6eefba, crc32c(crc32c(0, FANATICS, strlen(FANATICS)),
|
||||
hyperion + strlen(FANATICS),
|
||||
strlen(hyperion) - strlen(FANATICS)));
|
||||
EXPECT_EQ(0xf372f045, crc32c(0, hyperion + 1, strlen(hyperion) - 1));
|
||||
EXPECT_EQ(0x5aaad5f8, crc32c(0, hyperion + 7, strlen(hyperion) - 7));
|
||||
EXPECT_EQ(0xf8e51ea6, crc32c(0, hyperion + 7, strlen(hyperion) - 8));
|
||||
EXPECT_EQ(0xecc9871d, crc32c(0, kHyperion, kHyperionSize));
|
||||
}
|
||||
|
||||
BENCH(crc32c, bench) {
|
||||
|
|
|
@ -16,59 +16,45 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/alg/alg.h"
|
||||
#include "libc/macros.internal.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/runtime/carsort.h"
|
||||
#include "libc/assert.h"
|
||||
#include "libc/bits/bits.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/intrin/asan.internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/nexgen32e/crc32.h"
|
||||
#include "libc/nexgen32e/x86feature.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/hyperion.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
const int32_t kUnsorted[][2] = {
|
||||
{4, 'a'}, {65, 'b'}, {2, 'c'}, {-1, 'G'}, {-31, 'd'}, {0, 'e'},
|
||||
{99, 'f'}, {2, 'g'}, {83, 'h'}, {782, 'i'}, {1, 'j'},
|
||||
};
|
||||
#define FANATICS "Fanatics"
|
||||
|
||||
const int32_t kGolden[][2] = {
|
||||
{-31, 'd'}, {-1, 'G'}, {0, 'e'}, {1, 'j'}, {2, 'c'}, {2, 'g'},
|
||||
{4, 'a'}, {65, 'b'}, {83, 'h'}, {99, 'f'}, {782, 'i'},
|
||||
};
|
||||
static const char hyperion[] =
|
||||
FANATICS " have their dreams, wherewith they weave / "
|
||||
"A paradise for a sect; the savage too / "
|
||||
"From forth the loftiest fashion of his sleep / "
|
||||
"...";
|
||||
|
||||
int32_t A[ARRAYLEN(kUnsorted)][2];
|
||||
int32_t B[2100][2];
|
||||
|
||||
TEST(carsort100, test) {
|
||||
memcpy(A, kUnsorted, sizeof(A));
|
||||
carsort100(ARRAYLEN(A), A);
|
||||
ASSERT_EQ(0, memcmp(&A[0], &kGolden[0], sizeof(kUnsorted)));
|
||||
TEST(crc32_z, test) {
|
||||
char *p;
|
||||
p = gc(strdup(kHyperion));
|
||||
EXPECT_EQ(0, crc32_z(0, 0, 0));
|
||||
EXPECT_EQ(0, crc32_z(0, "", 0));
|
||||
EXPECT_EQ(0xcbf43926, crc32_z(0, "123456789", 9));
|
||||
EXPECT_EQ(0xc386e7e4, crc32_z(0, hyperion, strlen(hyperion)));
|
||||
EXPECT_EQ(0xc386e7e4, crc32_z(crc32_z(0, FANATICS, strlen(FANATICS)),
|
||||
hyperion + strlen(FANATICS),
|
||||
strlen(hyperion) - strlen(FANATICS)));
|
||||
EXPECT_EQ(0xcbfc3df2, crc32_z(0, hyperion + 1, strlen(hyperion) - 1));
|
||||
EXPECT_EQ(0x9feb0e30, crc32_z(0, hyperion + 7, strlen(hyperion) - 7));
|
||||
EXPECT_EQ(0x5b80e54e, crc32_z(0, hyperion + 7, strlen(hyperion) - 8));
|
||||
EXPECT_EQ(0xe9ded8e6, crc32_z(0, p, kHyperionSize));
|
||||
}
|
||||
|
||||
TEST(carsort1000, test) {
|
||||
memcpy(A, kUnsorted, sizeof(A));
|
||||
carsort1000(ARRAYLEN(A), A);
|
||||
ASSERT_EQ(0, memcmp(&A[0], &kGolden[0], sizeof(kUnsorted)));
|
||||
}
|
||||
|
||||
TEST(qsort, test) {
|
||||
memcpy(A, kUnsorted, sizeof(A));
|
||||
qsort(A, ARRAYLEN(A), 8, cmpsl);
|
||||
ASSERT_EQ(0, memcmp(&A[0], &kGolden[0], sizeof(kUnsorted)));
|
||||
}
|
||||
|
||||
BENCH(carsort, benchMedium) {
|
||||
EZBENCH2("medium carsort100", rngset(B, sizeof(B), rand64, -1),
|
||||
carsort100(ARRAYLEN(B), B));
|
||||
EZBENCH2("medium carsort1000", rngset(B, sizeof(B), rand64, -1),
|
||||
carsort1000(ARRAYLEN(B), B));
|
||||
EZBENCH2("medium qsort", rngset(B, sizeof(B), rand64, -1),
|
||||
qsort(B, ARRAYLEN(B), 8, cmpsl));
|
||||
}
|
||||
|
||||
BENCH(carsort, benchSmall) {
|
||||
EZBENCH2("small carsort100", memcpy(A, kUnsorted, sizeof(A)),
|
||||
carsort100(ARRAYLEN(A), A));
|
||||
EZBENCH2("small carsort1000", memcpy(A, kUnsorted, sizeof(A)),
|
||||
carsort1000(ARRAYLEN(A), A));
|
||||
EZBENCH2("small qsort", memcpy(A, kUnsorted, sizeof(A)),
|
||||
qsort(A, ARRAYLEN(A), 8, cmpsl));
|
||||
BENCH(crc32_z, bench) {
|
||||
EZBENCH_N("crc32_z", kHyperionSize, crc32_z(0, kHyperion, kHyperionSize));
|
||||
EZBENCH_N("crc32_z", kHyperionSize, crc32_z(0, kHyperion, kHyperionSize));
|
||||
}
|
|
@ -17,6 +17,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/inttypes.h"
|
||||
#include "libc/nexgen32e/crc32.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/highwayhash64.h"
|
||||
#include "libc/str/str.h"
|
||||
|
@ -93,6 +94,21 @@ TEST(highwayhash64, test) {
|
|||
TestHash64(0x53c516cce478cad7ull, data, 33, kTestKey2);
|
||||
}
|
||||
|
||||
BENCH(highwayhash64, newbench) {
|
||||
char fun[256];
|
||||
rngset(fun, 256, rand64, -1);
|
||||
EZBENCH_N("highwayhash64", 0, HighwayHash64(0, 0, kTestKey1));
|
||||
EZBENCH_N("highwayhash64", 8, HighwayHash64("helloooo", 8, kTestKey1));
|
||||
EZBENCH_N("highwayhash64", 31, HighwayHash64(fun, 31, kTestKey1));
|
||||
EZBENCH_N("highwayhash64", 32, HighwayHash64(fun, 32, kTestKey1));
|
||||
EZBENCH_N("highwayhash64", 63, HighwayHash64(fun, 63, kTestKey1));
|
||||
EZBENCH_N("highwayhash64", 64, HighwayHash64(fun, 64, kTestKey1));
|
||||
EZBENCH_N("highwayhash64", 128, HighwayHash64(fun, 128, kTestKey1));
|
||||
EZBENCH_N("highwayhash64", 256, HighwayHash64(fun, 256, kTestKey1));
|
||||
EZBENCH_N("highwayhash64", kHyperionSize,
|
||||
HighwayHash64(kHyperion, kHyperionSize, kTestKey1));
|
||||
}
|
||||
|
||||
BENCH(highwayhash64, bench) {
|
||||
EZBENCH2("knuth small", donothing,
|
||||
EXPROPRIATE(KnuthMultiplicativeHash32(VEIL("r", "hello"), 5)));
|
||||
|
|
|
@ -160,8 +160,6 @@ TEST(memcpy, testBackwardsOverlap3) {
|
|||
free(c);
|
||||
}
|
||||
|
||||
void *MemCpy(void *, const void *, size_t);
|
||||
|
||||
#define B(F, N) \
|
||||
do { \
|
||||
char *d = rngset(malloc(N), N, rand64, -1); \
|
||||
|
@ -173,9 +171,7 @@ void *MemCpy(void *, const void *, size_t);
|
|||
} while (0)
|
||||
|
||||
void BB(size_t N) {
|
||||
B(memmove_pure, N);
|
||||
B(memcpy, N);
|
||||
B(MemCpy, N);
|
||||
(fprintf)(stderr, "\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -31,6 +31,12 @@ char u8[] = "utf-8 ☻";
|
|||
char16_t u16[] = u"utf16 ☻";
|
||||
wchar_t u32[] = L"utf32 ☻";
|
||||
|
||||
size_t strlen_pure(const char *s) {
|
||||
size_t n = 0;
|
||||
while (*s++) ++n;
|
||||
return n;
|
||||
}
|
||||
|
||||
TEST(strlen, usageExample_c11) {
|
||||
_Alignas(16) char ugh[] = "eeeeeeeeeeeeeee\017";
|
||||
EXPECT_EQ(1, strlen_pure(ugh + 15));
|
||||
|
|
|
@ -28,6 +28,7 @@ TEST_LIBC_STR_DIRECTDEPS = \
|
|||
LIBC_FMT \
|
||||
LIBC_INTRIN \
|
||||
LIBC_LOG \
|
||||
LIBC_TINYMATH \
|
||||
LIBC_MEM \
|
||||
LIBC_NEXGEN32E \
|
||||
LIBC_RAND \
|
||||
|
|
|
@ -9,6 +9,7 @@ o/$(MODE)/test/libc: \
|
|||
o/$(MODE)/test/libc/dns \
|
||||
o/$(MODE)/test/libc/fmt \
|
||||
o/$(MODE)/test/libc/intrin \
|
||||
o/$(MODE)/test/libc/log \
|
||||
o/$(MODE)/test/libc/mem \
|
||||
o/$(MODE)/test/libc/nexgen32e \
|
||||
o/$(MODE)/test/libc/rand \
|
||||
|
|
|
@ -17,10 +17,15 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
#include "libc/x/x.h"
|
||||
|
||||
double acos_(double) asm("acos");
|
||||
#define acos acos_
|
||||
|
||||
TEST(acos, test) {
|
||||
EXPECT_STREQ("1.5707963267949", gc(xasprintf("%.15g", acos(0.))));
|
||||
EXPECT_STREQ("1.5707963267949", gc(xasprintf("%.15g", acos(-0.))));
|
||||
|
@ -38,3 +43,11 @@ TEST(acos, test) {
|
|||
EXPECT_STREQ("1.5707963267949", gc(xasprintf("%.15g", acos(__DBL_MIN__))));
|
||||
EXPECT_TRUE(isnan(acos(__DBL_MAX__)));
|
||||
}
|
||||
|
||||
BENCH(acos, bench) {
|
||||
EZBENCH2("acos(+0)", donothing, acos(0));
|
||||
EZBENCH2("acos(-0)", donothing, acos(-0.));
|
||||
EZBENCH2("acos(NAN)", donothing, acos(NAN));
|
||||
EZBENCH2("acos(INFINITY)", donothing, acos(INFINITY));
|
||||
EZBENCH_C("acos", _real1(vigna()), acos(_real1(vigna())));
|
||||
}
|
||||
|
|
|
@ -17,10 +17,15 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/rand/rand.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
#include "libc/x/x.h"
|
||||
|
||||
double asin_(double) asm("asin");
|
||||
#define asin asin_
|
||||
|
||||
TEST(asin, test) {
|
||||
EXPECT_STREQ("0", gc(xasprintf("%.15g", asin(0.))));
|
||||
EXPECT_STREQ("-0", gc(xasprintf("%.15g", asin(-0.))));
|
||||
|
@ -38,3 +43,11 @@ TEST(asin, test) {
|
|||
gc(xasprintf("%.15g", asin(__DBL_MIN__))));
|
||||
EXPECT_TRUE(isnan(asin(__DBL_MAX__)));
|
||||
}
|
||||
|
||||
BENCH(asin, bench) {
|
||||
EZBENCH2("asin(+0)", donothing, asin(0));
|
||||
EZBENCH2("asin(-0)", donothing, asin(-0.));
|
||||
EZBENCH2("asin(NAN)", donothing, asin(NAN));
|
||||
EZBENCH2("asin(INFINITY)", donothing, asin(INFINITY));
|
||||
EZBENCH_C("asin", _real1(vigna()), asin(_real1(vigna())));
|
||||
}
|
||||
|
|
|
@ -33,24 +33,28 @@ void TearDown(void) {
|
|||
}
|
||||
|
||||
TEST(strtod, testNearest) {
|
||||
if (IsWindows()) return;
|
||||
fesetround(FE_TONEAREST);
|
||||
EXPECT_STREQ("-1.79769313486231e+308",
|
||||
gc(xasprintf("%.15g", strtod("-1.79769313486231e+308", NULL))));
|
||||
}
|
||||
|
||||
TEST(strtod, testDownward) {
|
||||
if (IsWindows()) return;
|
||||
fesetround(FE_DOWNWARD);
|
||||
EXPECT_STREQ("-1.79769313486232e+308",
|
||||
gc(xasprintf("%.15g", strtod("-1.79769313486231e+308", NULL))));
|
||||
}
|
||||
|
||||
TEST(strtod, testUpward) {
|
||||
if (IsWindows()) return;
|
||||
fesetround(FE_UPWARD);
|
||||
EXPECT_STREQ("-1.7976931348623e+308",
|
||||
gc(xasprintf("%.15g", strtod("-1.79769313486231e+308", NULL))));
|
||||
}
|
||||
|
||||
TEST(strtod, testTowardzero) {
|
||||
if (IsWindows()) return;
|
||||
char *p;
|
||||
for (int i = 0; i < 9999; ++i) {
|
||||
fesetround(FE_TOWARDZERO);
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/assert.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/hyperion.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
@ -38,6 +39,19 @@ TEST(strwidth, hyperion) {
|
|||
ASSERT_EQ(22304, strwidth(kHyperion, 0));
|
||||
}
|
||||
|
||||
TEST(strwidth, chinese) {
|
||||
ASSERT_EQ(53 * 4,
|
||||
strwidth("天地玄黄 宇宙洪荒 日月盈昃 辰宿列张 寒来暑往 秋收冬藏"
|
||||
"闰馀成岁 律吕调阳 云腾致雨 露结为霜 金生丽水 玉出昆冈"
|
||||
"剑号巨阙 珠称夜光 果珍李柰 菜重芥姜 海咸河淡 鳞潜羽翔"
|
||||
"龙师火帝 鸟官人皇 始制文字 乃服衣裳 推位让国 有虞陶唐",
|
||||
0));
|
||||
}
|
||||
|
||||
TEST(strwidth, cjk) {
|
||||
ASSERT_EQ(37, strwidth("거주하는 사람들 중에서 한국어를 주로 ", 0));
|
||||
}
|
||||
|
||||
BENCH(strnwidth, bench) {
|
||||
EZBENCH2("strnwidth", donothing, EXPROPRIATE(strnwidth(kHyperion, -1, 0)));
|
||||
}
|
||||
|
|
54
test/libc/x/utf16to32_test.c
Normal file
54
test/libc/x/utf16to32_test.c
Normal file
|
@ -0,0 +1,54 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/hyperion.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
#include "libc/x/x.h"
|
||||
|
||||
TEST(utf16to32, testChinese) {
|
||||
EXPECT_STREQ(
|
||||
L"天地玄黄 宇宙洪荒 日月盈昃 辰宿列张 寒来暑往 秋收冬藏"
|
||||
L"闰馀成岁 律吕调阳 云腾致雨 露结为霜 金生丽水 玉出昆冈"
|
||||
L"剑号巨阙 珠称夜光 果珍李柰 菜重芥姜 海咸河淡 鳞潜羽翔"
|
||||
L"龙师火帝 鸟官人皇 始制文字 乃服衣裳 推位让国 有虞陶唐",
|
||||
gc(utf16to32(u"天地玄黄 宇宙洪荒 日月盈昃 辰宿列张 寒来暑往 秋收冬藏"
|
||||
u"闰馀成岁 律吕调阳 云腾致雨 露结为霜 金生丽水 玉出昆冈"
|
||||
u"剑号巨阙 珠称夜光 果珍李柰 菜重芥姜 海咸河淡 鳞潜羽翔"
|
||||
u"龙师火帝 鸟官人皇 始制文字 乃服衣裳 推位让国 有虞陶唐",
|
||||
-1, 0)));
|
||||
}
|
||||
|
||||
TEST(utf16to32, testAstralPlanesGothic) {
|
||||
EXPECT_STREQ(L"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷𐌸𐌹𐌺𐌻𐌼𐌽𐌾𐌿𐍀𐍁𐍂𐍃𐍄𐍅𐍆𐍇𐍈𐍉𐍊"
|
||||
L"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷𐌸𐌹𐌺𐌻𐌼𐌽𐌾𐌿𐍀𐍁𐍂𐍃𐍄𐍅𐍆𐍇𐍈𐍉𐍊"
|
||||
L"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷𐌸𐌹𐌺𐌻𐌼𐌽𐌾𐌿𐍀𐍁𐍂𐍃𐍄𐍅𐍆𐍇𐍈𐍉𐍊"
|
||||
L"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷𐌸𐌹𐌺𐌻𐌼𐌽𐌾𐌿𐍀𐍁𐍂𐍃𐍄𐍅𐍆𐍇𐍈𐍉𐍊",
|
||||
gc(utf16to32(u"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷𐌸𐌹𐌺𐌻𐌼𐌽𐌾𐌿𐍀𐍁𐍂𐍃𐍄𐍅𐍆𐍇𐍈𐍉𐍊"
|
||||
u"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷𐌸𐌹𐌺𐌻𐌼𐌽𐌾𐌿𐍀𐍁𐍂𐍃𐍄𐍅𐍆𐍇𐍈𐍉𐍊"
|
||||
u"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷𐌸𐌹𐌺𐌻𐌼𐌽𐌾𐌿𐍀𐍁𐍂𐍃𐍄𐍅𐍆𐍇𐍈𐍉𐍊"
|
||||
u"𐌰𐌱𐌲𐌳𐌴𐌵𐌶𐌷𐌸𐌹𐌺𐌻𐌼𐌽𐌾𐌿𐍀𐍁𐍂𐍃𐍄𐍅𐍆𐍇𐍈𐍉𐍊",
|
||||
-1, 0)));
|
||||
}
|
||||
|
||||
BENCH(utf16to8, bench) {
|
||||
size_t n;
|
||||
char16_t *h;
|
||||
h = gc(utf8toutf16(kHyperion, kHyperionSize, &n));
|
||||
EZBENCH2("utf16toutf8", donothing, free(utf16to32(h, n, 0)));
|
||||
}
|
|
@ -17,6 +17,7 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/hyperion.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
@ -37,6 +38,6 @@ TEST(utf16toutf8, test) {
|
|||
BENCH(utf16toutf8, bench) {
|
||||
size_t n;
|
||||
char16_t *h;
|
||||
h = utf8toutf16(kHyperion, kHyperionSize, &n);
|
||||
h = gc(utf8toutf16(kHyperion, kHyperionSize, &n));
|
||||
EZBENCH2("utf16toutf8", donothing, free(utf16toutf8(h, n, 0)));
|
||||
}
|
||||
|
|
|
@ -188,6 +188,22 @@ BENCH(p384, bench) {
|
|||
#endif
|
||||
}
|
||||
|
||||
TEST(md, test) {
|
||||
uint8_t d[16];
|
||||
uint8_t want[16] = {0x90, 0x01, 0x50, 0x98, 0x3C, 0xD2, 0x4F, 0xB0,
|
||||
0xD6, 0x96, 0x3F, 0x7D, 0x28, 0xE1, 0x7F, 0x72};
|
||||
mbedtls_md_context_t ctx;
|
||||
const mbedtls_md_info_t *digest;
|
||||
digest = mbedtls_md_info_from_type(MBEDTLS_MD_MD5);
|
||||
mbedtls_md_init(&ctx);
|
||||
mbedtls_md_setup(&ctx, digest, 0);
|
||||
mbedtls_md_starts(&ctx);
|
||||
mbedtls_md_update(&ctx, (const unsigned char *)"abc", 3);
|
||||
mbedtls_md_finish(&ctx, d);
|
||||
mbedtls_md_free(&ctx);
|
||||
EXPECT_EQ(0, memcmp(want, d, 16));
|
||||
}
|
||||
|
||||
TEST(md5, test) {
|
||||
uint8_t d[16];
|
||||
uint8_t want[16] = {0x90, 0x01, 0x50, 0x98, 0x3C, 0xD2, 0x4F, 0xB0,
|
||||
|
@ -251,16 +267,18 @@ TEST(sha512, test) {
|
|||
|
||||
BENCH(mbedtls, bench) {
|
||||
uint8_t d[64];
|
||||
EZBENCH2("md5", donothing, mbedtls_md5_ret(kHyperion, kHyperionSize, d));
|
||||
EZBENCH2("sha1", donothing, mbedtls_sha1_ret(kHyperion, kHyperionSize, d));
|
||||
EZBENCH2("sha256", donothing,
|
||||
mbedtls_sha256_ret(kHyperion, kHyperionSize, d, 0));
|
||||
EZBENCH2("sha384", donothing,
|
||||
mbedtls_sha512_ret(kHyperion, kHyperionSize, d, 1));
|
||||
EZBENCH2("sha512", donothing,
|
||||
mbedtls_sha512_ret(kHyperion, kHyperionSize, d, 0));
|
||||
EZBENCH2("BLAKE2B256", donothing, BLAKE2B256(kHyperion, kHyperionSize, d));
|
||||
EZBENCH2("crc32_z", donothing, crc32_z(0, kHyperion, kHyperionSize));
|
||||
EZBENCH_N("md5", kHyperionSize, mbedtls_md5_ret(kHyperion, kHyperionSize, d));
|
||||
EZBENCH_N("sha1", kHyperionSize,
|
||||
mbedtls_sha1_ret(kHyperion, kHyperionSize, d));
|
||||
EZBENCH_N("sha256", kHyperionSize,
|
||||
mbedtls_sha256_ret(kHyperion, kHyperionSize, d, 0));
|
||||
EZBENCH_N("sha384", kHyperionSize,
|
||||
mbedtls_sha512_ret(kHyperion, kHyperionSize, d, 1));
|
||||
EZBENCH_N("sha512", kHyperionSize,
|
||||
mbedtls_sha512_ret(kHyperion, kHyperionSize, d, 0));
|
||||
EZBENCH_N("blake2b256", kHyperionSize,
|
||||
BLAKE2B256(kHyperion, kHyperionSize, d));
|
||||
EZBENCH_N("crc32_z", kHyperionSize, crc32_z(0, kHyperion, kHyperionSize));
|
||||
}
|
||||
|
||||
char *mpi2str(mbedtls_mpi *m) {
|
||||
|
@ -1125,3 +1143,15 @@ BENCH(cmpint, bench) {
|
|||
EZBENCH2("cmpint 3.1", donothing, mbedtls_mpi_cmp_int(&z, 0));
|
||||
EZBENCH2("cmpint 3.2", donothing, mbedtls_mpi_cmp_int(&z, 1));
|
||||
}
|
||||
|
||||
TEST(pbkdf2, test) {
|
||||
unsigned char dk[20];
|
||||
mbedtls_md_context_t ctx;
|
||||
mbedtls_md_init(&ctx);
|
||||
ASSERT_EQ(
|
||||
0, mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), 1));
|
||||
EXPECT_EQ(
|
||||
0, mbedtls_pkcs5_pbkdf2_hmac(&ctx, "password", 8, "salt", 4, 1, 20, dk));
|
||||
EXPECT_BINEQ("0c60c80f961f0e71f3a9b524af6012062fe037a6", dk);
|
||||
mbedtls_md_free(&ctx);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue