-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Limit max recursion for script importer and added a test.
- Loading branch information
Showing
8 changed files
with
215 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
|
||
cc_test( | ||
name = "java-script-options-tests", | ||
srcs = ["ctpg_script_importer_test.cc", "swig_factory_test.cc", "swig_factory_test.h"], | ||
deps = [ | ||
"//base/javacontainer/script_options:java_script_option_lines", | ||
"@googletest//:gtest_main", | ||
], | ||
) | ||
|
57 changes: 57 additions & 0 deletions
57
exaudfclient/base/javacontainer/script_options/test/ctpg_script_importer_test.cc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
|
||
#include "include/gtest/gtest.h" | ||
#include "gmock/gmock.h" | ||
#include "base/javacontainer/script_options/parser_ctpg.h" | ||
|
||
#include "base/javacontainer/script_options/test/swig_factory_test.h" | ||
#include <string.h> | ||
|
||
using namespace SWIGVMContainers::JavaScriptOptions; | ||
|
||
|
||
static const char* sc_scriptName = "script"; | ||
|
||
|
||
void checkIndex(size_t currentIdx, const char* scriptKey) { | ||
std::stringstream ss; | ||
ss << sc_scriptName << currentIdx; | ||
if (ss.str() != scriptKey) { | ||
throw std::logic_error(std::string("Script Key does not match: '") + ss.str() + " != '" + scriptKey + "'"); | ||
} | ||
} | ||
|
||
const char* buildNewScriptCode(size_t currentIdx) { | ||
std::stringstream ss; | ||
ss << "%import " << sc_scriptName << currentIdx << ";something"; | ||
static std::string ret; | ||
ret = ss.str(); | ||
return ret.c_str(); | ||
} | ||
|
||
TEST(ScriptImporterTest, max_recursion_depth) { | ||
|
||
size_t currentIdx = 0; | ||
SwigFactoryTestImpl swigFactoryTest([&](const char* scriptKey) { | ||
checkIndex(currentIdx, scriptKey); | ||
return buildNewScriptCode(++currentIdx); | ||
}); | ||
ScriptOptionLinesParserCTPG parser; | ||
|
||
const std::string code = buildNewScriptCode(currentIdx); | ||
parser.prepareScriptCode(code); | ||
EXPECT_THROW({ | ||
try | ||
{ | ||
parser.extractImportScripts(swigFactoryTest); | ||
} | ||
catch( const std::runtime_error& e ) | ||
{ | ||
//We need to deceive "find_duplicate_error_codes.sh" here | ||
const std::string expectedError = | ||
std::string("F-UDF-CL-SL-JAVA-") + "1633: Maximal recursion depth for importing scripts reached."; | ||
EXPECT_STREQ( expectedError.c_str(), e.what()); | ||
throw; | ||
} | ||
}, std::runtime_error ); | ||
} | ||
|
105 changes: 105 additions & 0 deletions
105
exaudfclient/base/javacontainer/script_options/test/swig_factory_test.cc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
#include "base/javacontainer/script_options/test/swig_factory_test.h" | ||
#include "base/exaudflib/swig/swig_meta_data.h" | ||
|
||
#include <stdexcept> | ||
|
||
class NotImplemented : public std::logic_error | ||
{ | ||
public: | ||
NotImplemented() : std::logic_error("Function not yet implemented") { }; | ||
NotImplemented(const std::string funcName) : std::logic_error("Function " + funcName + " not yet implemented") { }; | ||
}; | ||
|
||
class SWIGMetadataTest : public SWIGVMContainers::SWIGMetadataIf { | ||
|
||
public: | ||
SWIGMetadataTest(std::function<const char*(const char*)> callback): m_callback(callback) {} | ||
virtual const char* databaseName() { throw NotImplemented("databaseName"); return nullptr;} | ||
virtual const char* databaseVersion() { throw NotImplemented("databaseVersion"); return nullptr;} | ||
virtual const char* scriptName() { throw NotImplemented("scriptName"); return nullptr;} | ||
virtual const char* scriptSchema() { throw NotImplemented("scriptSchema"); return nullptr;} | ||
virtual const char* currentUser() { throw NotImplemented("currentUser"); return nullptr;} | ||
virtual const char* scopeUser() { throw NotImplemented("scopeUser"); return nullptr;} | ||
virtual const char* currentSchema() { throw NotImplemented("currentSchema"); return nullptr;} | ||
virtual const char* scriptCode() { throw NotImplemented("scriptCode"); return nullptr;} | ||
virtual const unsigned long long sessionID() { throw NotImplemented("sessionID"); return 0;} | ||
virtual const char *sessionID_S() { throw NotImplemented("sessionID_S"); return nullptr;} | ||
virtual const unsigned long statementID() { throw NotImplemented("statementID"); return 0;} | ||
virtual const unsigned int nodeCount() { throw NotImplemented("nodeCount"); return 0;} | ||
virtual const unsigned int nodeID() { throw NotImplemented("nodeID"); return 0;} | ||
virtual const unsigned long long vmID() { throw NotImplemented("vmID"); return 0;} | ||
virtual const unsigned long long memoryLimit() { throw NotImplemented("memoryLimit"); return 0;} | ||
virtual const SWIGVMContainers::VMTYPE vmType() { | ||
throw NotImplemented("vmType"); | ||
return SWIGVMContainers::VM_UNSUPPORTED; | ||
} | ||
virtual const char *vmID_S() { throw NotImplemented("vmID_S"); return nullptr;} | ||
virtual const ExecutionGraph::ConnectionInformationWrapper* connectionInformation(const char* connection_name) { | ||
throw NotImplemented("connectionInformation"); return nullptr; | ||
} | ||
virtual const char* moduleContent(const char* name) { | ||
return m_callback(name); | ||
} | ||
virtual const unsigned int inputColumnCount() { throw NotImplemented("inputColumnCount"); return 0;} | ||
virtual const char *inputColumnName(unsigned int col) { | ||
throw NotImplemented("inputColumnName"); | ||
return nullptr; | ||
} | ||
virtual const SWIGVMContainers::SWIGVM_datatype_e inputColumnType(unsigned int col) { | ||
throw NotImplemented("inputColumnType"); | ||
return SWIGVMContainers::UNSUPPORTED; | ||
} | ||
virtual const char *inputColumnTypeName(unsigned int col) { | ||
throw NotImplemented("inputColumnTypeName"); return nullptr; | ||
} | ||
virtual const unsigned int inputColumnSize(unsigned int col) { | ||
throw NotImplemented("inputColumnSize"); return 0; | ||
} | ||
virtual const unsigned int inputColumnPrecision(unsigned int col) { | ||
throw NotImplemented("inputColumnPrecision"); return 0; | ||
} | ||
virtual const unsigned int inputColumnScale(unsigned int col) { | ||
throw NotImplemented("inputColumnScale"); return 0; | ||
} | ||
virtual const SWIGVMContainers::SWIGVM_itertype_e inputType() { | ||
throw NotImplemented("inputType"); | ||
return SWIGVMContainers::EXACTLY_ONCE; | ||
} | ||
virtual const unsigned int outputColumnCount() { throw NotImplemented("outputColumnCount"); return 0;} | ||
virtual const char *outputColumnName(unsigned int col) { throw NotImplemented("outputColumnName"); return nullptr;} | ||
virtual const SWIGVMContainers::SWIGVM_datatype_e outputColumnType(unsigned int col) { | ||
throw NotImplemented("outputColumnType"); | ||
return SWIGVMContainers::UNSUPPORTED; | ||
} | ||
virtual const char *outputColumnTypeName(unsigned int col) { | ||
throw NotImplemented("outputColumnTypeName"); return nullptr; | ||
} | ||
virtual const unsigned int outputColumnSize(unsigned int col) { | ||
throw NotImplemented("outputColumnSize"); return 0; | ||
} | ||
virtual const unsigned int outputColumnPrecision(unsigned int col) { | ||
throw NotImplemented("outputColumnPrecision"); return 0; | ||
} | ||
virtual const unsigned int outputColumnScale(unsigned int col) { | ||
throw NotImplemented("outputColumnScale"); return 0; | ||
} | ||
virtual const SWIGVMContainers::SWIGVM_itertype_e outputType() { | ||
throw NotImplemented("outputType"); | ||
return SWIGVMContainers::EXACTLY_ONCE; | ||
} | ||
virtual const bool isEmittedColumn(unsigned int col) { throw NotImplemented("isEmittedColumn"); return false;} | ||
virtual const char* checkException() { return nullptr;} | ||
virtual const char* pluginLanguageName() { throw NotImplemented("pluginLanguageName"); return nullptr;} | ||
virtual const char* pluginURI() { throw NotImplemented("pluginURI"); return nullptr;} | ||
virtual const char* outputAddress() { throw NotImplemented("outputAddress"); return nullptr;} | ||
|
||
private: | ||
std::function<const char*(const char*)> m_callback; | ||
}; | ||
|
||
SwigFactoryTestImpl::SwigFactoryTestImpl(std::function<const char*(const char*)> callback) | ||
: m_callback(callback) {} | ||
|
||
SWIGVMContainers::SWIGMetadataIf* SwigFactoryTestImpl::makeSwigMetadata() { | ||
return new SWIGMetadataTest(m_callback); | ||
} |
20 changes: 20 additions & 0 deletions
20
exaudfclient/base/javacontainer/script_options/test/swig_factory_test.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
#ifndef SWIG_FACTORY_TEST_H | ||
#define SWIG_FACTORY_TEST_H 1 | ||
|
||
#include <string> | ||
#include <map> | ||
#include "base/swig_factory/swig_factory.h" | ||
#include <functional> | ||
|
||
struct SwigFactoryTestImpl : public SWIGVMContainers::SwigFactory { | ||
|
||
SwigFactoryTestImpl(std::function<const char*(const char*)> callback); | ||
|
||
virtual SWIGVMContainers::SWIGMetadataIf* makeSwigMetadata() override; | ||
|
||
private: | ||
std::function<const char*(const char*)> m_callback; | ||
}; | ||
|
||
|
||
#endif //namespace SWIG_FACTORY_TEST_H |