Merge pull request #2989 from ethereum/filterMoreWarnigs

Allow frameworks to filter warnings.
This commit is contained in:
chriseth 2017-09-29 12:41:26 +02:00 committed by GitHub
commit f3fe043cc1
2 changed files with 40 additions and 16 deletions

View File

@ -25,6 +25,8 @@
#include <libsolidity/ast/AST.h> #include <libsolidity/ast/AST.h>
#include <libsolidity/parsing/Scanner.h>
#include <libdevcore/SHA3.h> #include <libdevcore/SHA3.h>
#include <boost/test/unit_test.hpp> #include <boost/test/unit_test.hpp>
@ -46,8 +48,7 @@ AnalysisFramework::parseAnalyseAndReturnError(
m_compiler.addSource("", _insertVersionPragma ? "pragma solidity >=0.0;\n" + _source : _source); m_compiler.addSource("", _insertVersionPragma ? "pragma solidity >=0.0;\n" + _source : _source);
if (!m_compiler.parse()) if (!m_compiler.parse())
{ {
printErrors(); BOOST_ERROR("Parsing contract failed in analysis test suite:" + formatErrors());
BOOST_ERROR("Parsing contract failed in analysis test suite.");
} }
m_compiler.analyze(); m_compiler.analyze();
@ -56,15 +57,24 @@ AnalysisFramework::parseAnalyseAndReturnError(
for (auto const& currentError: m_compiler.errors()) for (auto const& currentError: m_compiler.errors())
{ {
solAssert(currentError->comment(), ""); solAssert(currentError->comment(), "");
if (currentError->comment()->find("This is a pre-release compiler version") == 0) if (currentError->type() == Error::Type::Warning)
{
bool ignoreWarning = false;
for (auto const& filter: m_warningsToFilter)
if (currentError->comment()->find(filter) == 0)
{
ignoreWarning = true;
break;
}
if (ignoreWarning)
continue; continue;
}
if (_reportWarnings || (currentError->type() != Error::Type::Warning)) if (_reportWarnings || (currentError->type() != Error::Type::Warning))
{ {
if (firstError && !_allowMultipleErrors) if (firstError && !_allowMultipleErrors)
{ {
printErrors(); BOOST_FAIL("Multiple errors found: " + formatErrors());
BOOST_FAIL("Multiple errors found.");
} }
if (!firstError) if (!firstError)
firstError = currentError; firstError = currentError;
@ -78,7 +88,10 @@ SourceUnit const* AnalysisFramework::parseAndAnalyse(string const& _source)
{ {
auto sourceAndError = parseAnalyseAndReturnError(_source); auto sourceAndError = parseAnalyseAndReturnError(_source);
BOOST_REQUIRE(!!sourceAndError.first); BOOST_REQUIRE(!!sourceAndError.first);
BOOST_REQUIRE(!sourceAndError.second); string message;
if (sourceAndError.second)
message = "Unexpected error: " + formatError(*sourceAndError.second);
BOOST_REQUIRE_MESSAGE(!sourceAndError.second, message);
return sourceAndError.first; return sourceAndError.first;
} }
@ -91,17 +104,23 @@ Error AnalysisFramework::expectError(std::string const& _source, bool _warning,
{ {
auto sourceAndError = parseAnalyseAndReturnError(_source, _warning, true, _allowMultiple); auto sourceAndError = parseAnalyseAndReturnError(_source, _warning, true, _allowMultiple);
BOOST_REQUIRE(!!sourceAndError.second); BOOST_REQUIRE(!!sourceAndError.second);
BOOST_REQUIRE(!!sourceAndError.first); BOOST_REQUIRE_MESSAGE(!!sourceAndError.first, "Expected error, but no error happened.");
return *sourceAndError.second; return *sourceAndError.second;
} }
void AnalysisFramework::printErrors() string AnalysisFramework::formatErrors()
{ {
string message;
for (auto const& error: m_compiler.errors()) for (auto const& error: m_compiler.errors())
SourceReferenceFormatter::printExceptionInformation( message += formatError(*error);
std::cerr, return message;
*error, }
(error->type() == Error::Type::Warning) ? "Warning" : "Error",
string AnalysisFramework::formatError(Error const& _error)
{
return SourceReferenceFormatter::formatExceptionInformation(
_error,
(_error.type() == Error::Type::Warning) ? "Warning" : "Error",
[&](std::string const& _sourceName) -> solidity::Scanner const& { return m_compiler.scanner(_sourceName); } [&](std::string const& _sourceName) -> solidity::Scanner const& { return m_compiler.scanner(_sourceName); }
); );
} }

View File

@ -45,7 +45,7 @@ class AnalysisFramework
{ {
protected: protected:
std::pair<SourceUnit const*, std::shared_ptr<Error const>> virtual std::pair<SourceUnit const*, std::shared_ptr<Error const>>
parseAnalyseAndReturnError( parseAnalyseAndReturnError(
std::string const& _source, std::string const& _source,
bool _reportWarnings = false, bool _reportWarnings = false,
@ -57,7 +57,8 @@ protected:
bool success(std::string const& _source); bool success(std::string const& _source);
Error expectError(std::string const& _source, bool _warning = false, bool _allowMultiple = false); Error expectError(std::string const& _source, bool _warning = false, bool _allowMultiple = false);
void printErrors(); std::string formatErrors();
std::string formatError(Error const& _error);
static ContractDefinition const* retrieveContractByName(SourceUnit const& _source, std::string const& _name); static ContractDefinition const* retrieveContractByName(SourceUnit const& _source, std::string const& _name);
static FunctionTypePointer retrieveFunctionBySignature( static FunctionTypePointer retrieveFunctionBySignature(
@ -65,6 +66,7 @@ protected:
std::string const& _signature std::string const& _signature
); );
std::vector<std::string> m_warningsToFilter = {"This is a pre-release compiler version"};
dev::solidity::CompilerStack m_compiler; dev::solidity::CompilerStack m_compiler;
}; };
@ -104,7 +106,10 @@ CHECK_ERROR_OR_WARNING(text, Warning, substring, true, true)
do \ do \
{ \ { \
auto sourceAndError = parseAnalyseAndReturnError((text), true); \ auto sourceAndError = parseAnalyseAndReturnError((text), true); \
BOOST_CHECK(sourceAndError.second == nullptr); \ std::string message; \
if (sourceAndError.second) \
message = formatError(*sourceAndError.second); \
BOOST_CHECK_MESSAGE(!sourceAndError.second, message); \
} \ } \
while(0) while(0)