Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions Sources/Implementation/DefaultDecisionService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ struct FeatureDecision {
let variation: Variation?
let source: String
var cmabUUID: String?
var error = false
}

struct VariationDecision {
Expand Down Expand Up @@ -125,7 +126,7 @@ class DefaultDecisionService: OPTDecisionService {
case .failure:
let info = LogMessage.cmabFetchFailed(experiment.key)
self.logger.e(info)
reasons.addInfo(info)
reasons.addError(info)
let nilVariation = VariationDecision(variation: nil, cmabError: true, cmabUUID: nil)
return DecisionResponse(result: nilVariation, reasons: reasons)
}
Expand Down Expand Up @@ -457,7 +458,7 @@ class DefaultDecisionService: OPTDecisionService {
if result.cmabError {
// For CMAB - we're supposed to get decision from the server.
// If failed, return decision with nil variation, so the client can take care of them.
let featureDecision = FeatureDecision(experiment: experiment, variation: nil, source: Constants.DecisionSource.featureTest.rawValue)
let featureDecision = FeatureDecision(experiment: experiment, variation: nil, source: Constants.DecisionSource.featureTest.rawValue, error: true)
return DecisionResponse(result: featureDecision, reasons: reasons)
} else if let variation = result.variation {
let featureDecision = FeatureDecision(experiment: experiment, variation: variation, source: Constants.DecisionSource.featureTest.rawValue, cmabUUID: result.cmabUUID)
Expand Down
6 changes: 6 additions & 0 deletions Sources/Optimizely+Decide/OptimizelyClient+Decide.swift
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,12 @@ extension OptimizelyClient {
return OptimizelyDecision.errorDecision(key: flagKey, user: user, error: .featureKeyInvalid(flagKey))
}

let error = flagDecision?.error ?? false

guard !error else {
return OptimizelyDecision.errorDecision(key: flagKey, user: user, reasons: decisionReasons.toReport())
}

let userId = user.userId
let attributes = user.attributes
let flagEnabled = flagDecision?.variation?.featureEnabled ?? false
Expand Down
10 changes: 10 additions & 0 deletions Sources/Optimizely+Decide/OptimizelyDecision.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,16 @@ extension OptimizelyDecision {
reasons: [error.reason])
}

static func errorDecision(key: String, user: OptimizelyUserContext, reasons: [String]) -> OptimizelyDecision {
return OptimizelyDecision(variationKey: nil,
enabled: false,
variables: OptimizelyJSON.createEmpty(),
ruleKey: nil,
flagKey: key,
userContext: user,
reasons: reasons)
}

var hasFailed: Bool {
return variationKey == nil
}
Expand Down
2 changes: 1 addition & 1 deletion Sources/Utils/LogMessage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ extension LogMessage: CustomStringConvertible {
case .failedToAssignValue: message = "Value for path could not be assigned to provided type."
case .valueForKeyNotFound(let key): message = "Value for JSON key (\(key)) not found."
case .lowPeriodicDownloadInterval: message = "Polling intervals below 30 seconds are not recommended."
case .cmabFetchFailed(let key): message = "Failed to fetch CMAB data for experiment: \(key)."
case .cmabFetchFailed(let key): message = "Failed to fetch CMAB data for experiment \(key)."
case .cmabNotSupportedInSyncMode: message = "CMAB is not supported in sync mode."
}

Expand Down
Loading