aboutsummaryrefslogtreecommitdiffstats
path: root/checks/check.cpp
diff options
context:
space:
mode:
authorlloyd <[email protected]>2008-09-08 16:29:57 +0000
committerlloyd <[email protected]>2008-09-08 16:29:57 +0000
commit32fafc2612c3edfd386c2dd282b992162d5df306 (patch)
tree8a029d7f3e8a8faae8a7b1d8cead7693ac2930c7 /checks/check.cpp
parent39e5a94b4407494a95fa74bbd4c9c1b88a09bece (diff)
Last checkin would crash, because the destructor for the rng would not
run until after the block ended, which was after set_global_state(0) had run, causing crashes in the destructors that attempted to free memory. Restructure the argument handling, it is significantly easier to understand now. Only create the rng where it is needed.
Diffstat (limited to 'checks/check.cpp')
-rw-r--r--checks/check.cpp115
1 files changed, 55 insertions, 60 deletions
diff --git a/checks/check.cpp b/checks/check.cpp
index c9550ee08..0449776f9 100644
--- a/checks/check.cpp
+++ b/checks/check.cpp
@@ -28,7 +28,7 @@ const std::string BIGINT_VALIDATION_FILE = "checks/mp_valid.dat";
const std::string PK_VALIDATION_FILE = "checks/pk_valid.dat";
const std::string EXPECTED_FAIL_FILE = "checks/fail.dat";
-int validate(RandomNumberGenerator& rng);
+int run_test_suite();
namespace {
@@ -78,7 +78,7 @@ void test_types()
bool passed = true;
passed = passed && test<Botan::byte >("byte", 8, false);
- passed = passed && test<Botan::u16bit>("u16bit", 18, false);
+ passed = passed && test<Botan::u16bit>("u16bit", 16, false);
passed = passed && test<Botan::u32bit>("u32bit", 32, false);
passed = passed && test<Botan::u64bit>("u64bit", 64, false);
passed = passed && test<Botan::s32bit>("s32bit", 31, true);
@@ -102,16 +102,14 @@ int main(int argc, char* argv[])
Botan::InitializerOptions init_options(opts.value_if_set("init"));
//Botan::LibraryInitializer init(init_options);
-
- std::auto_ptr<RandomNumberGenerator> rng(
- RandomNumberGenerator::make_rng());
+ //Botan::LibraryInitializer::initialize(init_options);
if(opts.is_set("help") || argc <= 1)
{
std::cerr << "Test driver for "
<< Botan::version_string() << "\n"
<< "Options:\n"
- << " --validate: Check test vectors\n"
+ << " --test || --validate: Run tests (do this at least once)\n"
<< " --benchmark: Benchmark everything\n"
<< " --bench-type={block,mode,stream,hash,mac,rng,pk}:\n"
<< " Benchmark only algorithms of a particular type\n"
@@ -119,31 +117,32 @@ int main(int argc, char* argv[])
<< " --seconds=n: Benchmark for n seconds\n"
<< " --init=<str>: Pass <str> to the library\n"
<< " --help: Print this message\n";
- return 1;
}
-
- if(opts.is_set("validate"))
- return validate(*rng);
-
- double seconds = 1.5;
-
- if(opts.is_set("seconds"))
+ else if(opts.is_set("validate") || opts.is_set("test"))
{
- seconds = std::atof(opts.value("seconds").c_str());
- if(seconds && (seconds < 0.1 || seconds > (5 * 60)))
- {
- std::cout << "Invalid argument to --seconds\n";
- return 2;
- }
+ run_test_suite();
}
+ if(opts.is_set("bench-algo") || opts.is_set("benchmark"))
+ {
+ double seconds = 1.5;
- const bool html = opts.is_set("html");
+ if(opts.is_set("seconds"))
+ {
+ seconds = std::atof(opts.value("seconds").c_str());
+ if(seconds && (seconds < 0.1 || seconds > (5 * 60)))
+ {
+ std::cout << "Invalid argument to --seconds\n";
+ return 2;
+ }
+ }
- if(opts.is_set("bench-algo"))
- {
+ const bool html = opts.is_set("html");
std::vector<std::string> algs =
Botan::split_on(opts.value("bench-algo"), ',');
+ std::auto_ptr<RandomNumberGenerator> rng(
+ RandomNumberGenerator::make_rng());
+
for(u32bit j = 0; j != algs.size(); j++)
{
const std::string alg = algs[j];
@@ -151,62 +150,58 @@ int main(int argc, char* argv[])
if(!found) // maybe it's a PK algorithm
bench_pk(*rng, alg, html, seconds);
}
- }
-
- if(opts.is_set("benchmark"))
- benchmark("All", *rng, html, seconds);
- else if(opts.is_set("bench-type"))
- {
- const std::string type = opts.value("bench-type");
- if(type == "all")
+ if(opts.is_set("benchmark"))
benchmark("All", *rng, html, seconds);
- else if(type == "block")
- benchmark("Block Cipher", *rng, html, seconds);
- else if(type == "stream")
- benchmark("Stream Cipher", *rng, html, seconds);
- else if(type == "hash")
- benchmark("Hash", *rng, html, seconds);
- else if(type == "mac")
- benchmark("MAC", *rng, html, seconds);
- else if(type == "*rng")
- benchmark("RNG", *rng, html, seconds);
- else if(type == "pk")
- bench_pk(*rng, "All", html, seconds);
+ else if(opts.is_set("bench-type"))
+ {
+ const std::string type = opts.value("bench-type");
+
+ if(type == "all")
+ benchmark("All", *rng, html, seconds);
+ else if(type == "block")
+ benchmark("Block Cipher", *rng, html, seconds);
+ else if(type == "stream")
+ benchmark("Stream Cipher", *rng, html, seconds);
+ else if(type == "hash")
+ benchmark("Hash", *rng, html, seconds);
+ else if(type == "mac")
+ benchmark("MAC", *rng, html, seconds);
+ else if(type == "rng")
+ benchmark("RNG", *rng, html, seconds);
+ else if(type == "pk")
+ bench_pk(*rng, "All", html, seconds);
+ }
}
Botan::set_global_state(0);
}
- catch(Botan::Exception& e)
- {
- std::cout << "Exception caught:\n " << e.what() << std::endl;
- return 1;
- }
catch(std::exception& e)
{
- std::cout << "Standard library exception caught:\n "
- << e.what() << std::endl;
- return 1;
+ std::cerr << "Exception: " << e.what() << std::endl;
}
catch(...)
{
- std::cout << "Unknown exception caught." << std::endl;
- return 1;
+ std::cerr << "Unknown (...) exception caught" << std::endl;
}
return 0;
}
-int validate(RandomNumberGenerator& rng)
+int run_test_suite()
{
- std::cout << "Beginning validation tests..." << std::endl;
+ std::cout << "Beginning tests..." << std::endl;
u32bit errors = 0;
- try {
- errors += do_validation_tests(VALIDATION_FILE, rng);
- errors += do_validation_tests(EXPECTED_FAIL_FILE, rng, false);
- errors += do_bigint_tests(BIGINT_VALIDATION_FILE, rng);
- errors += do_pk_validation_tests(PK_VALIDATION_FILE, rng);
+ try
+ {
+ std::auto_ptr<RandomNumberGenerator> rng(
+ RandomNumberGenerator::make_rng());
+
+ errors += do_validation_tests(VALIDATION_FILE, *rng);
+ errors += do_validation_tests(EXPECTED_FAIL_FILE, *rng, false);
+ errors += do_bigint_tests(BIGINT_VALIDATION_FILE, *rng);
+ errors += do_pk_validation_tests(PK_VALIDATION_FILE, *rng);
}
catch(Botan::Exception& e)
{