diff --git a/src/LaunchDarkly/LDClient.php b/src/LaunchDarkly/LDClient.php index 7121cb4fc..4c52a199f 100644 --- a/src/LaunchDarkly/LDClient.php +++ b/src/LaunchDarkly/LDClient.php @@ -15,6 +15,8 @@ class LDClient { protected $_client; protected $_eventProcessor; protected $_offline; + protected $_events = true; + protected $_defaults = array(); /** @var FeatureRequester */ protected $_featureRequester; @@ -37,6 +39,13 @@ public function __construct($apiKey, $options = array()) { else { $this->_baseUri = rtrim($options['base_uri'], '/'); } + if (isset($options['events'])) { + $this->_events = $options['events']; + } + if (isset($options['defaults'])) { + $this->_defaults = $options['defaults']; + } + if (!isset($options['timeout'])) { $options['timeout'] = 3; } @@ -77,7 +86,8 @@ public function toggle($key, $user, $default = false) { } try { - $flag = $this->_toggle($key, $user, $default); + $default = $this->_get_default($key, $default); + $flag = $this->_toggle($key, $user); if (is_null($flag)) { $this->_sendFlagRequestEvent($key, $user, $default); @@ -169,7 +179,7 @@ public function identify($user) { * @param $value mixed */ protected function _sendFlagRequestEvent($key, $user, $value) { - if ($this->isOffline()) { + if ($this->isOffline() || !$this->_events) { return; } @@ -182,17 +192,25 @@ protected function _sendFlagRequestEvent($key, $user, $value) { $this->_eventProcessor->enqueue($event); } - protected function _toggle($key, $user, $default) { + protected function _toggle($key, $user) { try { $data = $this->_featureRequester->get($key); if ($data == null) { error_log("LDClient::_toggle received null from retriever, using default"); - return $default; + return null; } return self::_decode($data, $user); } catch (Exception $e) { $msg = $e->getMessage(); error_log("LDClient::_toggle received error $msg, using default"); + return null; + } + } + + protected function _get_default($key, $default) { + if (array_key_exists($key, $this->_defaults)) { + return $this->_defaults[$key]; + } else { return $default; } } diff --git a/tests/LDClientTest.php b/tests/LDClientTest.php index 78a0fa5e8..56b7da442 100644 --- a/tests/LDClientTest.php +++ b/tests/LDClientTest.php @@ -1,12 +1,89 @@ '\\LaunchDarkly\Tests\\MockFeatureRequester', + 'events' => false + )); + + $builder = new LDUserBuilder(3); + $user = $builder->build(); + $this->assertEquals('argdef', $client->toggle('foo', $user, 'argdef')); + } + + public function testToggleFromArray() { + MockFeatureRequester::$val = null; + $client = new LDClient("someKey", array( + 'feature_requester_class' => '\\LaunchDarkly\Tests\\MockFeatureRequester', + 'events' => false, + 'defaults' => array('foo' => 'fromarray') + )); + + $builder = new LDUserBuilder(3); + $user = $builder->build(); + $this->assertEquals('fromarray', $client->toggle('foo', $user, 'argdef')); + } + + public function testToggleEvent() { + MockFeatureRequester::$val = null; + $client = new LDClient("someKey", array( + 'feature_requester_class' => '\\LaunchDarkly\Tests\\MockFeatureRequester', + 'events' => true + )); + + $builder = new LDUserBuilder(3); + $user = $builder->build(); + $client->toggle('foo', $user, 'argdef'); + $proc = getPrivateField($client, '_eventProcessor'); + $queue = getPrivateField($proc, '_queue'); + $this->assertEquals(1, sizeof($queue)); + } + + public function testToggleEventsOff() { + MockFeatureRequester::$val = null; + $client = new LDClient("someKey", array( + 'feature_requester_class' => '\\LaunchDarkly\Tests\\MockFeatureRequester', + 'events' => false + )); + + $builder = new LDUserBuilder(3); + $user = $builder->build(); + $client->toggle('foo', $user, 'argdef'); + $proc = getPrivateField($client, '_eventProcessor'); + $queue = getPrivateField($proc, '_queue'); + $this->assertEquals(0, sizeof($queue)); + } +} + + +function getPrivateField(&$object, $fieldName) +{ + $reflection = new \ReflectionClass(get_class($object)); + $field = $reflection->getProperty($fieldName); + $field->setAccessible(true); + + return $field->getValue($object); } + +class MockFeatureRequester implements FeatureRequester { + public static $val = null; + function __construct($baseurl, $key, $options) { + } + public function get($key) { + return self::$val; + } +}