From d9b66135627abf595e9b6df374dc1b8505bd7d8b Mon Sep 17 00:00:00 2001 From: Jeremy Mikola Date: Thu, 15 Sep 2016 14:00:40 -0400 Subject: [PATCH 1/7] Remove unnecessary SKIPIFs from ReadPreference tests --- tests/readPreference/readpreference-ctor-001.phpt | 3 --- tests/readPreference/readpreference-ctor_error-001.phpt | 5 ++--- tests/readPreference/readpreference-ctor_error-002.phpt | 5 ++--- tests/readPreference/readpreference-getMode-001.phpt | 3 --- tests/readPreference/readpreference-getTagSets-001.phpt | 3 --- tests/readPreference/readpreference_error-001.phpt | 3 --- 6 files changed, 4 insertions(+), 18 deletions(-) diff --git a/tests/readPreference/readpreference-ctor-001.phpt b/tests/readPreference/readpreference-ctor-001.phpt index 3990442a7..31999d6b3 100644 --- a/tests/readPreference/readpreference-ctor-001.phpt +++ b/tests/readPreference/readpreference-ctor-001.phpt @@ -1,10 +1,7 @@ --TEST-- MongoDB\Driver\ReadPreference construction ---SKIPIF-- - --FILE-- "one")))); diff --git a/tests/readPreference/readpreference-ctor_error-001.phpt b/tests/readPreference/readpreference-ctor_error-001.phpt index fa5234e7e..231277970 100644 --- a/tests/readPreference/readpreference-ctor_error-001.phpt +++ b/tests/readPreference/readpreference-ctor_error-001.phpt @@ -1,10 +1,9 @@ --TEST-- MongoDB\Driver\ReadPreference construction (invalid mode) ---SKIPIF-- - --FILE-- --FILE-- 'one']]); diff --git a/tests/readPreference/readpreference-getMode-001.phpt b/tests/readPreference/readpreference-getMode-001.phpt index 85814ccd5..de132f6c1 100644 --- a/tests/readPreference/readpreference-getMode-001.phpt +++ b/tests/readPreference/readpreference-getMode-001.phpt @@ -1,10 +1,7 @@ --TEST-- MongoDB\Driver\ReadPreference::getMode() ---SKIPIF-- - --FILE-- --FILE-- --FILE-- Date: Thu, 15 Sep 2016 15:06:29 -0400 Subject: [PATCH 2/7] Use short array syntax in ReadPreference tests --- tests/readPreference/readpreference-getMode-001.phpt | 4 ++-- .../readPreference/readpreference-getTagSets-001.phpt | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/readPreference/readpreference-getMode-001.phpt b/tests/readPreference/readpreference-getMode-001.phpt index de132f6c1..ef31511e6 100644 --- a/tests/readPreference/readpreference-getMode-001.phpt +++ b/tests/readPreference/readpreference-getMode-001.phpt @@ -3,13 +3,13 @@ MongoDB\Driver\ReadPreference::getMode() --FILE-- 'ny'), array()), - array(array('dc' => 'ny'), array('dc' => 'sf', 'use' => 'reporting'), array()), -); + [], + [['dc' => 'ny'], []], + [['dc' => 'ny'], ['dc' => 'sf', 'use' => 'reporting'], []], +]; foreach ($tests as $test) { $rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY_PREFERRED, $test); From 77209dd65d71aa5573a0e5dd303badb07da439d9 Mon Sep 17 00:00:00 2001 From: Jeremy Mikola Date: Thu, 15 Sep 2016 13:58:33 -0400 Subject: [PATCH 3/7] PHPC-752: Add maxStalenessMS to ReadPreference class This adds an options array to the ReadPreference constructor, which accepts a maxStalenessMS option. The option is also exposed via a getter method and in debug output. --- php_phongo.c | 6 +- src/MongoDB/ReadPreference.c | 80 ++++++++++++++----- .../readpreference-ctor-001.phpt | 11 ++- .../readpreference-ctor_error-002.phpt | 7 ++ .../readpreference-ctor_error-003.phpt | 24 ++++++ .../readpreference-ctor_error-004.phpt | 20 +++++ .../readpreference-getMaxStalenessMS-001.phpt | 26 ++++++ 7 files changed, 151 insertions(+), 23 deletions(-) create mode 100644 tests/readPreference/readpreference-ctor_error-003.phpt create mode 100644 tests/readPreference/readpreference-ctor_error-004.phpt create mode 100644 tests/readPreference/readpreference-getMaxStalenessMS-001.phpt diff --git a/php_phongo.c b/php_phongo.c index da06f8d16..b95b49b07 100644 --- a/php_phongo.c +++ b/php_phongo.c @@ -962,7 +962,7 @@ void php_phongo_read_preference_to_zval(zval *retval, const mongoc_read_prefs_t const bson_t *tags = mongoc_read_prefs_get_tags(read_prefs); mongoc_read_mode_t mode = mongoc_read_prefs_get_mode(read_prefs); - array_init_size(retval, 2); + array_init_size(retval, 3); switch (mode) { case MONGOC_READ_PRIMARY: ADD_ASSOC_STRING(retval, "mode", "primary"); break; @@ -987,6 +987,10 @@ void php_phongo_read_preference_to_zval(zval *retval, const mongoc_read_prefs_t ADD_ASSOC_ZVAL_EX(retval, "tags", state.zchild); #endif } + + if (mongoc_read_prefs_get_max_staleness_ms(read_prefs) != 0) { + ADD_ASSOC_LONG_EX(retval, "maxStalenessMS", mongoc_read_prefs_get_max_staleness_ms(read_prefs)); + } } /* }}} */ void php_phongo_write_concern_to_zval(zval *retval, const mongoc_write_concern_t *write_concern) /* {{{ */ diff --git a/src/MongoDB/ReadPreference.c b/src/MongoDB/ReadPreference.c index 4996ccd01..06a8dd995 100644 --- a/src/MongoDB/ReadPreference.c +++ b/src/MongoDB/ReadPreference.c @@ -34,6 +34,8 @@ #include #include #include +/* PHP array helpers */ +#include "php_array_api.h" /* Our Compatability header */ #include "phongo_compat.h" @@ -46,7 +48,7 @@ PHONGO_API zend_class_entry *php_phongo_readpreference_ce; zend_object_handlers php_phongo_handler_readpreference; -/* {{{ proto void ReadPreference::__construct(integer $mode[, array $tagSets = array()]) +/* {{{ proto void ReadPreference::__construct(integer $mode[, array $tagSets = array()[, array $options = array()]]) Constructs a new ReadPreference */ PHP_METHOD(ReadPreference, __construct) { @@ -54,13 +56,14 @@ PHP_METHOD(ReadPreference, __construct) zend_error_handling error_handling; phongo_long mode; zval *tagSets = NULL; + zval *options = NULL; SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value) SUPPRESS_UNUSED_WARNING(return_value_used) zend_replace_error_handling(EH_THROW, phongo_exception_from_phongo_domain(PHONGO_ERROR_INVALID_ARGUMENT), &error_handling TSRMLS_CC); intern = Z_READPREFERENCE_OBJ_P(getThis()); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|a!", &mode, &tagSets) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|a!a!", &mode, &tagSets, &options) == FAILURE) { zend_restore_error_handling(&error_handling TSRMLS_CC); return; } @@ -80,28 +83,46 @@ PHP_METHOD(ReadPreference, __construct) return; } - switch(ZEND_NUM_ARGS()) { - case 2: - if (tagSets) { - bson_t *tags = bson_new(); + if (tagSets) { + bson_t *tags = bson_new(); - phongo_zval_to_bson(tagSets, PHONGO_BSON_NONE, (bson_t *)tags, NULL TSRMLS_CC); + phongo_zval_to_bson(tagSets, PHONGO_BSON_NONE, (bson_t *)tags, NULL TSRMLS_CC); - if (!php_phongo_read_preference_tags_are_valid(tags)) { - phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "tagSets must be an array of zero or more documents"); - bson_destroy(tags); - return; - } + if (!php_phongo_read_preference_tags_are_valid(tags)) { + phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "tagSets must be an array of zero or more documents"); + bson_destroy(tags); + return; + } + + if (!bson_empty(tags) && mode == MONGOC_READ_PRIMARY) { + phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "tagSets may not be used with primary mode"); + bson_destroy(tags); + return; + } + + mongoc_read_prefs_set_tags(intern->read_preference, tags); + bson_destroy(tags); + } + + if (options && php_array_exists(options, "maxStalenessMS")) { + phongo_long maxStalenessMS = php_array_fetchc_long(options, "maxStalenessMS"); - if (!bson_empty(tags) && mode == MONGOC_READ_PRIMARY) { - phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "tagSets may not be used with primary mode"); - bson_destroy(tags); - return; - } + if (maxStalenessMS < 0) { + phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Expected maxStalenessMS to be >= 0, %" PHONGO_LONG_FORMAT " given", maxStalenessMS); + return; + } + + if (maxStalenessMS > INT32_MAX) { + phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Expected maxStalenessMS to be <= %" PRId32 ", %" PHONGO_LONG_FORMAT " given", INT32_MAX, maxStalenessMS); + return; + } - mongoc_read_prefs_set_tags(intern->read_preference, tags); - bson_destroy(tags); - } + if (maxStalenessMS > 0 && mode == MONGOC_READ_PRIMARY) { + phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "maxStalenessMS may not be used with primary mode"); + return; + } + + mongoc_read_prefs_set_max_staleness_ms(intern->read_preference, maxStalenessMS); } if (!mongoc_read_prefs_is_valid(intern->read_preference)) { @@ -111,6 +132,23 @@ PHP_METHOD(ReadPreference, __construct) } /* }}} */ +/* {{{ proto integer ReadPreference::getMaxStalenessMS() + Returns the ReadPreference maxStalenessMS value */ +PHP_METHOD(ReadPreference, getMaxStalenessMS) +{ + php_phongo_readpreference_t *intern; + SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used) + + intern = Z_READPREFERENCE_OBJ_P(getThis()); + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + + RETURN_LONG(mongoc_read_prefs_get_max_staleness_ms(intern->read_preference)); +} +/* }}} */ + /* {{{ proto integer ReadPreference::getMode() Returns the ReadPreference mode */ PHP_METHOD(ReadPreference, getMode) @@ -184,6 +222,7 @@ PHP_METHOD(ReadPreference, bsonSerialize) ZEND_BEGIN_ARG_INFO_EX(ai_ReadPreference___construct, 0, 0, 1) ZEND_ARG_INFO(0, mode) ZEND_ARG_ARRAY_INFO(0, tagSets, 1) + ZEND_ARG_ARRAY_INFO(0, options, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(ai_ReadPreference_void, 0, 0, 0) @@ -191,6 +230,7 @@ ZEND_END_ARG_INFO() static zend_function_entry php_phongo_readpreference_me[] = { PHP_ME(ReadPreference, __construct, ai_ReadPreference___construct, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL) + PHP_ME(ReadPreference, getMaxStalenessMS, ai_ReadPreference_void, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL) PHP_ME(ReadPreference, getMode, ai_ReadPreference_void, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL) PHP_ME(ReadPreference, getTagSets, ai_ReadPreference_void, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL) PHP_ME(ReadPreference, bsonSerialize, ai_ReadPreference_void, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL) diff --git a/tests/readPreference/readpreference-ctor-001.phpt b/tests/readPreference/readpreference-ctor-001.phpt index 31999d6b3..d0c17411e 100644 --- a/tests/readPreference/readpreference-ctor-001.phpt +++ b/tests/readPreference/readpreference-ctor-001.phpt @@ -4,8 +4,9 @@ MongoDB\Driver\ReadPreference construction "one")))); -var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY, array())); +var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY, [['tag' => 'one']])); +var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY, [])); +var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY, null, ['maxStalenessMS' => 1000])); ?> ===DONE=== @@ -31,4 +32,10 @@ object(MongoDB\Driver\ReadPreference)#%d (%d) { ["mode"]=> string(7) "primary" } +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(9) "secondary" + ["maxStalenessMS"]=> + int(1000) +} ===DONE=== diff --git a/tests/readPreference/readpreference-ctor_error-002.phpt b/tests/readPreference/readpreference-ctor_error-002.phpt index a394dd075..50ea5442e 100644 --- a/tests/readPreference/readpreference-ctor_error-002.phpt +++ b/tests/readPreference/readpreference-ctor_error-002.phpt @@ -17,6 +17,11 @@ echo throws(function() { new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY, ['invalid']); }, 'MongoDB\Driver\Exception\InvalidArgumentException'), "\n"; +// Ensure that tagSets is validated before maxStalenessMS option +echo throws(function() { + new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY, ['invalid'], ['maxStalenessMS' => -1]); +}, 'MongoDB\Driver\Exception\InvalidArgumentException'), "\n"; + ?> ===DONE=== @@ -27,4 +32,6 @@ OK: Got MongoDB\Driver\Exception\InvalidArgumentException tagSets must be an array of zero or more documents OK: Got MongoDB\Driver\Exception\InvalidArgumentException tagSets must be an array of zero or more documents +OK: Got MongoDB\Driver\Exception\InvalidArgumentException +tagSets must be an array of zero or more documents ===DONE=== diff --git a/tests/readPreference/readpreference-ctor_error-003.phpt b/tests/readPreference/readpreference-ctor_error-003.phpt new file mode 100644 index 000000000..88e614aa2 --- /dev/null +++ b/tests/readPreference/readpreference-ctor_error-003.phpt @@ -0,0 +1,24 @@ +--TEST-- +MongoDB\Driver\ReadPreference construction (invalid maxStalenessMS) +--FILE-- + 1000]); +}, 'MongoDB\Driver\Exception\InvalidArgumentException'), "\n"; + +echo throws(function() { + new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY, null, ['maxStalenessMS' => -1]); +}, 'MongoDB\Driver\Exception\InvalidArgumentException'), "\n"; + +?> +===DONE=== + +--EXPECT-- +OK: Got MongoDB\Driver\Exception\InvalidArgumentException +maxStalenessMS may not be used with primary mode +OK: Got MongoDB\Driver\Exception\InvalidArgumentException +Expected maxStalenessMS to be >= 0, -1 given +===DONE=== diff --git a/tests/readPreference/readpreference-ctor_error-004.phpt b/tests/readPreference/readpreference-ctor_error-004.phpt new file mode 100644 index 000000000..08870f3fb --- /dev/null +++ b/tests/readPreference/readpreference-ctor_error-004.phpt @@ -0,0 +1,20 @@ +--TEST-- +MongoDB\Driver\ReadPreference construction (invalid maxStalenessMS range) +--SKIPIF-- + +--FILE-- + 2147483648]); +}, 'MongoDB\Driver\Exception\InvalidArgumentException'), "\n"; + +?> +===DONE=== + +--EXPECT-- +OK: Got MongoDB\Driver\Exception\InvalidArgumentException +Expected maxStalenessMS to be <= 2147483647, 2147483648 given +===DONE=== diff --git a/tests/readPreference/readpreference-getMaxStalenessMS-001.phpt b/tests/readPreference/readpreference-getMaxStalenessMS-001.phpt new file mode 100644 index 000000000..69902c9fb --- /dev/null +++ b/tests/readPreference/readpreference-getMaxStalenessMS-001.phpt @@ -0,0 +1,26 @@ +--TEST-- +MongoDB\Driver\ReadPreference::getMaxStalenessMS() +--FILE-- + $test]); + var_dump($rp->getMaxStalenessMS()); +} + +?> +===DONE=== + +--EXPECT-- +int(0) +int(1000) +int(2147483647) +===DONE=== From 701e07f9e5d979c7c93b5a27f5c02fb5d0cf3433 Mon Sep 17 00:00:00 2001 From: Jeremy Mikola Date: Thu, 15 Sep 2016 14:51:19 -0400 Subject: [PATCH 4/7] Rename Manager ctor read preference and write concern tests --- ...error-003.phpt => manager-ctor-read_preference-error-001.phpt} | 0 ...r_error-004.phpt => manager-ctor-write_concern-error-001.phpt} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename tests/manager/{manager-ctor_error-003.phpt => manager-ctor-read_preference-error-001.phpt} (100%) rename tests/manager/{manager-ctor_error-004.phpt => manager-ctor-write_concern-error-001.phpt} (100%) diff --git a/tests/manager/manager-ctor_error-003.phpt b/tests/manager/manager-ctor-read_preference-error-001.phpt similarity index 100% rename from tests/manager/manager-ctor_error-003.phpt rename to tests/manager/manager-ctor-read_preference-error-001.phpt diff --git a/tests/manager/manager-ctor_error-004.phpt b/tests/manager/manager-ctor-write_concern-error-001.phpt similarity index 100% rename from tests/manager/manager-ctor_error-004.phpt rename to tests/manager/manager-ctor-write_concern-error-001.phpt From eeb7c04d04372f3cf1d690923bd4b660d760a8cb Mon Sep 17 00:00:00 2001 From: Jeremy Mikola Date: Thu, 15 Sep 2016 14:59:16 -0400 Subject: [PATCH 5/7] Remove unnecessary SKIPIFs from Manager ctor tests --- tests/manager/manager-ctor-001.phpt | 3 -- tests/manager/manager-ctor-003.phpt | 3 -- ...anager-ctor-read_preference-error-001.phpt | 17 +++++------ .../manager-ctor-write_concern-error-001.phpt | 29 +++++++++---------- tests/manager/manager-ctor_error-001.phpt | 6 ++-- tests/manager/manager-ctor_error-002.phpt | 5 ++-- 6 files changed, 27 insertions(+), 36 deletions(-) diff --git a/tests/manager/manager-ctor-001.phpt b/tests/manager/manager-ctor-001.phpt index a5cc768f2..49203c516 100644 --- a/tests/manager/manager-ctor-001.phpt +++ b/tests/manager/manager-ctor-001.phpt @@ -1,10 +1,7 @@ --TEST-- MongoDB\Driver\Manager::__construct() with default URI ---SKIPIF-- - --FILE-- --FILE-- --FILE-- 'nothing']); + $manager = new MongoDB\Driver\Manager(null, ['readPreference' => 'nothing']); }, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; echo throws(function() { - $manager = new MongoDB\Driver\Manager(STANDALONE . '/?readPreference=primary', ['readPreferenceTags' => [[]]]); + $manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/?readPreference=primary', ['readPreferenceTags' => [[]]]); }, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; echo throws(function() { - $manager = new MongoDB\Driver\Manager(STANDALONE . '/?readPreference=primary', ['readPreferenceTags' => ['invalid']]); + $manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/?readPreference=primary', ['readPreferenceTags' => ['invalid']]); }, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; ?> ===DONE=== ---EXPECTF-- +--EXPECT-- OK: Got MongoDB\Driver\Exception\InvalidArgumentException -Failed to parse MongoDB URI: '%s/?readPreference=primary&readPreferenceTags=dc:ny' +Failed to parse MongoDB URI: 'mongodb://127.0.0.1/?readPreference=primary&readPreferenceTags=dc:ny' OK: Got MongoDB\Driver\Exception\InvalidArgumentException Unsupported readPreference value: 'nothing' OK: Got MongoDB\Driver\Exception\InvalidArgumentException diff --git a/tests/manager/manager-ctor-write_concern-error-001.phpt b/tests/manager/manager-ctor-write_concern-error-001.phpt index c7458de9d..07297ebfb 100644 --- a/tests/manager/manager-ctor-write_concern-error-001.phpt +++ b/tests/manager/manager-ctor-write_concern-error-001.phpt @@ -1,55 +1,54 @@ --TEST-- MongoDB\Driver\Manager::__construct(): invalid write concern ---SKIPIF-- - --FILE-- true)); + $manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/?w=-1', ['journal' => true]); }, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; echo throws(function() { - $manager = new MongoDB\Driver\Manager(STANDALONE . '/?w=0', array('journal' => true)); + $manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/?w=0', ['journal' => true]); }, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; echo throws(function() { - $manager = new MongoDB\Driver\Manager(STANDALONE . '/?journal=true', array('w' => -1)); + $manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/?journal=true', ['w' => -1]); }, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; echo throws(function() { - $manager = new MongoDB\Driver\Manager(STANDALONE . '/?journal=true', array('w' => 0)); + $manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/?journal=true', ['w' => 0]); }, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; echo throws(function() { - $manager = new MongoDB\Driver\Manager(STANDALONE, array('w' => -1, 'journal' => true)); + $manager = new MongoDB\Driver\Manager(null, ['w' => -1, 'journal' => true]); }, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; echo throws(function() { - $manager = new MongoDB\Driver\Manager(STANDALONE, array('w' => 0, 'journal' => true)); + $manager = new MongoDB\Driver\Manager(null, ['w' => 0, 'journal' => true]); }, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; echo throws(function() { - $manager = new MongoDB\Driver\Manager(STANDALONE, array('w' => -2)); + $manager = new MongoDB\Driver\Manager(null, ['w' => -2]); }, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; ?> ===DONE=== ---EXPECTF-- +--EXPECT-- OK: Got MongoDB\Driver\Exception\InvalidArgumentException -Failed to parse MongoDB URI: '%s/?w=-1&journal=true' +Failed to parse MongoDB URI: 'mongodb://127.0.0.1/?w=-1&journal=true' OK: Got MongoDB\Driver\Exception\InvalidArgumentException -Failed to parse MongoDB URI: '%s/?w=0&journal=true' +Failed to parse MongoDB URI: 'mongodb://127.0.0.1/?w=0&journal=true' OK: Got MongoDB\Driver\Exception\InvalidArgumentException Journal conflicts with w value: -1 OK: Got MongoDB\Driver\Exception\InvalidArgumentException diff --git a/tests/manager/manager-ctor_error-001.phpt b/tests/manager/manager-ctor_error-001.phpt index a439e5b56..f40a30083 100644 --- a/tests/manager/manager-ctor_error-001.phpt +++ b/tests/manager/manager-ctor_error-001.phpt @@ -1,14 +1,14 @@ --TEST-- MongoDB\Driver\Manager::__construct(): too many arguments --SKIPIF-- - --FILE-- diff --git a/tests/manager/manager-ctor_error-002.phpt b/tests/manager/manager-ctor_error-002.phpt index a5684948d..43b4599c7 100644 --- a/tests/manager/manager-ctor_error-002.phpt +++ b/tests/manager/manager-ctor_error-002.phpt @@ -1,10 +1,9 @@ --TEST-- MongoDB\Driver\Manager::__construct(): invalid URI ---SKIPIF-- - --FILE-- Date: Thu, 15 Sep 2016 16:16:46 -0400 Subject: [PATCH 6/7] PHPC-752: Validate range of maxStalenessMS Manager option This also adds various tests for parsing of read preference Manager options. --- php_phongo.c | 14 +++- .../manager-ctor-read_preference-001.phpt | 76 +++++++++++++++++++ .../manager-ctor-read_preference-002.phpt | 54 +++++++++++++ ...anager-ctor-read_preference-error-002.phpt | 42 ++++++++++ tests/manager/manager-maxstalenessms-001.phpt | 13 ---- .../manager-maxstalenessms_error-001.phpt | 33 -------- 6 files changed, 185 insertions(+), 47 deletions(-) create mode 100644 tests/manager/manager-ctor-read_preference-001.phpt create mode 100644 tests/manager/manager-ctor-read_preference-002.phpt create mode 100644 tests/manager/manager-ctor-read_preference-error-002.phpt delete mode 100644 tests/manager/manager-maxstalenessms-001.phpt delete mode 100644 tests/manager/manager-maxstalenessms_error-001.phpt diff --git a/php_phongo.c b/php_phongo.c index b95b49b07..10ebe0783 100644 --- a/php_phongo.c +++ b/php_phongo.c @@ -1201,6 +1201,18 @@ static bool php_phongo_apply_rp_options_to_uri(mongoc_uri_t *uri, bson_t *option /* Handle maxStalenessMS, and make sure it is not combined with primary * readPreference */ if (bson_iter_init_find_case(&iter, options, "maxstalenessms") && BSON_ITER_HOLDS_INT32(&iter)) { + int32_t max_staleness_ms = bson_iter_int32(&iter); + + if (max_staleness_ms < 0) { + phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Expected maxStalenessMS to be >= 0, %" PRId32 " given", max_staleness_ms); + mongoc_read_prefs_destroy(new_rp); + + return false; + } + + /* max_staleness_ms is fetched as an INT32, so there is no need to check + * if it exists INT32_MAX as we do in the ReadPreference constructor. */ + if (mongoc_read_prefs_get_mode(new_rp) == MONGOC_READ_PRIMARY) { phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Primary read preference mode conflicts with maxStalenessMS"); mongoc_read_prefs_destroy(new_rp); @@ -1208,7 +1220,7 @@ static bool php_phongo_apply_rp_options_to_uri(mongoc_uri_t *uri, bson_t *option return false; } - mongoc_read_prefs_set_max_staleness_ms(new_rp, bson_iter_int32(&iter)); + mongoc_read_prefs_set_max_staleness_ms(new_rp, max_staleness_ms); } /* This may be redundant in light of the last check (primary with tags), but diff --git a/tests/manager/manager-ctor-read_preference-001.phpt b/tests/manager/manager-ctor-read_preference-001.phpt new file mode 100644 index 000000000..f50feb13a --- /dev/null +++ b/tests/manager/manager-ctor-read_preference-001.phpt @@ -0,0 +1,76 @@ +--TEST-- +MongoDB\Driver\Manager::__construct(): read preference options +--FILE-- + 'primary']], + [null, ['readPreference' => 'secondary', 'readPreferenceTags' => [['tag' => 'one'], []]]], + [null, ['readPreference' => 'secondary', 'maxStalenessMS' => 1000]], +]; + +foreach ($tests as $test) { + list($uri, $options) = $test; + + $manager = new MongoDB\Driver\Manager($uri, $options); + var_dump($manager->getReadPreference()); +} + +?> +===DONE=== + +--EXPECTF-- +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(7) "primary" +} +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(9) "secondary" + ["tags"]=> + array(2) { + [0]=> + array(1) { + ["tag"]=> + string(3) "one" + } + [1]=> + array(0) { + } + } +} +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(9) "secondary" + ["maxStalenessMS"]=> + int(1000) +} +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(7) "primary" +} +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(9) "secondary" + ["tags"]=> + array(2) { + [0]=> + array(1) { + ["tag"]=> + string(3) "one" + } + [1]=> + array(0) { + } + } +} +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(9) "secondary" + ["maxStalenessMS"]=> + int(1000) +} +===DONE=== diff --git a/tests/manager/manager-ctor-read_preference-002.phpt b/tests/manager/manager-ctor-read_preference-002.phpt new file mode 100644 index 000000000..b48ff1d97 --- /dev/null +++ b/tests/manager/manager-ctor-read_preference-002.phpt @@ -0,0 +1,54 @@ +--TEST-- +MongoDB\Driver\Manager::__construct(): read preference options (maxStalenessMS) +--FILE-- + 1231]], + ['mongodb://127.0.0.1/?readPreference=secondary&maxStalenessMS=1000', ['maxStalenessMS' => 2000]], + ['mongodb://127.0.0.1/?readpreference=secondary&maxstalenessms=1231', []], + ['mongodb://127.0.0.1/?readpreference=secondary', ['maxstalenessms' => 1231]], +]; + +foreach ($tests as $test) { + list($uri, $options) = $test; + + $manager = new MongoDB\Driver\Manager($uri, $options); + var_dump($manager->getReadPreference()); +} + +?> +===DONE=== +--EXPECTF-- +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(9) "secondary" + ["maxStalenessMS"]=> + int(1231) +} +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(9) "secondary" + ["maxStalenessMS"]=> + int(1231) +} +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(9) "secondary" + ["maxStalenessMS"]=> + int(2000) +} +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(9) "secondary" + ["maxStalenessMS"]=> + int(1231) +} +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(9) "secondary" + ["maxStalenessMS"]=> + int(1231) +} +===DONE=== diff --git a/tests/manager/manager-ctor-read_preference-error-002.phpt b/tests/manager/manager-ctor-read_preference-error-002.phpt new file mode 100644 index 000000000..9d5be0d13 --- /dev/null +++ b/tests/manager/manager-ctor-read_preference-error-002.phpt @@ -0,0 +1,42 @@ +--TEST-- +MongoDB\Driver\Manager::__construct(): invalid read preference (maxStalenessMS) +--FILE-- + 1231]); +}, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; + +echo throws(function() { + $manager = new MongoDB\Driver\Manager(null, ['maxStalenessMS' => 1231]); +}, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; + +echo throws(function() { + $manager = new MongoDB\Driver\Manager(null, ['readPreference' => 'secondary', 'maxStalenessMS' => -1]); +}, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; + +?> +===DONE=== + +--EXPECTF-- +OK: Got MongoDB\Driver\Exception\InvalidArgumentException +Failed to parse MongoDB URI: 'mongodb://127.0.0.1/?maxstalenessms=1231' +OK: Got MongoDB\Driver\Exception\InvalidArgumentException +Failed to parse MongoDB URI: 'mongodb://127.0.0.1/?maxStalenessMS=1231' +OK: Got MongoDB\Driver\Exception\InvalidArgumentException +Primary read preference mode conflicts with maxStalenessMS +OK: Got MongoDB\Driver\Exception\InvalidArgumentException +Primary read preference mode conflicts with maxStalenessMS +OK: Got MongoDB\Driver\Exception\InvalidArgumentException +Expected maxStalenessMS to be >= 0, -1 given +===DONE=== diff --git a/tests/manager/manager-maxstalenessms-001.phpt b/tests/manager/manager-maxstalenessms-001.phpt deleted file mode 100644 index 4e3ab24eb..000000000 --- a/tests/manager/manager-maxstalenessms-001.phpt +++ /dev/null @@ -1,13 +0,0 @@ ---TEST-- -MongoDB\Driver\Manager: maxStalenessMS ---FILE-- - 1231 ] ); -$manager = new MongoDB\Driver\Manager("mongodb://localhost/?readPreference=SECONDARY&maxstalenessms=1231"); -$manager = new MongoDB\Driver\Manager("mongodb://localhost/?readPreference=SECONDARY", [ 'maxstalenessms' => 1231 ] ); -?> -==DONE== ---EXPECTF-- -==DONE== diff --git a/tests/manager/manager-maxstalenessms_error-001.phpt b/tests/manager/manager-maxstalenessms_error-001.phpt deleted file mode 100644 index d6fafb5ef..000000000 --- a/tests/manager/manager-maxstalenessms_error-001.phpt +++ /dev/null @@ -1,33 +0,0 @@ ---TEST-- -MongoDB\Driver\Manager: maxStalenessMS ---FILE-- -getMessage(), "\n"; -} - -try { - $manager = new MongoDB\Driver\Manager("mongodb://localhost/?maxStalenessMS=1231"); -} catch ( MongoDB\Driver\Exception\InvalidArgumentException $e ) { - echo $e->getMessage(), "\n"; -} - -try { - $manager = new MongoDB\Driver\Manager("mongodb://localhost/", [ 'maxstalenessms' => 1231 ] ); -} catch ( MongoDB\Driver\Exception\InvalidArgumentException $e ) { - echo $e->getMessage(), "\n"; -} - -try { - $manager = new MongoDB\Driver\Manager("mongodb://localhost/", [ 'maxStalenessMS' => 1231 ] ); -} catch ( MongoDB\Driver\Exception\InvalidArgumentException $e ) { - echo $e->getMessage(), "\n"; -} -?> ---EXPECTF-- -Failed to parse MongoDB URI: 'mongodb://localhost/?maxstalenessms=1231' -Failed to parse MongoDB URI: 'mongodb://localhost/?maxStalenessMS=1231' -Primary read preference mode conflicts with maxStalenessMS -Primary read preference mode conflicts with maxStalenessMS From 6ec5348957f1168bc07a1a684a3cffd473874360 Mon Sep 17 00:00:00 2001 From: Jeremy Mikola Date: Thu, 15 Sep 2016 16:18:09 -0400 Subject: [PATCH 7/7] Test that read preference options of the wrong type are ignored --- .../manager-ctor-read_preference-003.phpt | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 tests/manager/manager-ctor-read_preference-003.phpt diff --git a/tests/manager/manager-ctor-read_preference-003.phpt b/tests/manager/manager-ctor-read_preference-003.phpt new file mode 100644 index 000000000..d2bfb17b7 --- /dev/null +++ b/tests/manager/manager-ctor-read_preference-003.phpt @@ -0,0 +1,44 @@ +--TEST-- +MongoDB\Driver\Manager::__construct(): read preference options of the wrong type are ignored +--FILE-- + 1]], + ['mongodb://127.0.0.1/?readPreference=secondary&readPreferenceTags=tag:one', ['readPreferenceTags' => 'invalid']], + ['mongodb://127.0.0.1/?readPreference=secondary&maxStalenessMS=1000', ['maxStalenessMS' => 'invalid']], +]; + +foreach ($tests as $test) { + list($uri, $options) = $test; + + $manager = new MongoDB\Driver\Manager($uri, $options); + var_dump($manager->getReadPreference()); +} + +?> +===DONE=== +--EXPECTF-- +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(9) "secondary" +} +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(9) "secondary" + ["tags"]=> + array(1) { + [0]=> + array(1) { + ["tag"]=> + string(3) "one" + } + } +} +object(MongoDB\Driver\ReadPreference)#%d (%d) { + ["mode"]=> + string(9) "secondary" + ["maxStalenessMS"]=> + int(1000) +} +===DONE===