diff --git a/src/Optimizely/Bucketer.php b/src/Optimizely/Bucketer.php index a1e88a04..1cc6a864 100644 --- a/src/Optimizely/Bucketer.php +++ b/src/Optimizely/Bucketer.php @@ -1,6 +1,6 @@ isInMutexGroup()) { $group = $config->getGroup($experiment->getGroupId()); @@ -188,19 +189,9 @@ public function bucket(ProjectConfigInterface $config, Experiment $experiment, $ if (!empty($variationId)) { $variation = $config->getVariationFromId($experiment->getKey(), $variationId); - $this->_logger->log( - Logger::INFO, - sprintf( - 'User "%s" is in variation %s of experiment %s.', - $userId, - $variation->getKey(), - $experiment->getKey() - ) - ); return $variation; } - $this->_logger->log(Logger::INFO, sprintf('User "%s" is in no variation.', $userId)); return null; } } diff --git a/src/Optimizely/DecisionService/DecisionService.php b/src/Optimizely/DecisionService/DecisionService.php index d00e7f84..f4c7d410 100644 --- a/src/Optimizely/DecisionService/DecisionService.php +++ b/src/Optimizely/DecisionService/DecisionService.php @@ -1,6 +1,6 @@ _logger)) { + if (!Validator::doesUserMeetAudienceConditions($projectConfig, $experiment, $attributes, $this->_logger)) { $this->_logger->log( Logger::INFO, sprintf('User "%s" does not meet conditions to be in experiment "%s".', $userId, $experiment->getKey()) @@ -161,9 +161,21 @@ public function getVariation(ProjectConfigInterface $projectConfig, Experiment $ } $variation = $this->_bucketer->bucket($projectConfig, $experiment, $bucketingId, $userId); - if (!is_null($variation)) { + if ($variation === null) { + $this->_logger->log(Logger::INFO, sprintf('User "%s" is in no variation.', $userId)); + } else { $this->saveVariation($experiment, $variation, $userProfile); + $this->_logger->log( + Logger::INFO, + sprintf( + 'User "%s" is in variation %s of experiment %s.', + $userId, + $variation->getKey(), + $experiment->getKey() + ) + ); } + return $variation; } @@ -298,40 +310,40 @@ public function getVariationForFeatureRollout(ProjectConfigInterface $projectCon // Evaluate all rollout rules except for last one for ($i = 0; $i < sizeof($rolloutRules) - 1; $i++) { - $experiment = $rolloutRules[$i]; + $rolloutRule = $rolloutRules[$i]; // Evaluate if user meets the audience condition of this rollout rule - if (!Validator::isUserInExperiment($projectConfig, $experiment, $userAttributes, $this->_logger)) { + if (!Validator::doesUserMeetAudienceConditions($projectConfig, $rolloutRule, $userAttributes, $this->_logger, 'Optimizely\Enums\RolloutAudienceEvaluationLogs', $i + 1)) { $this->_logger->log( Logger::DEBUG, - sprintf("User '%s' did not meet the audience conditions to be in rollout rule '%s'.", $userId, $experiment->getKey()) + sprintf("User '%s' does not meet conditions for targeting rule %s.", $userId, $i+1) ); // Evaluate this user for the next rule continue; } // Evaluate if user satisfies the traffic allocation for this rollout rule - $variation = $this->_bucketer->bucket($projectConfig, $experiment, $bucketing_id, $userId); + $variation = $this->_bucketer->bucket($projectConfig, $rolloutRule, $bucketing_id, $userId); if ($variation && $variation->getKey()) { - return new FeatureDecision($experiment, $variation, FeatureDecision::DECISION_SOURCE_ROLLOUT); + return new FeatureDecision($rolloutRule, $variation, FeatureDecision::DECISION_SOURCE_ROLLOUT); } break; } // Evaluate Everyone Else Rule / Last Rule now - $experiment = $rolloutRules[sizeof($rolloutRules)-1]; + $rolloutRule = $rolloutRules[sizeof($rolloutRules) - 1]; // Evaluate if user meets the audience condition of Everyone Else Rule / Last Rule now - if (!Validator::isUserInExperiment($projectConfig, $experiment, $userAttributes, $this->_logger)) { + if (!Validator::doesUserMeetAudienceConditions($projectConfig, $rolloutRule, $userAttributes, $this->_logger, 'Optimizely\Enums\RolloutAudienceEvaluationLogs', 'Everyone Else')) { $this->_logger->log( Logger::DEBUG, - sprintf("User '%s' did not meet the audience conditions to be in rollout rule '%s'.", $userId, $experiment->getKey()) + sprintf("User '%s' does not meet conditions for targeting rule 'Everyone Else'.", $userId) ); return null; } - $variation = $this->_bucketer->bucket($projectConfig, $experiment, $bucketing_id, $userId); + $variation = $this->_bucketer->bucket($projectConfig, $rolloutRule, $bucketing_id, $userId); if ($variation && $variation->getKey()) { - return new FeatureDecision($experiment, $variation, FeatureDecision::DECISION_SOURCE_ROLLOUT); + return new FeatureDecision($rolloutRule, $variation, FeatureDecision::DECISION_SOURCE_ROLLOUT); } return null; } diff --git a/src/Optimizely/Enums/AudienceEvaluationLogs.php b/src/Optimizely/Enums/CommonAudienceEvaluationLogs.php similarity index 87% rename from src/Optimizely/Enums/AudienceEvaluationLogs.php rename to src/Optimizely/Enums/CommonAudienceEvaluationLogs.php index b1b4b5d9..6a83e15e 100644 --- a/src/Optimizely/Enums/AudienceEvaluationLogs.php +++ b/src/Optimizely/Enums/CommonAudienceEvaluationLogs.php @@ -1,6 +1,6 @@ _logger->log( Logger::INFO, - "User '{$userId}'is not in any variation, ". + "User '{$userId}' is not in experiment or rollout, ". "returning default value '{$variableValue}'." ); } else { @@ -941,21 +941,20 @@ private function getFeatureVariableValueFromVariation($featureFlagKey, $variable $variableValue = $variableUsage->getValue(); $this->_logger->log( Logger::INFO, - "Returning variable value '{$variableValue}' for variation '{$variation->getKey()}' ". - "of feature flag '{$featureFlagKey}'" + "Returning variable value '{$variableValue}' for variable key '{$variableKey}' ". + "of feature flag '{$featureFlagKey}'." ); } else { $this->_logger->log( Logger::INFO, - "Variable '{$variableKey}' is not used in variation '{$variation->getKey()}', ". - "returning default value '{$variableValue}'." + "Variable value is not defined. Returning the default variable value '{$variableValue}'." ); } } else { $this->_logger->log( Logger::INFO, - "Feature '{$featureFlagKey}' for variation '{$variation->getKey()}' is not enabled, ". - "returning default value '{$variableValue}'." + "Feature '{$featureFlagKey}' is not enabled for user '{$userId}'. ". + "Returning the default variable value '{$variableValue}'." ); } } diff --git a/src/Optimizely/Utils/CustomAttributeConditionEvaluator.php b/src/Optimizely/Utils/CustomAttributeConditionEvaluator.php index be3cdd27..84a128b0 100644 --- a/src/Optimizely/Utils/CustomAttributeConditionEvaluator.php +++ b/src/Optimizely/Utils/CustomAttributeConditionEvaluator.php @@ -1,6 +1,6 @@ getKey(); + } + $audienceConditions = $experiment->getAudienceConditions(); if ($audienceConditions === null) { $audienceConditions = $experiment->getAudienceIds(); } $logger->log(Logger::DEBUG, sprintf( - AudienceEvaluationLogs::EVALUATING_AUDIENCES_COMBINED, - $experiment->getKey(), + $loggingClass::EVALUATING_AUDIENCES_COMBINED, + $loggingKey, json_encode($audienceConditions) )); // Return true if experiment is not targeted to any audience. if (empty($audienceConditions)) { $logger->log(Logger::INFO, sprintf( - AudienceEvaluationLogs::AUDIENCE_EVALUATION_RESULT_COMBINED, - $experiment->getKey(), + $loggingClass::AUDIENCE_EVALUATION_RESULT_COMBINED, + $loggingKey, 'TRUE' )); return true; @@ -171,14 +180,14 @@ public static function isUserInExperiment($config, $experiment, $userAttributes, return $customAttrCondEval->evaluate($leafCondition); }; - $evaluateAudience = function ($audienceId) use ($config, $evaluateCustomAttr, $logger) { + $evaluateAudience = function ($audienceId) use ($config, $evaluateCustomAttr, $logger, $loggingClass) { $audience = $config->getAudience($audienceId); if ($audience === null) { return null; } $logger->log(Logger::DEBUG, sprintf( - AudienceEvaluationLogs::EVALUATING_AUDIENCE, + $loggingClass::EVALUATING_AUDIENCE, $audienceId, json_encode($audience->getConditionsList()) )); @@ -188,7 +197,7 @@ public static function isUserInExperiment($config, $experiment, $userAttributes, $resultStr = $result === null ? 'UNKNOWN' : strtoupper(var_export($result, true)); $logger->log(Logger::DEBUG, sprintf( - AudienceEvaluationLogs::AUDIENCE_EVALUATION_RESULT, + $loggingClass::AUDIENCE_EVALUATION_RESULT, $audienceId, $resultStr )); @@ -201,8 +210,8 @@ public static function isUserInExperiment($config, $experiment, $userAttributes, $evalResult = $evalResult || false; $logger->log(Logger::INFO, sprintf( - AudienceEvaluationLogs::AUDIENCE_EVALUATION_RESULT_COMBINED, - $experiment->getKey(), + $loggingClass::AUDIENCE_EVALUATION_RESULT_COMBINED, + $loggingKey, strtoupper(var_export($evalResult, true)) )); diff --git a/tests/BucketerTest.php b/tests/BucketerTest.php index 97fc1c51..5642cd53 100644 --- a/tests/BucketerTest.php +++ b/tests/BucketerTest.php @@ -1,6 +1,6 @@ loggerMock); $bucketer->setBucketValues([1000, 3000, 7000, 9000]); // Total calls in this test - $this->loggerMock->expects($this->exactly(8)) + $this->loggerMock->expects($this->exactly(4)) ->method('log'); // No variation (empty entity ID) $this->loggerMock->expects($this->at(0)) ->method('log') ->with(Logger::DEBUG, sprintf('Assigned bucket 1000 to user "%s" with bucketing ID "%s".', $this->testUserId, $this->testBucketingIdControl)); - $this->loggerMock->expects($this->at(1)) - ->method('log') - ->with(Logger::INFO, 'User "testUserId" is in no variation.'); $this->assertNull( $bucketer->bucket( @@ -120,12 +117,6 @@ public function testBucketValidExperimentNotInGroup() $this->loggerMock->expects($this->at(0)) ->method('log') ->with(Logger::DEBUG, sprintf('Assigned bucket 3000 to user "%s" with bucketing ID "%s".', $this->testUserId, $this->testBucketingIdControl)); - $this->loggerMock->expects($this->at(1)) - ->method('log') - ->with( - Logger::INFO, - 'User "testUserId" is in variation control of experiment test_experiment.' - ); $this->assertEquals( new Variation('7722370027', 'control'), @@ -141,12 +132,6 @@ public function testBucketValidExperimentNotInGroup() $this->loggerMock->expects($this->at(0)) ->method('log') ->with(Logger::DEBUG, sprintf('Assigned bucket 7000 to user "%s" with bucketing ID "%s".', $this->testUserId, $this->testBucketingIdControl)); - $this->loggerMock->expects($this->at(1)) - ->method('log') - ->with( - Logger::INFO, - 'User "testUserId" is in variation variation of experiment test_experiment.' - ); $this->assertEquals( new Variation('7721010009', 'variation'), @@ -162,9 +147,6 @@ public function testBucketValidExperimentNotInGroup() $this->loggerMock->expects($this->at(0)) ->method('log') ->with(Logger::DEBUG, sprintf('Assigned bucket 9000 to user "%s" with bucketing ID "%s".', $this->testUserId, $this->testBucketingIdControl)); - $this->loggerMock->expects($this->at(1)) - ->method('log') - ->with(Logger::INFO, 'User "testUserId" is in no variation.'); $this->assertNull( $bucketer->bucket( @@ -180,7 +162,7 @@ public function testBucketValidExperimentInGroup() { $bucketer = new TestBucketer($this->loggerMock); // Total calls in this test - $this->loggerMock->expects($this->exactly(14)) + $this->loggerMock->expects($this->exactly(12)) ->method('log'); // group_experiment_1 (15% experiment) @@ -195,12 +177,6 @@ public function testBucketValidExperimentInGroup() $this->loggerMock->expects($this->at(2)) ->method('log') ->with(Logger::DEBUG, sprintf('Assigned bucket 4000 to user "%s" with bucketing ID "%s".', $this->testUserId, $this->testBucketingIdControl)); - $this->loggerMock->expects($this->at(3)) - ->method('log') - ->with( - Logger::INFO, - 'User "testUserId" is in variation group_exp_1_var_1 of experiment group_experiment_1.' - ); $this->assertEquals( new Variation( @@ -233,12 +209,6 @@ public function testBucketValidExperimentInGroup() $this->loggerMock->expects($this->at(2)) ->method('log') ->with(Logger::DEBUG, sprintf('Assigned bucket 7000 to user "%s" with bucketing ID "%s".', $this->testUserId, $this->testBucketingIdControl)); - $this->loggerMock->expects($this->at(3)) - ->method('log') - ->with( - Logger::INFO, - 'User "testUserId" is in variation group_exp_1_var_2 of experiment group_experiment_1.' - ); $this->assertEquals( new Variation( diff --git a/tests/DecisionServiceTests/DecisionServiceTest.php b/tests/DecisionServiceTests/DecisionServiceTest.php index 151a295a..2f5f54a9 100644 --- a/tests/DecisionServiceTests/DecisionServiceTest.php +++ b/tests/DecisionServiceTests/DecisionServiceTest.php @@ -1,6 +1,6 @@ assertContains([Logger::DEBUG, "User 'user_1' did not meet the audience conditions to be in rollout rule '{$experiment0->getKey()}'."], $this->collectedLogs); - $this->assertContains([Logger::DEBUG, "User 'user_1' did not meet the audience conditions to be in rollout rule '{$experiment1->getKey()}'."], $this->collectedLogs); + $this->assertContains([Logger::DEBUG, "User 'user_1' does not meet conditions for targeting rule 1."], $this->collectedLogs); + $this->assertContains([Logger::DEBUG, "User 'user_1' does not meet conditions for targeting rule 2."], $this->collectedLogs); } public function testGetVariationForFeatureRolloutWhenUserDoesNotQualifyForAnyTargetingRuleOrEveryoneElseRule() @@ -1161,11 +1161,59 @@ public function testGetVariationForFeatureRolloutWhenUserDoesNotQualifyForAnyTar $this->assertNull($this->decisionService->getVariationForFeatureRollout($this->config, $featureFlag, 'user_1', $user_attributes)); // Verify Logs - $this->assertContains([Logger::DEBUG, "User 'user_1' did not meet the audience conditions to be in rollout rule '{$experiment0->getKey()}'."], $this->collectedLogs); - $this->assertContains([Logger::DEBUG, "User 'user_1' did not meet the audience conditions to be in rollout rule '{$experiment1->getKey()}'."], $this->collectedLogs); - $this->assertContains([Logger::DEBUG, "User 'user_1' did not meet the audience conditions to be in rollout rule '{$experiment2->getKey()}'."], $this->collectedLogs); + $this->assertContains([Logger::DEBUG, "User 'user_1' does not meet conditions for targeting rule 1."], $this->collectedLogs); + $this->assertContains([Logger::DEBUG, "User 'user_1' does not meet conditions for targeting rule 2."], $this->collectedLogs); + $this->assertContains([Logger::DEBUG, "User 'user_1' does not meet conditions for targeting rule 'Everyone Else'."], $this->collectedLogs); } + + public function testGetVariationForFeatureRolloutLogging() + { + $featureFlag = $this->config->getFeatureFlagFromKey('boolean_single_variable_feature'); + $rollout_id = $featureFlag->getRolloutId(); + $rollout = $this->config->getRolloutFromId($rollout_id); + $experiment0 = $rollout->getExperiments()[0]; + $experiment1 = $rollout->getExperiments()[1]; + // Everyone Else Rule + $experiment2 = $rollout->getExperiments()[2]; + $expected_variation = $experiment2->getVariations()[0]; + $expected_decision = new FeatureDecision( + $experiment2, + $expected_variation, + FeatureDecision::DECISION_SOURCE_ROLLOUT + ); + + // Provide null attributes so that user does not qualify for audience + $user_attributes = []; + $this->decisionService = new DecisionService($this->loggerMock); + $bucketer = new \ReflectionProperty(DecisionService::class, '_bucketer'); + $bucketer->setAccessible(true); + $bucketer->setValue($this->decisionService, $this->bucketerMock); + + // Expect bucket to be called exactly once for the everyone else/last rule. + $this->bucketerMock->expects($this->exactly(1)) + ->method('bucket') + ->willReturn($expected_variation); + + $this->loggerMock->expects($this->any()) + ->method('log') + ->will($this->returnCallback($this->collectLogsForAssertion)); + + $this->assertEquals( + $expected_decision, + $this->decisionService->getVariationForFeatureRollout($this->config, $featureFlag, 'user_1', $user_attributes) + ); + + // Verify Logs + $this->assertContains([Logger::DEBUG, 'Evaluating audiences for rule 1: ["11155"].'], $this->collectedLogs); + $this->assertContains([Logger::INFO, 'Audiences for rule 1 collectively evaluated to FALSE.'], $this->collectedLogs); + $this->assertContains([Logger::DEBUG, 'Evaluating audiences for rule 2: ["11155"].'], $this->collectedLogs); + $this->assertContains([Logger::INFO,'Audiences for rule 2 collectively evaluated to FALSE.'], $this->collectedLogs); + $this->assertContains([Logger::DEBUG, 'Evaluating audiences for rule Everyone Else: [].'], $this->collectedLogs); + $this->assertContains([Logger::INFO, 'Audiences for rule Everyone Else collectively evaluated to TRUE.'], $this->collectedLogs); + } + + // test set/get forced variation for the following cases: // - valid and invalid user ID // - valid and invalid experiment key diff --git a/tests/OptimizelyTest.php b/tests/OptimizelyTest.php index 5225df49..04eff148 100644 --- a/tests/OptimizelyTest.php +++ b/tests/OptimizelyTest.php @@ -3558,7 +3558,7 @@ public function testGetFeatureVariableValueForTypeGivenFeatureFlagIsNotEnabledFo ->method('log') ->with( Logger::INFO, - "User 'user_id'is not in any variation, returning default value '14.99'." + "User 'user_id' is not in experiment or rollout, returning default value '14.99'." ); $this->assertSame( @@ -3595,8 +3595,8 @@ public function testGetFeatureVariableValueForTypeGivenFeatureFlagIsEnabledForUs ->method('log') ->with( Logger::INFO, - "Returning variable value '42.42' for variation 'control' ". - "of feature flag 'double_single_variable_feature'" + "Returning variable value '42.42' for variable key 'double_variable' ". + "of feature flag 'double_single_variable_feature'." ); $this->assertSame( @@ -3634,8 +3634,8 @@ public function testGetFeatureVariableValueForTypeReturnDefaultVariableValueGive ->method('log') ->with( Logger::INFO, - "Feature 'double_single_variable_feature' for variation 'control' is not enabled, ". - "returning default value '14.99'." + "Feature 'double_single_variable_feature' is not enabled for user 'user_id'. ". + "Returning the default variable value '14.99'." ); $this->assertSame( @@ -3675,8 +3675,8 @@ public function testGetFeatureVariableValueForTypeWithRolloutRule() ->method('log') ->with( Logger::INFO, - "Returning variable value 'true' for variation '177771' ". - "of feature flag 'boolean_single_variable_feature'" + "Returning variable value 'true' for variable key 'boolean_variable' ". + "of feature flag 'boolean_single_variable_feature'." ); $this->assertTrue($this->optimizelyObject->getFeatureVariableBoolean('boolean_single_variable_feature', 'boolean_variable', 'user_id', [])); @@ -3714,8 +3714,8 @@ public function testGetFeatureVariableValueReturnDefaultVariableValueGivenUserIn ->method('log') ->with( Logger::INFO, - "Feature 'boolean_single_variable_feature' for variation '177771' is not enabled, ". - "returning default value 'true'." + "Feature 'boolean_single_variable_feature' is not enabled for user 'user_id'. ". + "Returning the default variable value 'true'." ); $this->assertTrue($this->optimizelyObject->getFeatureVariableBoolean('boolean_single_variable_feature', 'boolean_variable', 'user_id', [])); @@ -3751,7 +3751,7 @@ public function testGetFeatureVariableValueForTypeGivenFeatureFlagIsEnabledForUs ->method('log') ->with( Logger::INFO, - "Variable 'double_variable' is not used in variation 'control', returning default value '14.99'." + "Variable value is not defined. Returning the default variable value '14.99'." ); $this->assertSame( @@ -3793,11 +3793,11 @@ public function testGetFeatureVariableValueForTypeWithEmptyUserID() ->method('log') ->with( Logger::INFO, - "User ''is not in any variation, returning default value '14.99'." + "User 'test_user' is not in experiment or rollout, returning default value '14.99'." ); $this->assertSame( - $this->optimizelyObject->getFeatureVariableValueForType('double_single_variable_feature', 'double_variable', '', [], 'double'), + $this->optimizelyObject->getFeatureVariableValueForType('double_single_variable_feature', 'double_variable', 'test_user', [], 'double'), 14.99 ); } @@ -4254,8 +4254,8 @@ public function testGetAllFeatureVariablesGivenFeatureFlagIsEnabledForUserAndVar ->method('log') ->with( Logger::INFO, - "Returning variable value '42.42' for variation 'control' ". - "of feature flag 'double_single_variable_feature'" + "Returning variable value '42.42' for variable key 'double_variable'". + " of feature flag 'double_single_variable_feature'." ); $this->assertSame( diff --git a/tests/UtilsTests/ValidatorLoggingTest.php b/tests/UtilsTests/ValidatorLoggingTest.php index 7c4d52d5..3549b505 100644 --- a/tests/UtilsTests/ValidatorLoggingTest.php +++ b/tests/UtilsTests/ValidatorLoggingTest.php @@ -42,7 +42,7 @@ protected function setUp() }; } - public function testIsUserInExperimentWithNoAudience() + public function testdoesUserMeetAudienceConditionsWithNoAudience() { $experiment = $this->config->getExperimentFromKey('test_experiment'); $experiment->setAudienceIds([]); @@ -56,10 +56,10 @@ public function testIsUserInExperimentWithNoAudience() ->method('log') ->with(Logger::INFO, "Audiences for experiment \"test_experiment\" collectively evaluated to TRUE."); - $this->assertTrue(Validator::isUserInExperiment($this->config, $experiment, [], $this->loggerMock)); + $this->assertTrue(Validator::doesUserMeetAudienceConditions($this->config, $experiment, [], $this->loggerMock)); } - public function testIsUserInExperimentEvaluatesAudienceIds() + public function testdoesUserMeetAudienceConditionsEvaluatesAudienceIds() { $userAttributes = [ "test_attribute" => "test_value_1" @@ -73,7 +73,7 @@ public function testIsUserInExperimentEvaluatesAudienceIds() ->method('log') ->will($this->returnCallback($this->collectLogsForAssertion)); - Validator::isUserInExperiment($this->config, $experiment, $userAttributes, $this->loggerMock); + Validator::doesUserMeetAudienceConditions($this->config, $experiment, $userAttributes, $this->loggerMock); $this->assertContains([Logger::DEBUG, "Evaluating audiences for experiment \"test_experiment\": [\"11155\"]."], $this->collectedLogs); $this->assertContains( @@ -94,7 +94,7 @@ public function testIsUserInExperimenEvaluatesAudienceConditions() ->method('log') ->will($this->returnCallback($this->collectLogsForAssertion)); - Validator::isUserInExperiment($this->typedConfig, $experiment, ["house" => "I am in Slytherin"], $this->loggerMock); + Validator::doesUserMeetAudienceConditions($this->typedConfig, $experiment, ["house" => "I am in Slytherin"], $this->loggerMock); $this->assertContains( [Logger::DEBUG, "Evaluating audiences for experiment \"audience_combinations_experiment\": [\"or\",[\"or\",\"3468206642\",\"3988293898\"]]."], diff --git a/tests/UtilsTests/ValidatorTest.php b/tests/UtilsTests/ValidatorTest.php index 27d84aea..a71f46b0 100644 --- a/tests/UtilsTests/ValidatorTest.php +++ b/tests/UtilsTests/ValidatorTest.php @@ -1,6 +1,6 @@ getMockBuilder(DatafileProjectConfig::class) ->setConstructorArgs(array(DATAFILE, $this->loggerMock, new NoOpErrorHandler())) @@ -213,7 +213,7 @@ public function testIsUserInExperimentAudienceUsedInExperimentNoAttributesProvid ->will($this->returnValue($audience)); $this->assertTrue( - Validator::isUserInExperiment( + Validator::doesUserMeetAudienceConditions( $configMock, $experiment, null, @@ -222,7 +222,7 @@ public function testIsUserInExperimentAudienceUsedInExperimentNoAttributesProvid ); $this->assertTrue( - Validator::isUserInExperiment( + Validator::doesUserMeetAudienceConditions( $configMock, $experiment, [], @@ -231,11 +231,11 @@ public function testIsUserInExperimentAudienceUsedInExperimentNoAttributesProvid ); } - public function testIsUserInExperimentAudienceMatch() + public function testDoesUserMeetAudienceConditionsAudienceMatch() { $config = new DatafileProjectConfig(DATAFILE, new NoOpLogger(), new NoOpErrorHandler()); $this->assertTrue( - Validator::isUserInExperiment( + Validator::doesUserMeetAudienceConditions( $config, $config->getExperimentFromKey('test_experiment'), ['device_type' => 'iPhone', 'location' => 'San Francisco'], @@ -244,11 +244,11 @@ public function testIsUserInExperimentAudienceMatch() ); } - public function testIsUserInExperimentAudienceNoMatch() + public function testDoesUserMeetAudienceConditionsAudienceNoMatch() { $config = new DatafileProjectConfig(DATAFILE, new NoOpLogger(), new NoOpErrorHandler()); $this->assertFalse( - Validator::isUserInExperiment( + Validator::doesUserMeetAudienceConditions( $config, $config->getExperimentFromKey('test_experiment'), ['device_type' => 'Android', 'location' => 'San Francisco'], @@ -257,8 +257,8 @@ public function testIsUserInExperimentAudienceNoMatch() ); } - // test that isUserInExperiment returns true when no audience is attached to experiment. - public function testIsUserInExperimentNoAudienceUsedInExperiment() + // test that doesUserMeetAudienceConditions returns true when no audience is attached to experiment. + public function testDoesUserMeetAudienceConditionsNoAudienceUsedInExperiment() { $config = new DatafileProjectConfig(DATAFILE, null, null); $experiment = $config->getExperimentFromKey('test_experiment'); @@ -267,7 +267,7 @@ public function testIsUserInExperimentNoAudienceUsedInExperiment() $experiment->setAudienceIds([]); $experiment->setAudienceConditions([]); $this->assertTrue( - Validator::isUserInExperiment( + Validator::doesUserMeetAudienceConditions( $config, $experiment, [], @@ -279,7 +279,7 @@ public function testIsUserInExperimentNoAudienceUsedInExperiment() $experiment->setAudienceIds(['7718080042']); $experiment->setAudienceConditions([]); $this->assertTrue( - Validator::isUserInExperiment( + Validator::doesUserMeetAudienceConditions( $config, $experiment, [], @@ -291,7 +291,7 @@ public function testIsUserInExperimentNoAudienceUsedInExperiment() $experiment->setAudienceIds([]); $experiment->setAudienceConditions(null); $this->assertTrue( - Validator::isUserInExperiment( + Validator::doesUserMeetAudienceConditions( $config, $experiment, [], @@ -300,9 +300,9 @@ public function testIsUserInExperimentNoAudienceUsedInExperiment() ); } - // test that isUserInExperiment returns false when some audience is attached to experiment + // test that doesUserMeetAudienceConditions returns false when some audience is attached to experiment // and user attributes do not match. - public function testIsUserInExperimentSomeAudienceUsedInExperiment() + public function testDoesUserMeetAudienceConditionsSomeAudienceUsedInExperiment() { $config = new DatafileProjectConfig(DATAFILE, null, null); $experiment = $config->getExperimentFromKey('test_experiment'); @@ -312,7 +312,7 @@ public function testIsUserInExperimentSomeAudienceUsedInExperiment() $experiment->setAudienceConditions(['11155']); $this->assertFalse( - Validator::isUserInExperiment( + Validator::doesUserMeetAudienceConditions( $config, $experiment, ['device_type' => 'Android', 'location' => 'San Francisco'], @@ -326,7 +326,7 @@ public function testIsUserInExperimentSomeAudienceUsedInExperiment() $experiment->setAudienceConditions(null); $this->assertFalse( - Validator::isUserInExperiment( + Validator::doesUserMeetAudienceConditions( $config, $experiment, ['device_type' => 'iPhone', 'location' => 'San Francisco'], @@ -335,8 +335,8 @@ public function testIsUserInExperimentSomeAudienceUsedInExperiment() ); } - // test that isUserInExperiment evaluates audience when audienceConditions is an audience leaf node. - public function testIsUserInExperimentWithAudienceConditionsSetToAudienceIdString() + // test that doesUserMeetAudienceConditions evaluates audience when audienceConditions is an audience leaf node. + public function testDoesUserMeetAudienceConditionsWithAudienceConditionsSetToAudienceIdString() { $config = new DatafileProjectConfig(DATAFILE, null, null); $experiment = $config->getExperimentFromKey('test_experiment'); @@ -346,7 +346,7 @@ public function testIsUserInExperimentWithAudienceConditionsSetToAudienceIdStrin $experiment->setAudienceConditions('7718080042'); $this->assertTrue( - Validator::isUserInExperiment( + Validator::doesUserMeetAudienceConditions( $config, $experiment, ['device_type' => 'iPhone', 'location' => 'San Francisco'], @@ -355,7 +355,7 @@ public function testIsUserInExperimentWithAudienceConditionsSetToAudienceIdStrin ); } - public function testIsUserInExperimentWithUnknownAudienceId() + public function testDoesUserMeetAudienceConditionsWithUnknownAudienceId() { $config = new DatafileProjectConfig(DATAFILE, $this->loggerMock, new NoOpErrorHandler()); $experiment = $config->getExperimentFromKey('test_experiment'); @@ -366,7 +366,7 @@ public function testIsUserInExperimentWithUnknownAudienceId() // User qualifies for audience with ID "7718080042". $this->assertTrue( - Validator::isUserInExperiment( + Validator::doesUserMeetAudienceConditions( $config, $experiment, ['device_type' => 'iPhone', 'location' => 'San Francisco'], @@ -375,8 +375,8 @@ public function testIsUserInExperimentWithUnknownAudienceId() ); } - // test that isUserInExperiment evaluates simple audience. - public function testIsUserInExperimentWithSimpleAudience() + // test that doesUserMeetAudienceConditions evaluates simple audience. + public function testDoesUserMeetAudienceConditionsWithSimpleAudience() { $config = new DatafileProjectConfig(DATAFILE, null, null); $configMock = $this->getMockBuilder(DatafileProjectConfig::class) @@ -399,7 +399,7 @@ public function testIsUserInExperimentWithSimpleAudience() ->will($this->returnValue($config->getAudience('7718080042'))); $this->assertTrue( - Validator::isUserInExperiment( + Validator::doesUserMeetAudienceConditions( $configMock, $experiment, ['device_type' => 'iPhone', 'location' => 'San Francisco'], @@ -408,8 +408,8 @@ public function testIsUserInExperimentWithSimpleAudience() ); } - // test that isUserInExperiment evaluates complex audience. - public function testIsUserInExperimentWithComplexAudience() + // test that doesUserMeetAudienceConditions evaluates complex audience. + public function testDoesUserMeetAudienceConditionsWithComplexAudience() { $config = new DatafileProjectConfig(DATAFILE_WITH_TYPED_AUDIENCES, null, null); $configMock = $this->getMockBuilder(DatafileProjectConfig::class) @@ -456,7 +456,7 @@ public function testIsUserInExperimentWithComplexAudience() ->will($this->returnValue($config->getAudience('3468206643'))); $this->assertTrue( - Validator::isUserInExperiment( + Validator::doesUserMeetAudienceConditions( $configMock, $experiment, ['should_do_it' => true, 'house' => 'foo'],