1
0
Fork 0

Bug fix/fix cluster tests for analyzers (#9370)

* Fixed analyzer definition in test (definition should be object). Fixed proper reporting of invalid parameter error.

* Restored ability to parse string-encoded json object in analyzers rest hadler. Test was reverted to pass string again.

* Fixed test run

* Get rid of shared ptr to simplify code.
This commit is contained in:
Dronplane 2019-07-01 17:52:06 +03:00 committed by Andrey Abramov
parent 9cb08ded92
commit 1f8099e295
4 changed files with 31 additions and 20 deletions

View File

@ -113,14 +113,21 @@ void RestAnalyzerHandler::createAnalyzer( // create
}
type = getStringRef(typeSlice);
auto const properties = body.get(StaticStrings::AnalyzerPropertiesField);
std::shared_ptr<VPackBuilder> propertiesFromStringBuilder;
auto properties = body.get(StaticStrings::AnalyzerPropertiesField);
if(properties.isString()) { // string still could be parsed to an object
auto string_ref = getStringRef(properties);
propertiesFromStringBuilder = arangodb::velocypack::Parser::fromJson(string_ref);
properties = propertiesFromStringBuilder->slice();
}
if (!properties.isNone() && !properties.isObject()) { // optional parameter
generateError(arangodb::Result( // generate error
TRI_ERROR_BAD_PARAMETER, // code
"invalid 'properties', expecting body to be of the form { name: <string>, type: <string>[, properties: <object>[, features: <string-array>]] }"
));
return;
}
irs::flags features;

View File

@ -301,25 +301,29 @@ void JS_Create(v8::FunctionCallbackInfo<v8::Value> const& args) {
auto type = TRI_ObjectToString(isolate, args[1]);
std::shared_ptr<VPackBuilder> properties;
VPackSlice propertiesSlice = VPackSlice::emptyObjectSlice();
VPackBuilder propertiesBuilder;
if (args.Length() > 2) { // have properties
if (args[2]->IsString()) {
std::string const propertiesBuf = TRI_ObjectToString(isolate, args[2]);
properties = arangodb::velocypack::Parser::fromJson(propertiesBuf);
arangodb::velocypack::Parser(propertiesBuilder).parse(propertiesBuf);
propertiesSlice = propertiesBuilder.slice();
} else if (args[2]->IsObject()) {
auto value = args[2]->ToObject(TRI_IGETC).FromMaybe(v8::Local<v8::Object>());
properties = std::make_shared<VPackBuilder>();
auto res = TRI_V8ToVPack(isolate, *properties, value, false);
auto res = TRI_V8ToVPack(isolate, propertiesBuilder, value, false);
if (TRI_ERROR_NO_ERROR != res) {
TRI_V8_THROW_EXCEPTION(res);
}
propertiesSlice = propertiesBuilder.slice();
} else if (!args[2]->IsNull()) {
TRI_V8_THROW_TYPE_ERROR("<properties> must be an object");
}
}
// properties at the end should be parsed into object
if (!propertiesSlice.isObject()) {
TRI_V8_THROW_TYPE_ERROR("<properties> must be an object");
}
irs::flags features;
@ -362,7 +366,7 @@ void JS_Create(v8::FunctionCallbackInfo<v8::Value> const& args) {
try {
arangodb::iresearch::IResearchAnalyzerFeature::EmplaceResult result;
auto res = analyzers->emplace(result, name, type,
properties.use_count() ? properties->slice() : VPackSlice::emptyObjectSlice(),
propertiesSlice,
features);
if (!res.ok()) {

View File

@ -185,14 +185,14 @@ TEST_F(RestAnalyzerHandlerTest, test_create) {
{
const auto name = arangodb::StaticStrings::SystemDatabase + "::testAnalyzer1";
ASSERT_TRUE(analyzers->emplace(result, name, "identity",
VPackParser::fromJson("\"abc\"")->slice())
VPackParser::fromJson("{\"args\":\"abc\"}")->slice())
.ok());
}
{
const auto name = arangodb::StaticStrings::SystemDatabase + "::emptyAnalyzer";
ASSERT_TRUE(analyzers->emplace(result, name, "rest-analyzer-empty",
VPackParser::fromJson("\"en\"")->slice(),
VPackParser::fromJson("{\"args\":\"en\"}")->slice(),
irs::flags{irs::frequency::type()})
.ok());
}
@ -438,7 +438,7 @@ TEST_F(RestAnalyzerHandlerTest, test_create) {
request._payload.openObject();
request._payload.add("name", arangodb::velocypack::Value("emptyAnalyzer"));
request._payload.add("type", arangodb::velocypack::Value("rest-analyzer-empty"));
request._payload.add("properties", arangodb::velocypack::Value("abc"));
request._payload.add("properties", arangodb::velocypack::Value("{\"args\":\"abc\"}"));
request._payload.close();
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions
@ -481,7 +481,7 @@ TEST_F(RestAnalyzerHandlerTest, test_create) {
request._payload.openObject();
request._payload.add("name", VPackValue("testAnalyzer1"));
request._payload.add("type", VPackValue("identity"));
request._payload.add("properties", VPackValue(arangodb::velocypack::ValueType::Null));
request._payload.add("properties", VPackSlice::noneSlice());
request._payload.close();
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions
@ -522,7 +522,7 @@ TEST_F(RestAnalyzerHandlerTest, test_create) {
request._payload.openObject();
request._payload.add("name", VPackValue("testAnalyzer2"));
request._payload.add("type", VPackValue("identity"));
request._payload.add("properties", arangodb::velocypack::Value("abc"));
request._payload.add("properties", arangodb::velocypack::Value("{\"args\":\"abc\"}"));
request._payload.close();
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions
@ -565,7 +565,7 @@ TEST_F(RestAnalyzerHandlerTest, test_create) {
request._payload.openObject();
request._payload.add("name", arangodb::velocypack::Value("testAnalyzer2"));
request._payload.add("type", arangodb::velocypack::Value("identity"));
request._payload.add("properties", arangodb::velocypack::Value("abc"));
request._payload.add("properties", arangodb::velocypack::Value("{\"args\":\"abc\"}"));
request._payload.close();
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions

View File

@ -717,7 +717,7 @@ TEST_F(V8AnalyzersTest, test_create) {
{
const auto name = arangodb::StaticStrings::SystemDatabase + "::emptyAnalyzer";
ASSERT_TRUE(analyzers->emplace(result, name, "v8-analyzer-empty",
VPackParser::fromJson("\"en\"")->slice(),
VPackParser::fromJson("{\"args\":\"12312\"}")->slice(),
irs::flags{irs::frequency::type()}).ok());
}
@ -1050,7 +1050,7 @@ TEST_F(V8AnalyzersTest, test_create) {
std::vector<v8::Local<v8::Value>> args = {
TRI_V8_STD_STRING(isolate.get(), "emptyAnalyzer"s),
TRI_V8_ASCII_STRING(isolate.get(), "v8-analyzer-empty"),
TRI_V8_ASCII_STRING(isolate.get(), "\"abc\""),
TRI_V8_ASCII_STRING(isolate.get(), "{\"abc\":1}"),
};
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions
@ -1168,7 +1168,7 @@ TEST_F(V8AnalyzersTest, test_create) {
std::vector<v8::Local<v8::Value>> args = {
TRI_V8_STD_STRING(isolate.get(), "testAnalyzer2"s),
TRI_V8_ASCII_STRING(isolate.get(), "identity"),
TRI_V8_ASCII_STRING(isolate.get(), "\"abc\""),
TRI_V8_ASCII_STRING(isolate.get(), "{\"abc\":1}"),
};
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions
@ -1226,7 +1226,7 @@ TEST_F(V8AnalyzersTest, test_create) {
std::vector<v8::Local<v8::Value>> args = {
TRI_V8_STD_STRING(isolate.get(), "testAnalyzer2"s),
TRI_V8_ASCII_STRING(isolate.get(), "identity"),
TRI_V8_ASCII_STRING(isolate.get(), "\"abc\"")
TRI_V8_ASCII_STRING(isolate.get(), "{\"abc\":1}")
};
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions