From 6ba0a6cf866fcf3fa550b605b9f2c5bf1360733e Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 20 Aug 2020 12:20:26 +0200 Subject: [PATCH] fixed issue #12304 (#12447) --- CHANGELOG | 8 + arangod/Agency/v8-agency.cpp | 12 +- arangod/Aql/Expression.cpp | 7 +- arangod/Cluster/v8-cluster.cpp | 34 +-- .../RestHandler/RestAdminExecuteHandler.cpp | 12 +- arangod/V8Server/v8-analyzers.cpp | 5 +- arangod/V8Server/v8-collection.cpp | 34 +-- arangod/V8Server/v8-dispatcher.cpp | 13 +- arangod/V8Server/v8-query.cpp | 11 +- arangod/V8Server/v8-replication.cpp | 18 +- arangod/V8Server/v8-ttl.cpp | 6 +- arangod/V8Server/v8-users.cpp | 15 +- arangod/V8Server/v8-views.cpp | 21 +- arangod/V8Server/v8-vocbase.cpp | 58 ++-- arangod/V8Server/v8-voccursor.cpp | 17 +- arangod/V8Server/v8-vocindex.cpp | 12 +- arangod/VocBase/Methods/Transactions.cpp | 2 +- arangosh/Shell/V8ClientConnection.cpp | 14 +- lib/V8/v8-utils.cpp | 6 +- lib/V8/v8-vpack.cpp | 260 ++++++++---------- lib/V8/v8-vpack.h | 35 +-- tests/V8Server/v8-analyzers-test.cpp | 68 ++--- tests/V8Server/v8-users-test.cpp | 36 ++- tests/V8Server/v8-views-test.cpp | 133 ++++----- tests/js/common/shell/shell-transactions.js | 179 ++++++++++-- 25 files changed, 459 insertions(+), 557 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index bd421866f993..7801e8f80341 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,14 @@ devel ----- +* Fixed issue #12304: insert in transaction causing com.arangodb.ArangoDBException: + Response: 500, Error: 4 - Builder value not yet sealed. + + This happened when too deeply-nested documents (more than 63 levels of nesting) + were inserted. While indefinite nesting is still not supported, the error message + has been corrected from the internal HTTP 500 error "Builder value not yet sealed" + to the correct HTTP 400 "Bad parameter". + * Show optimizer rules with highest execution times in explain output. * Fixed that dropping a vanished follower works again. An exception response diff --git a/arangod/Agency/v8-agency.cpp b/arangod/Agency/v8-agency.cpp index 4881e1d1a532..c39a037cee99 100644 --- a/arangod/Agency/v8-agency.cpp +++ b/arangod/Agency/v8-agency.cpp @@ -92,11 +92,7 @@ static void JS_ReadAgent(v8::FunctionCallbackInfo const& args) { } query_t query = std::make_shared(); - int res = TRI_V8ToVPack(isolate, *query, args[0], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, *query, args[0], false); read_ret_t ret = agent->read(query); @@ -125,11 +121,7 @@ static void JS_WriteAgent(v8::FunctionCallbackInfo const& args) { } query_t query = std::make_shared(); - int res = TRI_V8ToVPack(isolate, *query, args[0], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, *query, args[0], false); write_ret_t ret = agent->write(query); diff --git a/arangod/Aql/Expression.cpp b/arangod/Aql/Expression.cpp index 08cd5358c6bb..853fecfabbde 100644 --- a/arangod/Aql/Expression.cpp +++ b/arangod/Aql/Expression.cpp @@ -922,11 +922,8 @@ AqlValue Expression::invokeV8Function(ExpressionContext* expressionContext, auto& trx = expressionContext->trx(); transaction::BuilderLeaser builder(&trx); - int res = TRI_V8ToVPack(isolate, *builder.get(), result, false); - - if (res != TRI_ERROR_NO_ERROR) { - THROW_ARANGO_EXCEPTION(res); - } + // can throw + TRI_V8ToVPack(isolate, *builder.get(), result, false); mustDestroy = true; // builder = dynamic data return AqlValue(builder->slice(), builder->size()); diff --git a/arangod/Cluster/v8-cluster.cpp b/arangod/Cluster/v8-cluster.cpp index 6a54e116209b..08cd11e9b9af 100644 --- a/arangod/Cluster/v8-cluster.cpp +++ b/arangod/Cluster/v8-cluster.cpp @@ -136,18 +136,10 @@ static void JS_CasAgency(v8::FunctionCallbackInfo const& args) { std::string const key = TRI_ObjectToString(isolate, args[0]); VPackBuilder oldBuilder; - int res = TRI_V8ToVPack(isolate, oldBuilder, args[1], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION_PARAMETER("cannot convert to VPack"); - } + TRI_V8ToVPack(isolate, oldBuilder, args[1], false); VPackBuilder newBuilder; - res = TRI_V8ToVPack(isolate, newBuilder, args[2], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION_PARAMETER("cannot convert to VPack"); - } + TRI_V8ToVPack(isolate, newBuilder, args[2], false); double ttl = 0.0; if (args.Length() > 3) { @@ -315,11 +307,7 @@ static void JS_APIAgency(std::string const& envelope, } VPackBuilder builder; - int res = TRI_V8ToVPack(isolate, builder, args[0], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION_PARAMETER("cannot convert query to JSON"); - } + TRI_V8ToVPack(isolate, builder, args[0], false); TRI_GET_GLOBALS(); AgencyComm comm(v8g->_server); @@ -404,11 +392,7 @@ static void JS_SetAgency(v8::FunctionCallbackInfo const& args) { std::string const key = TRI_ObjectToString(isolate, args[0]); VPackBuilder builder; - int res = TRI_V8ToVPack(isolate, builder, args[1], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION_PARAMETER("cannot convert to JSON"); - } + TRI_V8ToVPack(isolate, builder, args[1], false); double ttl = 0.0; if (args.Length() > 2) { @@ -903,11 +887,7 @@ static void JS_GetResponsibleShardClusterInfo(v8::FunctionCallbackInfogetResponsibleShard(builder.slice(), documentIsComplete, - shardId, usesDefaultShardingAttributes); + int res = collInfo->getResponsibleShard(builder.slice(), documentIsComplete, + shardId, usesDefaultShardingAttributes); if (res != TRI_ERROR_NO_ERROR) { TRI_V8_THROW_EXCEPTION(res); diff --git a/arangod/RestHandler/RestAdminExecuteHandler.cpp b/arangod/RestHandler/RestAdminExecuteHandler.cpp index a3fc2fdf45a3..cec968325a8c 100644 --- a/arangod/RestHandler/RestAdminExecuteHandler.cpp +++ b/arangod/RestHandler/RestAdminExecuteHandler.cpp @@ -166,14 +166,13 @@ RestStatus RestAdminExecuteHandler::execute() { VPackBuilder result; bool handled = false; - int res = TRI_ERROR_FAILED; if (returnAsJSON) { result.openObject(true); result.add(StaticStrings::Error, VPackValue(false)); result.add(StaticStrings::Code, VPackValue(static_cast(rest::ResponseCode::OK))); if (rv->IsObject()) { - res = TRI_V8ToVPack(isolate, result, rv, false); + TRI_V8ToVPack(isolate, result, rv, false); handled = true; } result.close(); @@ -181,14 +180,7 @@ RestStatus RestAdminExecuteHandler::execute() { if (!handled) { result.clear(); - - VPackBuilder temp; - res = TRI_V8ToVPack(isolate, temp, rv, false); - result.add(temp.slice()); - } - - if (res != TRI_ERROR_NO_ERROR) { - THROW_ARANGO_EXCEPTION(res); + TRI_V8ToVPack(isolate, result, rv, false); } generateResult(rest::ResponseCode::OK, result.slice()); diff --git a/arangod/V8Server/v8-analyzers.cpp b/arangod/V8Server/v8-analyzers.cpp index 6ff85455e8f7..b413c7b71a2d 100644 --- a/arangod/V8Server/v8-analyzers.cpp +++ b/arangod/V8Server/v8-analyzers.cpp @@ -322,10 +322,7 @@ void JS_Create(v8::FunctionCallbackInfo const& args) { propertiesSlice = propertiesBuilder.slice(); } else if (args[2]->IsObject()) { auto value = args[2]->ToObject(TRI_IGETC).FromMaybe(v8::Local()); - auto res = TRI_V8ToVPack(isolate, propertiesBuilder, value, false); - if (TRI_ERROR_NO_ERROR != res) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, propertiesBuilder, value, false); propertiesSlice = propertiesBuilder.slice(); } else if (!args[2]->IsNull()) { TRI_V8_THROW_TYPE_ERROR(" must be an object"); diff --git a/arangod/V8Server/v8-collection.cpp b/arangod/V8Server/v8-collection.cpp index 4019e37fc3e0..f21f34ed36fc 100644 --- a/arangod/V8Server/v8-collection.cpp +++ b/arangod/V8Server/v8-collection.cpp @@ -233,10 +233,7 @@ static int V8ToVPackNoKeyRevId(v8::Isolate* isolate, VPackBuilder& builder, if (strcmp(*str, "_key") != 0 && strcmp(*str, "_rev") != 0 && strcmp(*str, "_id") != 0) { builder.add(VPackValue(*str)); - int res = TRI_V8ToVPack(isolate, builder, o->Get(context, key).FromMaybe(v8::Local()), false); - if (res != TRI_ERROR_NO_ERROR) { - return res; - } + TRI_V8ToVPack(isolate, builder, o->Get(context, key).FromMaybe(v8::Local()), false); } } return TRI_ERROR_NO_ERROR; @@ -1006,10 +1003,7 @@ static void JS_GetResponsibleShardVocbaseCol(v8::FunctionCallbackInfo builder.add(StaticStrings::KeyString, VPackValue(TRI_ObjectToString(isolate, args[0]))); builder.close(); } else { - int res = TRI_V8ToVPack(isolate, builder, args[0], false); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, builder, args[0], false); } if (!builder.slice().isObject()) { TRI_V8_THROW_EXCEPTION_USAGE("getResponsibleShard()"); @@ -1150,22 +1144,13 @@ static void JS_PropertiesVocbaseCol(v8::FunctionCallbackInfo const& a if (par->IsObject()) { VPackBuilder builder; - { - int res = TRI_V8ToVPack(isolate, builder, args[0], false); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } - } - + TRI_V8ToVPack(isolate, builder, args[0], false); TRI_ASSERT(builder.isClosed()); auto res = methods::Collections::updateProperties(*consoleColl, builder.slice()); if (res.fail() && ServerState::instance()->isCoordinator()) { TRI_V8_THROW_EXCEPTION(res); } - - // TODO Review - // TODO API compatibility, for now we ignore if persisting fails... } } @@ -1696,10 +1681,7 @@ static void JS_PregelStart(v8::FunctionCallbackInfo const& args) { } VPackBuilder paramBuilder; if (argLength >= 4 && args[3]->IsObject()) { - int res = TRI_V8ToVPack(isolate, paramBuilder, args[3], false); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, paramBuilder, args[3], false); } auto& vocbase = GetContextVocBase(isolate); @@ -1983,12 +1965,8 @@ static void InsertVocbaseCol(v8::Isolate* isolate, VPackBuilder builder(&vpackOptions); auto doOneDocument = [&](v8::Handle obj) -> void { - int res = TRI_V8ToVPack(isolate, builder, obj, true); - - if (res != TRI_ERROR_NO_ERROR) { - THROW_ARANGO_EXCEPTION(res); - } - + TRI_V8ToVPack(isolate, builder, obj, true); + if (isEdgeCollection && oldEdgeSignature) { // Just insert from and to. Check is done later. std::string tmpId(ExtractIdString(isolate, args[0])); diff --git a/arangod/V8Server/v8-dispatcher.cpp b/arangod/V8Server/v8-dispatcher.cpp index f361179952f9..b933dc66c690 100644 --- a/arangod/V8Server/v8-dispatcher.cpp +++ b/arangod/V8Server/v8-dispatcher.cpp @@ -211,14 +211,11 @@ static void JS_RegisterTask(v8::FunctionCallbackInfo const& args) { auto parameters = std::make_shared(); if (TRI_HasProperty(context, isolate, obj, "params")) { - int res = TRI_V8ToVPack(isolate, *parameters, - obj->Get(TRI_IGETC, - TRI_V8_ASCII_STRING(isolate, "params")) - .FromMaybe(v8::Local()), - false); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, *parameters, + obj->Get(TRI_IGETC, + TRI_V8_ASCII_STRING(isolate, "params")) + .FromMaybe(v8::Local()), + false); } command = "(function (params) { " + command + " } )(params);"; diff --git a/arangod/V8Server/v8-query.cpp b/arangod/V8Server/v8-query.cpp index 075d408f2ddb..b448a125f84d 100644 --- a/arangod/V8Server/v8-query.cpp +++ b/arangod/V8Server/v8-query.cpp @@ -409,11 +409,7 @@ static void JS_LookupByKeys(v8::FunctionCallbackInfo const& args) { bindVars->add("@collection", VPackValue(collection->name())); VPackBuilder keys; - int res = TRI_V8ToVPack(isolate, keys, args[0], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, keys, args[0], false); bindVars->add(VPackValue("keys")); arangodb::aql::BindParameters::stripCollectionNames(keys.slice(), collection->name(), @@ -458,10 +454,7 @@ static void JS_RemoveByKeys(v8::FunctionCallbackInfo const& args) { bindVars->add("@collection", VPackValue(collection->name())); bindVars->add(VPackValue("keys")); - int res = TRI_V8ToVPack(isolate, *(bindVars.get()), args[0], false); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, *(bindVars.get()), args[0], false); bindVars->close(); std::string const queryString( diff --git a/arangod/V8Server/v8-replication.cpp b/arangod/V8Server/v8-replication.cpp index 8e9c2d1f0741..1589b5058cd4 100644 --- a/arangod/V8Server/v8-replication.cpp +++ b/arangod/V8Server/v8-replication.cpp @@ -185,11 +185,7 @@ static void SynchronizeReplication(v8::FunctionCallbackInfo const& ar // treat the argument as an object from now on v8::Handle object = v8::Handle::Cast(args[0]); VPackBuilder builder; - int res = TRI_V8ToVPack(isolate, builder, args[0], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, builder, args[0], false); auto& vocbase = GetContextVocBase(isolate); std::string databaseName; @@ -320,11 +316,7 @@ static void JS_SynchronizeReplicationFinalize(v8::FunctionCallbackInfo object = v8::Handle::Cast(args[0]); VPackBuilder builder; - int res = TRI_V8ToVPack(isolate, builder, args[0], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, builder, args[0], false); std::string database; if (TRI_HasProperty(context, isolate, object, "database")) { @@ -472,11 +464,7 @@ static void ConfigureApplierReplication(v8::FunctionCallbackInfo cons } VPackBuilder builder; - int res = TRI_V8ToVPack(isolate, builder, args[0], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, builder, args[0], false); std::string databaseName; if (applierType == APPLIER_DATABASE) { diff --git a/arangod/V8Server/v8-ttl.cpp b/arangod/V8Server/v8-ttl.cpp index 563668bb9589..f30bab00df02 100644 --- a/arangod/V8Server/v8-ttl.cpp +++ b/arangod/V8Server/v8-ttl.cpp @@ -54,11 +54,7 @@ static void JS_TtlProperties(v8::FunctionCallbackInfo const& args) { } else { // set properties VPackBuilder properties; - - int res = TRI_V8ToVPack(isolate, properties, args[0], false); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, properties, args[0], false); result = methods::Ttl::setProperties(v8g->_server.getFeature(), properties.slice(), builder); diff --git a/arangod/V8Server/v8-users.cpp b/arangod/V8Server/v8-users.cpp index 7a4e64adfe2d..3e9625edf7c8 100644 --- a/arangod/V8Server/v8-users.cpp +++ b/arangod/V8Server/v8-users.cpp @@ -117,10 +117,7 @@ void StoreUser(v8::FunctionCallbackInfo const& args, bool replace) { VPackBuilder extras; if (args.Length() >= 4) { - int r = TRI_V8ToVPackSimple(isolate, extras, args[3]); - if (r != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(r); - } + TRI_V8ToVPack(isolate, extras, args[3], false, false); } auth::UserManager* um = AuthenticationFeature::instance()->userManager(); @@ -165,10 +162,7 @@ static void JS_UpdateUser(v8::FunctionCallbackInfo const& args) { VPackBuilder extras; if (args.Length() >= 4) { - int r = TRI_V8ToVPackSimple(isolate, extras, args[3]); - if (r != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(r); - } + TRI_V8ToVPack(isolate, extras, args[3], false, false); } auth::UserManager* um = AuthenticationFeature::instance()->userManager(); @@ -444,10 +438,7 @@ static void JS_UpdateConfigData(v8::FunctionCallbackInfo const& args) VPackBuilder merge; if (args.Length() > 2) { VPackBuilder value; - int res = TRI_V8ToVPackSimple(isolate, value, args[2]); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, value, args[2], false, false); merge.add(key, value.slice()); } else { merge.add(key, VPackSlice::nullSlice()); diff --git a/arangod/V8Server/v8-views.cpp b/arangod/V8Server/v8-views.cpp index 310e40e62b1e..96ef5bf2ca3f 100644 --- a/arangod/V8Server/v8-views.cpp +++ b/arangod/V8Server/v8-views.cpp @@ -160,11 +160,11 @@ static void JS_CreateViewVocbase(v8::FunctionCallbackInfo const& args v8::Handle obj = args[2]->ToObject(TRI_IGETC).FromMaybe(v8::Local()); VPackBuilder properties; - int res = TRI_V8ToVPack(isolate, properties, obj, false); - - if (res != TRI_ERROR_NO_ERROR) { - events::CreateView(vocbase.name(), name, res); - TRI_V8_THROW_EXCEPTION(res); + try { + TRI_V8ToVPack(isolate, properties, obj, false); + } catch (arangodb::basics::Exception const& ex) { + events::CreateView(vocbase.name(), name, ex.code()); + throw; } // ........................................................................... @@ -546,15 +546,8 @@ static void JS_PropertiesViewVocbase(v8::FunctionCallbackInfo const& // check if we want to change some parameters if (args.Length() > 0 && args[0]->IsObject()) { arangodb::velocypack::Builder builder; - - { - auto res = TRI_V8ToVPack(isolate, builder, args[0], false); - - if (TRI_ERROR_NO_ERROR != res) { - TRI_V8_THROW_EXCEPTION(res); - } - } - + TRI_V8ToVPack(isolate, builder, args[0], false); + bool partialUpdate = true; // partial update by default if (args.Length() > 1) { diff --git a/arangod/V8Server/v8-vocbase.cpp b/arangod/V8Server/v8-vocbase.cpp index e8dbec63fe83..6c7a2980e1fa 100644 --- a/arangod/V8Server/v8-vocbase.cpp +++ b/arangod/V8Server/v8-vocbase.cpp @@ -588,11 +588,7 @@ static void JS_ExplainAql(v8::FunctionCallbackInfo const& args) { if (args[1]->IsObject()) { bindVars.reset(new VPackBuilder); - int res = TRI_V8ToVPack(isolate, *(bindVars.get()), args[1], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, *(bindVars.get()), args[1], false); } } @@ -603,10 +599,7 @@ static void JS_ExplainAql(v8::FunctionCallbackInfo const& args) { if (!args[2]->IsObject()) { TRI_V8_THROW_TYPE_ERROR("expecting object for "); } - int res = TRI_V8ToVPack(isolate, *options, args[2], false); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, *options, args[2], false); } // bind parameters will be freed by the query later @@ -682,11 +675,11 @@ static void JS_ExecuteAqlJson(v8::FunctionCallbackInfo const& args) { } auto queryBuilder = std::make_shared(); - int res = TRI_V8ToVPack(isolate, *queryBuilder, args[0], false); - - if (res != TRI_ERROR_NO_ERROR) { - events::QueryDocument(vocbase.name(), VPackSlice(), res); - TRI_V8_THROW_EXCEPTION(res); + try { + TRI_V8ToVPack(isolate, *queryBuilder, args[0], false); + } catch (arangodb::basics::Exception const& ex) { + events::QueryDocument(vocbase.name(), VPackSlice(), ex.code()); + throw; } auto options = std::make_shared(); @@ -698,10 +691,11 @@ static void JS_ExecuteAqlJson(v8::FunctionCallbackInfo const& args) { TRI_V8_THROW_TYPE_ERROR("expecting object for "); } - res = TRI_V8ToVPack(isolate, *options, args[1], false); - if (res != TRI_ERROR_NO_ERROR) { - events::QueryDocument(vocbase.name(), queryBuilder->slice(), res); - TRI_V8_THROW_EXCEPTION(res); + try { + TRI_V8ToVPack(isolate, *options, args[1], false); + } catch (arangodb::basics::Exception const& ex) { + events::QueryDocument(vocbase.name(), queryBuilder->slice(), ex.code()); + throw; } } @@ -815,11 +809,11 @@ static void JS_ExecuteAql(v8::FunctionCallbackInfo const& args) { } if (args[1]->IsObject()) { bindVars.reset(new VPackBuilder); - int res = TRI_V8ToVPack(isolate, *(bindVars.get()), args[1], false); - - if (res != TRI_ERROR_NO_ERROR) { - events::QueryDocument(vocbase.name(), queryString, "", res); - TRI_V8_THROW_EXCEPTION(res); + try { + TRI_V8ToVPack(isolate, *(bindVars.get()), args[1], false); + } catch (arangodb::basics::Exception const& ex) { + events::QueryDocument(vocbase.name(), queryString, "", ex.code()); + throw; } } } @@ -835,11 +829,12 @@ static void JS_ExecuteAql(v8::FunctionCallbackInfo const& args) { TRI_V8_THROW_TYPE_ERROR("expecting object for "); } - int res = TRI_V8ToVPack(isolate, *options, args[2], false); - if (res != TRI_ERROR_NO_ERROR) { + try { + TRI_V8ToVPack(isolate, *options, args[2], false); + } catch (arangodb::basics::Exception const& ex) { events::QueryDocument(vocbase.name(), queryString, - (bindVars ? bindVars->slice().toJson() : ""), res); - TRI_V8_THROW_EXCEPTION(res); + (bindVars ? bindVars->slice().toJson() : ""), ex.code()); + throw; } } @@ -1186,12 +1181,7 @@ static void JS_QueryCachePropertiesAql(v8::FunctionCallbackInfo const if (args.Length() == 1) { // called with options - int res = TRI_V8ToVPack(isolate, builder, args[0], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } - + TRI_V8ToVPack(isolate, builder, args[0], false); queryCache->properties(builder.slice()); } @@ -1697,7 +1687,7 @@ static void JS_CreateDatabase(v8::FunctionCallbackInfo const& args) { "user is not an object"); } - TRI_V8ToVPackSimple(isolate, users, user); + TRI_V8ToVPack(isolate, users, user, false, false); } } diff --git a/arangod/V8Server/v8-voccursor.cpp b/arangod/V8Server/v8-voccursor.cpp index f2703d115959..4fcb7d72b834 100644 --- a/arangod/V8Server/v8-voccursor.cpp +++ b/arangod/V8Server/v8-voccursor.cpp @@ -68,11 +68,7 @@ static void JS_CreateCursor(v8::FunctionCallbackInfo const& args) { // extract objects v8::Handle array = v8::Handle::Cast(args[0]); auto builder = std::make_shared(); - int res = TRI_V8ToVPack(isolate, *builder, array, false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_TYPE_ERROR("cannot convert to JSON"); - } + TRI_V8ToVPack(isolate, *builder, array, false); // maximum number of results to return at once uint32_t batchSize = 1000; @@ -310,11 +306,7 @@ struct V8Cursor final { } if (args[1]->IsObject()) { bindVars.reset(new VPackBuilder); - int res = TRI_V8ToVPack(isolate, *(bindVars.get()), args[1], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, *(bindVars.get()), args[1], false); } } @@ -326,10 +318,7 @@ struct V8Cursor final { TRI_V8_THROW_TYPE_ERROR("expecting object for "); } - int res = TRI_V8ToVPack(isolate, *options, args[2], false); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, *options, args[2], false); } else { VPackObjectBuilder guard(options.get()); } diff --git a/arangod/V8Server/v8-vocindex.cpp b/arangod/V8Server/v8-vocindex.cpp index cd8487a8c8d0..d3728b4dc0be 100644 --- a/arangod/V8Server/v8-vocindex.cpp +++ b/arangod/V8Server/v8-vocindex.cpp @@ -81,7 +81,7 @@ static void EnsureIndex(v8::FunctionCallbackInfo const& args, } VPackBuilder builder; - TRI_V8ToVPackSimple(isolate, builder, args[0]); + TRI_V8ToVPack(isolate, builder, args[0], false, false); VPackBuilder output; auto res = methods::Indexes::ensureIndex(collection, builder.slice(), create, output); @@ -144,7 +144,7 @@ static void JS_DropIndexVocbaseCol(v8::FunctionCallbackInfo const& ar } VPackBuilder builder; - TRI_V8ToVPackSimple(isolate, builder, args[0]); + TRI_V8ToVPack(isolate, builder, args[0], false, false); auto res = methods::Indexes::drop(collection, builder.slice()); @@ -239,12 +239,8 @@ static void CreateVocBase(v8::FunctionCallbackInfo const& args, if (!args[1]->IsObject()) { TRI_V8_THROW_TYPE_ERROR(" must be an object"); } - int res = - TRI_V8ToVPack(isolate, properties, - args[1]->ToObject(TRI_IGETC).FromMaybe(v8::Local()), false); - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, properties, + args[1]->ToObject(TRI_IGETC).FromMaybe(v8::Local()), false); propSlice = properties.slice(); } diff --git a/arangod/VocBase/Methods/Transactions.cpp b/arangod/VocBase/Methods/Transactions.cpp index 8e2cda53f590..df2efcb1a967 100644 --- a/arangod/VocBase/Methods/Transactions.cpp +++ b/arangod/VocBase/Methods/Transactions.cpp @@ -141,7 +141,7 @@ Result executeTransactionJS(v8::Isolate* isolate, v8::Handle const& a // be overwritten later if is contained in `object` VPackBuilder builder; // we must use "convertFunctionsToNull" here, because "action" is most - // likey a JavaScript function + // likely a JavaScript function TRI_V8ToVPack(isolate, builder, object, false, /*convertFunctionsToNull*/ true); if (!builder.isClosed()) { diff --git a/arangosh/Shell/V8ClientConnection.cpp b/arangosh/Shell/V8ClientConnection.cpp index c2ca208b45f2..212629c00f5d 100644 --- a/arangosh/Shell/V8ClientConnection.cpp +++ b/arangosh/Shell/V8ClientConnection.cpp @@ -1722,12 +1722,7 @@ v8::Local V8ClientConnection::requestData( } else if (!body->IsNullOrUndefined()) { VPackBuffer buffer; VPackBuilder builder(buffer, &_vpackOptions); - int res = TRI_V8ToVPack(isolate, builder, body, false); - if (res != TRI_ERROR_NO_ERROR) { - LOG_TOPIC("46ae2", ERR, Logger::V8) - << "error converting request body: " << TRI_errno_string(res); - return v8::Null(isolate); - } + TRI_V8ToVPack(isolate, builder, body, false); if (_forceJson) { auto resultJson = builder.slice().toJson(); char const* resStr = resultJson.c_str(); @@ -1817,12 +1812,7 @@ v8::Local V8ClientConnection::requestDataRaw( } else if (!body->IsNullOrUndefined()) { VPackBuffer buffer; VPackBuilder builder(buffer); - int res = TRI_V8ToVPack(isolate, builder, body, false); - if (res != TRI_ERROR_NO_ERROR) { - LOG_TOPIC("10318", ERR, Logger::V8) - << "error converting request body: " << TRI_errno_string(res); - return v8::Null(isolate); - } + TRI_V8ToVPack(isolate, builder, body, false); req->addVPack(std::move(buffer)); req->header.contentType(fu::ContentType::VPack); } else { diff --git a/lib/V8/v8-utils.cpp b/lib/V8/v8-utils.cpp index 627f67e8cc3e..e13f452bbf97 100644 --- a/lib/V8/v8-utils.cpp +++ b/lib/V8/v8-utils.cpp @@ -4928,11 +4928,7 @@ static void JS_V8ToVPack(v8::FunctionCallbackInfo const& args) { } VPackBuilder builder; - int res = TRI_V8ToVPack(isolate, builder, args[0], false); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } + TRI_V8ToVPack(isolate, builder, args[0], false); VPackSlice slice = builder.slice(); diff --git a/lib/V8/v8-vpack.cpp b/lib/V8/v8-vpack.cpp index da5e4e7984f1..d7f32379f940 100644 --- a/lib/V8/v8-vpack.cpp +++ b/lib/V8/v8-vpack.cpp @@ -23,7 +23,9 @@ #include "v8-vpack.h" +#include #include +#include #include #include @@ -36,15 +38,14 @@ using VelocyPackHelper = arangodb::basics::VelocyPackHelper; -/// @brief maximum object nesting depth -static int const MaxLevels = 64; +namespace { +/// @brief maximum array/object nesting depth +static constexpr int maxRecursion = 80; +} -//////////////////////////////////////////////////////////////////////////////// /// @brief converts a VelocyValueType::String into a V8 object -//////////////////////////////////////////////////////////////////////////////// - static inline v8::Handle ObjectVPackString(v8::Isolate* isolate, - VPackSlice const& slice) { + VPackSlice slice) { arangodb::velocypack::ValueLength l; char const* val = slice.getString(l); if (l == 0) { @@ -53,11 +54,8 @@ static inline v8::Handle ObjectVPackString(v8::Isolate* isolate, return TRI_V8_PAIR_STRING(isolate, val, l); } -//////////////////////////////////////////////////////////////////////////////// /// @brief converts a VelocyValueType::Object into a V8 object -//////////////////////////////////////////////////////////////////////////////// - -static v8::Handle ObjectVPackObject(v8::Isolate* isolate, VPackSlice const& slice, +static v8::Handle ObjectVPackObject(v8::Isolate* isolate, VPackSlice slice, VPackOptions const* options, VPackSlice const* base) { TRI_ASSERT(slice.isObject()); @@ -143,11 +141,8 @@ static v8::Handle ObjectVPackObject(v8::Isolate* isolate, VPackSlice return object; } -//////////////////////////////////////////////////////////////////////////////// /// @brief converts a VelocyValueType::Array into a V8 object -//////////////////////////////////////////////////////////////////////////////// - -static v8::Handle ObjectVPackArray(v8::Isolate* isolate, VPackSlice const& slice, +static v8::Handle ObjectVPackArray(v8::Isolate* isolate, VPackSlice slice, VPackOptions const* options, VPackSlice const* base) { TRI_ASSERT(slice.isArray()); @@ -175,11 +170,8 @@ static v8::Handle ObjectVPackArray(v8::Isolate* isolate, VPackSlice c return object; } -//////////////////////////////////////////////////////////////////////////////// /// @brief converts a VPack value into a V8 object -//////////////////////////////////////////////////////////////////////////////// - -v8::Handle TRI_VPackToV8(v8::Isolate* isolate, VPackSlice const& slice, +v8::Handle TRI_VPackToV8(v8::Isolate* isolate, VPackSlice slice, VPackOptions const* options, VPackSlice const* base) { switch (slice.type()) { case VPackValueType::Null: { @@ -265,10 +257,7 @@ struct BuilderContext { bool keepTopLevelOpen; }; -//////////////////////////////////////////////////////////////////////////////// /// @brief adds a VPackValue to either an array or an object -//////////////////////////////////////////////////////////////////////////////// - template static inline void AddValue(BuilderContext& context, arangodb::velocypack::StringRef const& attributeName, T const& value) { @@ -279,23 +268,20 @@ static inline void AddValue(BuilderContext& context, } } -//////////////////////////////////////////////////////////////////////////////// /// @brief convert a V8 value to a VPack value -//////////////////////////////////////////////////////////////////////////////// - -template -static int V8ToVPack(BuilderContext& context, v8::Handle const parameter, - arangodb::velocypack::StringRef const& attributeName, bool convertFunctionsToNull) { +template +static void V8ToVPack(BuilderContext& context, v8::Handle parameter, + arangodb::velocypack::StringRef const& attributeName, bool convertFunctionsToNull) { if (parameter->IsNullOrUndefined() || (convertFunctionsToNull && parameter->IsFunction())) { AddValue(context, attributeName, VPackValue(VPackValueType::Null)); - return TRI_ERROR_NO_ERROR; + return; } if (parameter->IsBoolean()) { AddValue(context, attributeName, VPackValue(TRI_ObjectToBoolean(context.isolate, parameter))); - return TRI_ERROR_NO_ERROR; + return; } if (parameter->IsNumber()) { @@ -303,25 +289,21 @@ static int V8ToVPack(BuilderContext& context, v8::Handle const parame AddValue( context, attributeName, VPackValue(parameter->ToInt32(context.context).ToLocalChecked()->Value())); - return TRI_ERROR_NO_ERROR; - } - - if (parameter->IsUint32()) { + } else if (parameter->IsUint32()) { AddValue( context, attributeName, VPackValue(parameter->ToUint32(context.context).ToLocalChecked()->Value())); - return TRI_ERROR_NO_ERROR; - } - - double value = parameter->ToNumber(context.context).ToLocalChecked()->Value(); - if (std::isnan(value) || !std::isfinite(value)) { - AddValue(context, attributeName, VPackValue(VPackValueType::Null)); } else { - AddValue( - context, attributeName, - VPackValue(parameter->ToNumber(context.context).ToLocalChecked()->Value())); + double value = parameter->ToNumber(context.context).ToLocalChecked()->Value(); + if (std::isnan(value) || !std::isfinite(value)) { + AddValue(context, attributeName, VPackValue(VPackValueType::Null)); + } else { + AddValue( + context, attributeName, + VPackValue(parameter->ToNumber(context.context).ToLocalChecked()->Value())); + } } - return TRI_ERROR_NO_ERROR; + return ; } if (parameter->IsString()) { @@ -329,20 +311,27 @@ static int V8ToVPack(BuilderContext& context, v8::Handle const parame parameter->ToString(context.context).ToLocalChecked()); if (*str == nullptr) { - return TRI_ERROR_OUT_OF_MEMORY; + THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY); } AddValue(context, attributeName, VPackValuePair(*str, str.length(), VPackValueType::String)); - return TRI_ERROR_NO_ERROR; + return; } if (parameter->IsArray()) { v8::Handle array = v8::Handle::Cast(parameter); + if (context.level + 1 > ::maxRecursion) { + THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_BAD_PARAMETER, "input value is nested too deep"); + } + AddValue(context, attributeName, VPackValue(VPackValueType::Array)); + + ++context.level; + uint32_t const n = array->Length(); for (uint32_t i = 0; i < n; ++i) { @@ -352,100 +341,92 @@ static int V8ToVPack(BuilderContext& context, v8::Handle const parame continue; } - if (++context.level > MaxLevels) { - // too much recursion - return TRI_ERROR_BAD_PARAMETER; - } - - int res = V8ToVPack(context, value, arangodb::velocypack::StringRef(), - convertFunctionsToNull); - - --context.level; - - if (res != TRI_ERROR_NO_ERROR) { - return res; - } + V8ToVPack(context, value, arangodb::velocypack::StringRef(), + convertFunctionsToNull); } + + --context.level; if (!context.keepTopLevelOpen || context.level > 0) { context.builder.close(); } - return TRI_ERROR_NO_ERROR; + return; } if (parameter->IsObject()) { - if (performAllChecks) { - if (parameter->IsBooleanObject()) { - AddValue(context, attributeName, - VPackValue(v8::Handle::Cast(parameter) - ->BooleanValue(context.isolate))); - return TRI_ERROR_NO_ERROR; - } + if (parameter->IsBooleanObject()) { + AddValue(context, attributeName, + VPackValue(v8::Handle::Cast(parameter) + ->BooleanValue(context.isolate))); + return; + } - if (parameter->IsNumberObject()) { - double value = v8::Handle::Cast(parameter)->NumberValue(context.context).FromMaybe(0.0); - if (std::isnan(value) || !std::isfinite(value)) { - AddValue(context, attributeName, VPackValue(VPackValueType::Null)); - } else { - AddValue(context, attributeName, - VPackValue(v8::Handle::Cast(parameter) - ->NumberValue(context.context) - .FromMaybe(0.0))); - } - return TRI_ERROR_NO_ERROR; + if (parameter->IsNumberObject()) { + double value = v8::Handle::Cast(parameter)->NumberValue(context.context).FromMaybe(0.0); + if (std::isnan(value) || !std::isfinite(value)) { + AddValue(context, attributeName, VPackValue(VPackValueType::Null)); + } else { + AddValue(context, attributeName, + VPackValue(v8::Handle::Cast(parameter) + ->NumberValue(context.context) + .FromMaybe(0.0))); } + return; + } - if (parameter->IsStringObject()) { - v8::String::Utf8Value str(context.isolate, - parameter->ToString(context.context).ToLocalChecked()); - - if (*str == nullptr) { - return TRI_ERROR_OUT_OF_MEMORY; - } + if (parameter->IsStringObject()) { + v8::String::Utf8Value str(context.isolate, + parameter->ToString(context.context).ToLocalChecked()); - AddValue(context, attributeName, - VPackValuePair(*str, str.length(), - VPackValueType::String)); - return TRI_ERROR_NO_ERROR; + if (*str == nullptr) { + THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY); } - if (parameter->IsRegExp() || parameter->IsFunction() || parameter->IsExternal()) { - return TRI_ERROR_BAD_PARAMETER; - } + AddValue(context, attributeName, + VPackValuePair(*str, str.length(), + VPackValueType::String)); + return; + } + + if (parameter->IsRegExp() || parameter->IsFunction() || parameter->IsExternal()) { + THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_BAD_PARAMETER, "unknown input type"); } v8::Handle o = parameter->ToObject(context.context).ToLocalChecked(); - if (performAllChecks) { - // first check if the object has a "toJSON" function - if (o->Has(context.context, context.toJsonKey).FromMaybe(false)) { - // call it if yes - v8::Handle func = o->Get(context.context, context.toJsonKey).FromMaybe(v8::Local()); - if (func->IsFunction()) { - v8::Handle toJson = v8::Handle::Cast(func); - - // assign a dummy entry to the args array even if we don't need it. - // this prevents "error C2466: cannot allocate an array of constant - // size 0" in MSVC - v8::Handle args[] = {v8::Null(context.isolate)}; - v8::Handle converted = toJson->Call(context.context, o, 0, args).FromMaybe(v8::Local()); - - if (!converted.IsEmpty()) { - // return whatever toJSON returned - return V8ToVPack(context, converted, attributeName, - convertFunctionsToNull); - } + // first check if the object has a "toJSON" function + if (o->Has(context.context, context.toJsonKey).FromMaybe(false)) { + // call it if yes + v8::Handle func = o->Get(context.context, context.toJsonKey).FromMaybe(v8::Local()); + if (func->IsFunction()) { + v8::Handle toJson = v8::Handle::Cast(func); + + // assign a dummy entry to the args array even if we don't need it. + // this prevents "error C2466: cannot allocate an array of constant + // size 0" in MSVC + v8::Handle args[] = {v8::Null(context.isolate)}; + v8::Handle converted = toJson->Call(context.context, o, 0, args).FromMaybe(v8::Local()); + + if (!converted.IsEmpty()) { + // return whatever toJSON returned + V8ToVPack(context, converted, attributeName, convertFunctionsToNull); + return; } - - // intentionally falls through } + + // intentionally falls through } v8::Handle names = o->GetOwnPropertyNames(context.context).FromMaybe(v8::Local()); uint32_t const n = names->Length(); - - AddValue(context, attributeName, - VPackValue(VPackValueType::Object)); + + if (context.level + 1 > ::maxRecursion) { + THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_BAD_PARAMETER, "input value is nested too deep"); + } + + AddValue(context, attributeName, VPackValue(VPackValueType::Object)); + + ++context.level; for (uint32_t i = 0; i < n; ++i) { // process attribute name @@ -454,7 +435,7 @@ static int V8ToVPack(BuilderContext& context, v8::Handle const parame v8::String::Utf8Value str(context.isolate, key); if (*str == nullptr) { - return TRI_ERROR_OUT_OF_MEMORY; + THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY); } v8::Handle value = o->Get(context.context, key).FromMaybe(v8::Handle()); @@ -463,55 +444,30 @@ static int V8ToVPack(BuilderContext& context, v8::Handle const parame continue; } - if (++context.level > MaxLevels) { - // too much recursion - return TRI_ERROR_BAD_PARAMETER; - } - - int res = V8ToVPack(context, value, - arangodb::velocypack::StringRef(*str, str.length()), - convertFunctionsToNull); - - --context.level; - - if (res != TRI_ERROR_NO_ERROR) { - return res; - } + V8ToVPack(context, value, + arangodb::velocypack::StringRef(*str, str.length()), + convertFunctionsToNull); } + + --context.level; if (!context.keepTopLevelOpen || context.level > 0) { context.builder.close(); } - return TRI_ERROR_NO_ERROR; + return; } - return TRI_ERROR_BAD_PARAMETER; + THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_BAD_PARAMETER, "unknown input type"); } -//////////////////////////////////////////////////////////////////////////////// /// @brief convert a V8 value to VPack value -//////////////////////////////////////////////////////////////////////////////// - -int TRI_V8ToVPack(v8::Isolate* isolate, VPackBuilder& builder, - v8::Local const value, bool keepTopLevelOpen, - bool convertFunctionsToNull) { +void TRI_V8ToVPack(v8::Isolate* isolate, VPackBuilder& builder, + v8::Local value, bool keepTopLevelOpen, + bool convertFunctionsToNull) { v8::HandleScope scope(isolate); BuilderContext context(isolate->GetCurrentContext(), isolate, builder, keepTopLevelOpen); TRI_GET_GLOBALS(); TRI_GET_GLOBAL_STRING(ToJsonKey); context.toJsonKey = ToJsonKey; - return V8ToVPack(context, value, arangodb::velocypack::StringRef(), convertFunctionsToNull); -} - -//////////////////////////////////////////////////////////////////////////////// -/// @brief convert a V8 value to VPack value, simplified version -/// this function assumes that the V8 object does not contain any cycles and -/// does not contain types such as Function, Date or RegExp -//////////////////////////////////////////////////////////////////////////////// - -int TRI_V8ToVPackSimple(v8::Isolate* isolate, arangodb::velocypack::Builder& builder, - v8::Handle const value) { - // a HandleScope must have been created by the caller already - BuilderContext context(isolate->GetCurrentContext(), isolate, builder, false); - return V8ToVPack(context, value, arangodb::velocypack::StringRef(), false); + V8ToVPack(context, value, arangodb::velocypack::StringRef(), convertFunctionsToNull); } diff --git a/lib/V8/v8-vpack.h b/lib/V8/v8-vpack.h index 5de874a2a7f3..61b69f912a77 100644 --- a/lib/V8/v8-vpack.h +++ b/lib/V8/v8-vpack.h @@ -27,34 +27,25 @@ #include "Basics/Common.h" #include "V8/v8-globals.h" -#include #include -#include -//////////////////////////////////////////////////////////////////////////////// -/// @brief converts a VPack value into a V8 object -//////////////////////////////////////////////////////////////////////////////// +namespace arangodb { +namespace velocypack { +class Builder; +class Slice; +} +} +/// @brief converts a VPack value into a V8 object v8::Handle TRI_VPackToV8( - v8::Isolate* isolate, arangodb::velocypack::Slice const&, + v8::Isolate* isolate, arangodb::velocypack::Slice, arangodb::velocypack::Options const* options = &arangodb::velocypack::Options::Defaults, arangodb::velocypack::Slice const* base = nullptr); -//////////////////////////////////////////////////////////////////////////////// -/// @brief convert a V8 value to VPack value -//////////////////////////////////////////////////////////////////////////////// - -int TRI_V8ToVPack(v8::Isolate* isolate, arangodb::velocypack::Builder& builder, - v8::Local const value, bool keepTopLevelOpen, - bool convertFunctionsToNull = false); - -//////////////////////////////////////////////////////////////////////////////// -/// @brief convert a V8 value to VPack value, simplified version -/// this function assumes that the V8 object does not contain any cycles and -/// does not contain types such as Function, Date or RegExp -//////////////////////////////////////////////////////////////////////////////// - -int TRI_V8ToVPackSimple(v8::Isolate* isolate, arangodb::velocypack::Builder& builder, - v8::Handle const value); +/// @brief convert a V8 value to VPack value. can throw an exception in case the +/// conversion goes wrong +void TRI_V8ToVPack(v8::Isolate* isolate, arangodb::velocypack::Builder& builder, + v8::Local value, bool keepTopLevelOpen, + bool convertFunctionsToNull = false); #endif diff --git a/tests/V8Server/v8-analyzers-test.cpp b/tests/V8Server/v8-analyzers-test.cpp index 4fde6192d3e5..761fa59bf50a 100644 --- a/tests/V8Server/v8-analyzers-test.cpp +++ b/tests/V8Server/v8-analyzers-test.cpp @@ -266,8 +266,7 @@ TEST_F(V8AnalyzerTest, test_instance_accessors) { args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -317,8 +316,7 @@ TEST_F(V8AnalyzerTest, test_instance_accessors) { args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -345,7 +343,7 @@ TEST_F(V8AnalyzerTest, test_instance_accessors) { ASSERT_FALSE(result.IsEmpty()); ASSERT_TRUE(result.ToLocalChecked()->IsObject()); VPackBuilder resultVPack; - ASSERT_EQ(TRI_ERROR_NO_ERROR, TRI_V8ToVPack(isolate.get(), resultVPack, result.ToLocalChecked(), false)); + TRI_V8ToVPack(isolate.get(), resultVPack, result.ToLocalChecked(), false); EXPECT_EQUAL_SLICES( resultVPack.slice(), VPackSlice::emptyObjectSlice()); @@ -369,8 +367,7 @@ TEST_F(V8AnalyzerTest, test_instance_accessors) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -417,8 +414,7 @@ TEST_F(V8AnalyzerTest, test_instance_accessors) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -506,8 +502,7 @@ TEST_F(V8AnalyzerTest, test_manager_create) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -537,8 +532,7 @@ TEST_F(V8AnalyzerTest, test_manager_create) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -569,8 +563,7 @@ TEST_F(V8AnalyzerTest, test_manager_create) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -601,8 +594,7 @@ TEST_F(V8AnalyzerTest, test_manager_create) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -633,8 +625,7 @@ TEST_F(V8AnalyzerTest, test_manager_create) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -664,8 +655,7 @@ TEST_F(V8AnalyzerTest, test_manager_create) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -731,8 +721,7 @@ TEST_F(V8AnalyzerTest, test_manager_create) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -925,8 +914,7 @@ TEST_F(V8AnalyzerTest, test_manager_get) { args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -1040,8 +1028,7 @@ TEST_F(V8AnalyzerTest, test_manager_get) { args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_EQ(TRI_ERROR_NO_ERROR, TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false)); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -1104,8 +1091,7 @@ TEST_F(V8AnalyzerTest, test_manager_get) { args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -1156,8 +1142,7 @@ TEST_F(V8AnalyzerTest, test_manager_get) { args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -1186,8 +1171,7 @@ TEST_F(V8AnalyzerTest, test_manager_get) { static_cast(args.size()), args.data()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -1218,8 +1202,7 @@ TEST_F(V8AnalyzerTest, test_manager_get) { args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -1628,8 +1611,7 @@ TEST_F(V8AnalyzerTest, test_manager_remove) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -1660,8 +1642,7 @@ TEST_F(V8AnalyzerTest, test_manager_remove) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -1692,8 +1673,7 @@ TEST_F(V8AnalyzerTest, test_manager_remove) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); ASSERT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -1731,8 +1711,7 @@ TEST_F(V8AnalyzerTest, test_manager_remove) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); ASSERT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && @@ -1848,8 +1827,7 @@ TEST_F(V8AnalyzerTest, test_manager_remove) { static_cast(args.size()), args.data()); ASSERT_TRUE(result.IsEmpty()); ASSERT_TRUE(tryCatch.HasCaught()); - ASSERT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), response, - tryCatch.Exception(), false))); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); auto slice = response.slice(); ASSERT_TRUE(slice.isObject()); ASSERT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && diff --git a/tests/V8Server/v8-users-test.cpp b/tests/V8Server/v8-users-test.cpp index c166b4884cdd..d67cceed5ea2 100644 --- a/tests/V8Server/v8-users-test.cpp +++ b/tests/V8Server/v8-users-test.cpp @@ -242,7 +242,7 @@ TEST_F(V8UsersTest, test_collection_auth) { EXPECT_TRUE( (arangodb::auth::Level::NONE == execContext.collectionAuthLevel(vocbase->name(), "testDataSource"))); - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_grantCollection) ->CallAsFunction(context, arangoUsers, @@ -250,9 +250,8 @@ TEST_F(V8UsersTest, test_collection_auth) { grantArgs.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -286,7 +285,7 @@ TEST_F(V8UsersTest, test_collection_auth) { EXPECT_TRUE( (arangodb::auth::Level::RO == execContext.collectionAuthLevel(vocbase->name(), "testDataSource"))); - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_revokeCollection) ->CallAsFunction(context, arangoUsers, @@ -294,9 +293,8 @@ TEST_F(V8UsersTest, test_collection_auth) { revokeArgs.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -336,7 +334,7 @@ TEST_F(V8UsersTest, test_collection_auth) { EXPECT_TRUE( (arangodb::auth::Level::NONE == execContext.collectionAuthLevel(vocbase->name(), "testDataSource"))); - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_grantCollection) ->CallAsFunction(context, arangoUsers, @@ -381,7 +379,7 @@ TEST_F(V8UsersTest, test_collection_auth) { EXPECT_TRUE( (arangodb::auth::Level::RO == execContext.collectionAuthLevel(vocbase->name(), "testDataSource"))); - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_revokeCollection) ->CallAsFunction(context, arangoUsers, @@ -424,7 +422,7 @@ TEST_F(V8UsersTest, test_collection_auth) { EXPECT_TRUE( (arangodb::auth::Level::NONE == execContext.collectionAuthLevel(vocbase->name(), "testDataSource"))); - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_grantCollection) ->CallAsFunction(context, arangoUsers, @@ -432,9 +430,8 @@ TEST_F(V8UsersTest, test_collection_auth) { grantArgs.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -476,7 +473,7 @@ TEST_F(V8UsersTest, test_collection_auth) { EXPECT_TRUE( (arangodb::auth::Level::RO == execContext.collectionAuthLevel(vocbase->name(), "testDataSource"))); - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_revokeCollection) ->CallAsFunction(context, arangoUsers, @@ -484,9 +481,8 @@ TEST_F(V8UsersTest, test_collection_auth) { revokeArgs.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -526,7 +522,7 @@ TEST_F(V8UsersTest, test_collection_auth) { EXPECT_TRUE( (arangodb::auth::Level::NONE == execContext.collectionAuthLevel(vocbase->name(), "testDataSource"))); - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_grantCollection) ->CallAsFunction(context, arangoUsers, @@ -571,7 +567,7 @@ TEST_F(V8UsersTest, test_collection_auth) { EXPECT_TRUE( (arangodb::auth::Level::RO == execContext.collectionAuthLevel(vocbase->name(), "testDataSource"))); - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_revokeCollection) ->CallAsFunction(context, arangoUsers, diff --git a/tests/V8Server/v8-views-test.cpp b/tests/V8Server/v8-views-test.cpp index 3cba309f5455..33c529ab662f 100644 --- a/tests/V8Server/v8-views-test.cpp +++ b/tests/V8Server/v8-views-test.cpp @@ -236,16 +236,15 @@ TEST_F(V8ViewsTest, test_auth) { arangodb::auth::UserMap userMap; // empty map, no user -> no permissions userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_createView) ->CallAsFunction(context, fn_createView, static_cast(args.size()), args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -264,16 +263,15 @@ TEST_F(V8ViewsTest, test_auth) { user.grantDatabase(vocbase.name(), arangodb::auth::Level::RO); userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_createView) ->CallAsFunction(context, fn_createView, static_cast(args.size()), args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -358,16 +356,15 @@ TEST_F(V8ViewsTest, test_auth) { arangodb::auth::UserMap userMap; // empty map, no user -> no permissions userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_dropView) ->CallAsFunction(context, fn_dropView, static_cast(args.size()), args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -387,16 +384,15 @@ TEST_F(V8ViewsTest, test_auth) { user.grantDatabase(vocbase.name(), arangodb::auth::Level::RO); userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_dropView) ->CallAsFunction(context, fn_dropView, static_cast(args.size()), args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -479,7 +475,7 @@ TEST_F(V8ViewsTest, test_auth) { arangodb::auth::UserMap userMap; // empty map, no user -> no permissions userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_drop)->CallAsFunction(context, arangoView, @@ -487,9 +483,8 @@ TEST_F(V8ViewsTest, test_auth) { args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -509,7 +504,7 @@ TEST_F(V8ViewsTest, test_auth) { user.grantDatabase(vocbase.name(), arangodb::auth::Level::RO); userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_drop)->CallAsFunction(context, arangoView, @@ -517,9 +512,8 @@ TEST_F(V8ViewsTest, test_auth) { args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -604,16 +598,15 @@ TEST_F(V8ViewsTest, test_auth) { arangodb::auth::UserMap userMap; // empty map, no user -> no permissions userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_rename) ->CallAsFunction(context, arangoView, static_cast(args.size()), args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -635,16 +628,15 @@ TEST_F(V8ViewsTest, test_auth) { user.grantDatabase(vocbase.name(), arangodb::auth::Level::RO); userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_rename) ->CallAsFunction(context, arangoView, static_cast(args.size()), args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -673,16 +665,15 @@ TEST_F(V8ViewsTest, test_auth) { p->_appendVelocyPackResult = arangodb::Result(); }); - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_rename) ->CallAsFunction(context, arangoView, static_cast(args.size()), args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -777,16 +768,15 @@ TEST_F(V8ViewsTest, test_auth) { arangodb::auth::UserMap userMap; // empty map, no user -> no permissions userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_properties) ->CallAsFunction(context, arangoView, static_cast(args.size()), args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -806,16 +796,15 @@ TEST_F(V8ViewsTest, test_auth) { user.grantDatabase(vocbase.name(), arangodb::auth::Level::RO); userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_properties) ->CallAsFunction(context, arangoView, static_cast(args.size()), args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -842,16 +831,15 @@ TEST_F(V8ViewsTest, test_auth) { p->_appendVelocyPackResult = arangodb::Result(); }); - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_properties) ->CallAsFunction(context, arangoView, static_cast(args.size()), args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -874,15 +862,14 @@ TEST_F(V8ViewsTest, test_auth) { user.grantCollection(vocbase.name(), "testView", arangodb::auth::Level::NONE); userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; auto result = v8::Function::Cast(*fn_properties) ->CallAsFunction(context, arangoView, static_cast(args.size()), args.data()); EXPECT_FALSE(result.IsEmpty()); EXPECT_TRUE(result.ToLocalChecked()->IsObject()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - result.ToLocalChecked(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, result.ToLocalChecked(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::DataSourceName) && slice.get(arangodb::StaticStrings::DataSourceName).isString() && @@ -951,7 +938,7 @@ TEST_F(V8ViewsTest, test_auth) { arangodb::auth::UserMap userMap; // empty map, no user -> no permissions userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_view)->CallAsFunction(context, fn_view, @@ -959,9 +946,8 @@ TEST_F(V8ViewsTest, test_auth) { args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -988,7 +974,7 @@ TEST_F(V8ViewsTest, test_auth) { p->_appendVelocyPackResult = arangodb::Result(); }); - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_view)->CallAsFunction(context, fn_view, @@ -996,9 +982,8 @@ TEST_F(V8ViewsTest, test_auth) { args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -1093,16 +1078,15 @@ TEST_F(V8ViewsTest, test_auth) { arangodb::auth::UserMap userMap; // empty map, no user -> no permissions userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_properties) ->CallAsFunction(context, arangoView, static_cast(args.size()), args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -1129,16 +1113,15 @@ TEST_F(V8ViewsTest, test_auth) { p->_appendVelocyPackResult = arangodb::Result(); }); - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_properties) ->CallAsFunction(context, arangoView, static_cast(args.size()), args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && @@ -1159,15 +1142,14 @@ TEST_F(V8ViewsTest, test_auth) { user.grantCollection(vocbase.name(), "testView", arangodb::auth::Level::NONE); // for missing collections User::collectionAuthLevel(...) returns database auth::Level userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; auto result = v8::Function::Cast(*fn_properties) ->CallAsFunction(context, arangoView, static_cast(args.size()), args.data()); EXPECT_FALSE(result.IsEmpty()); EXPECT_TRUE(result.ToLocalChecked()->IsObject()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - result.ToLocalChecked(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, result.ToLocalChecked(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::DataSourceName) && slice.get(arangodb::StaticStrings::DataSourceName).isString() && @@ -1230,7 +1212,7 @@ TEST_F(V8ViewsTest, test_auth) { arangodb::auth::UserMap userMap; // empty map, no user -> no permissions userManager->setAuthInfo(userMap); // set user map to avoid loading configuration from system database - arangodb::velocypack::Builder responce; + arangodb::velocypack::Builder response; v8::TryCatch tryCatch(isolate.get()); auto result = v8::Function::Cast(*fn_views)->CallAsFunction(context, fn_views, @@ -1238,9 +1220,8 @@ TEST_F(V8ViewsTest, test_auth) { args.data()); EXPECT_TRUE(result.IsEmpty()); EXPECT_TRUE(tryCatch.HasCaught()); - EXPECT_TRUE((TRI_ERROR_NO_ERROR == TRI_V8ToVPack(isolate.get(), responce, - tryCatch.Exception(), false))); - auto slice = responce.slice(); + TRI_V8ToVPack(isolate.get(), response, tryCatch.Exception(), false); + auto slice = response.slice(); EXPECT_TRUE(slice.isObject()); EXPECT_TRUE((slice.hasKey(arangodb::StaticStrings::ErrorNum) && slice.get(arangodb::StaticStrings::ErrorNum).isNumber() && diff --git a/tests/js/common/shell/shell-transactions.js b/tests/js/common/shell/shell-transactions.js index 659a1e3f4576..495e1a729380 100644 --- a/tests/js/common/shell/shell-transactions.js +++ b/tests/js/common/shell/shell-transactions.js @@ -44,19 +44,162 @@ function TransactionsInvocationsSuite() { return { - //////////////////////////////////////////////////////////////////////////////// - /// @brief set up - //////////////////////////////////////////////////////////////////////////////// + tearDown: function () { + internal.wait(0); + }, + + testNestingLevelArrayOk: function () { + let params = { doc: [] }; + let level = 0; + let start = params.doc; + while (level < 64) { + start.push([]); + start = start[0]; + ++level; + } - setUp: function () { + let obj = { + collections: {}, + action: function (params) { + return params.doc; + }, + params + }; + + let result = db._executeTransaction(obj); + assertEqual(params.doc, result); }, + + testNestingLevelArrayBorderline: function () { + let params = { doc: [] }; + let level = 0; + let start = params.doc; + while (level < 77) { + start.push([]); + start = start[0]; + ++level; + } - //////////////////////////////////////////////////////////////////////////////// - /// @brief tear down - //////////////////////////////////////////////////////////////////////////////// + let obj = { + collections: {}, + action: function (params) { + return params.doc; + }, + params + }; - tearDown: function () { - internal.wait(0); + let result = db._executeTransaction(obj); + assertEqual(params.doc, result); + }, + + testNestingLevelArrayTooDeep: function () { + if (!global.ARANGOSH_PATH) { + // we are arangod... in this case the JS -> JSON -> JS + // conversion will not take place, and we will not run into + // an error here + return; + } + + let params = { doc: [] }; + let level = 0; + let start = params.doc; + while (level < 100) { + start.push([]); + start = start[0]; + ++level; + } + + let obj = { + collections: {}, + action: function (params) { + return params.doc; + }, + params + }; + + try { + db._executeTransaction(obj); + fail(); + } catch (err) { + assertEqual(arangodb.errors.ERROR_BAD_PARAMETER.code, err.errorNum); + } + }, + + testNestingLevelObjectOk: function () { + let params = { doc: {} }; + let level = 0; + let start = params.doc; + while (level < 64) { + start.doc = {}; + start = start.doc; + ++level; + } + + let obj = { + collections: {}, + action: function (params) { + return params.doc; + }, + params + }; + + let result = db._executeTransaction(obj); + assertEqual(params.doc, result); + }, + + testNestingLevelObjectBorderline: function () { + let params = { doc: {} }; + let level = 0; + let start = params.doc; + while (level < 77) { + start.doc = {}; + start = start.doc; + ++level; + } + + let obj = { + collections: {}, + action: function (params) { + return params.doc; + }, + params + }; + + let result = db._executeTransaction(obj); + assertEqual(params.doc, result); + }, + + testNestingLevelObjectTooDeep: function () { + if (!global.ARANGOSH_PATH) { + // we are arangod... in this case the JS -> JSON -> JS + // conversion will not take place, and we will not run into + // an error here + return; + } + + let params = { doc: {} }; + let level = 0; + let start = params.doc; + while (level < 100) { + start.doc = {}; + start = start.doc; + ++level; + } + + let obj = { + collections: {}, + action: function (params) { + return params.doc; + }, + params + }; + + try { + db._executeTransaction(obj); + fail(); + } catch (err) { + assertEqual(arangodb.errors.ERROR_BAD_PARAMETER.code, err.errorNum); + } }, testErrorHandling: function () { @@ -99,8 +242,7 @@ function TransactionsInvocationsSuite() { assertEqual(arangodb.ERROR_BAD_PARAMETER, err.errorNum); } }, - - + //////////////////////////////////////////////////////////////////////////////// /// @brief execute a transaction with a string action //////////////////////////////////////////////////////////////////////////////// @@ -151,8 +293,7 @@ function TransactionsInvocationsSuite() { action: null, }); fail(); - } - catch (err) { + } catch (err) { assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err.errorNum); } }, @@ -167,8 +308,7 @@ function TransactionsInvocationsSuite() { collections: {} }); fail(); - } - catch (err) { + } catch (err) { assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err.errorNum); } }, @@ -184,8 +324,7 @@ function TransactionsInvocationsSuite() { action: "return 11;" }); fail(); - } - catch (err) { + } catch (err) { assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err.errorNum); } }, @@ -201,8 +340,7 @@ function TransactionsInvocationsSuite() { action: "function () { " }); fail(); - } - catch (err) { + } catch (err) { assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err.errorNum); } }, @@ -218,8 +356,7 @@ function TransactionsInvocationsSuite() { action: null, }); fail(); - } - catch (err) { + } catch (err) { assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err.errorNum); } },