Jack Grigg
8 years ago
5 changed files with 238 additions and 35 deletions
@ -0,0 +1,184 @@ |
|||
#include <gtest/gtest.h> |
|||
#include <gmock/gmock.h> |
|||
|
|||
#include "crypto/equihash.h" |
|||
|
|||
TEST(equihash_tests, check_basic_solver_cancelled) { |
|||
Equihash<48,5> Eh48_5; |
|||
crypto_generichash_blake2b_state state; |
|||
Eh48_5.InitialiseState(state); |
|||
std::set<std::vector<unsigned int>> solns; |
|||
|
|||
{ |
|||
ASSERT_NO_THROW(Eh48_5.BasicSolve(state, [](EhSolverCancelCheck pos) { |
|||
return false; |
|||
})); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.BasicSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == ListGeneration; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.BasicSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == ListSorting; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.BasicSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == ListColliding; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.BasicSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == RoundEnd; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.BasicSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == FinalSorting; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.BasicSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == FinalColliding; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_NO_THROW(Eh48_5.BasicSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == StartCulling; |
|||
})); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_NO_THROW(Eh48_5.BasicSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == PartialGeneration; |
|||
})); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_NO_THROW(Eh48_5.BasicSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == PartialSorting; |
|||
})); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_NO_THROW(Eh48_5.BasicSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == PartialSubtreeEnd; |
|||
})); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_NO_THROW(Eh48_5.BasicSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == PartialIndexEnd; |
|||
})); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_NO_THROW(Eh48_5.BasicSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == PartialEnd; |
|||
})); |
|||
} |
|||
} |
|||
|
|||
TEST(equihash_tests, check_optimised_solver_cancelled) { |
|||
Equihash<48,5> Eh48_5; |
|||
crypto_generichash_blake2b_state state; |
|||
Eh48_5.InitialiseState(state); |
|||
std::set<std::vector<unsigned int>> solns; |
|||
|
|||
{ |
|||
ASSERT_NO_THROW(Eh48_5.OptimisedSolve(state, [](EhSolverCancelCheck pos) { |
|||
return false; |
|||
})); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.OptimisedSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == ListGeneration; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.OptimisedSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == ListSorting; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.OptimisedSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == ListColliding; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.OptimisedSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == RoundEnd; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.OptimisedSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == FinalSorting; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
// More state required here, because in OptimisedSolve() the
|
|||
// FinalColliding cancellation check can't throw because it will leak
|
|||
// memory, and it can't goto because that steps over initialisations.
|
|||
bool triggered = false; |
|||
ASSERT_THROW(Eh48_5.OptimisedSolve(state, [=](EhSolverCancelCheck pos) mutable { |
|||
if (triggered) |
|||
return pos == StartCulling; |
|||
if (pos == FinalColliding) { |
|||
triggered = true; |
|||
return true; |
|||
} |
|||
return false; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.OptimisedSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == StartCulling; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.OptimisedSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == PartialGeneration; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.OptimisedSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == PartialSorting; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.OptimisedSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == PartialSubtreeEnd; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.OptimisedSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == PartialIndexEnd; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
|
|||
{ |
|||
ASSERT_THROW(Eh48_5.OptimisedSolve(state, [](EhSolverCancelCheck pos) { |
|||
return pos == PartialEnd; |
|||
}), EhSolverCancelledException); |
|||
} |
|||
} |
Loading…
Reference in new issue