From cb2b92f942389f58555dfe33d1b88e5f2454f848 Mon Sep 17 00:00:00 2001 From: Namya LG <53875297+Namyalg@users.noreply.github.com> Date: Mon, 10 Feb 2025 22:40:52 +0530 Subject: [PATCH] fix: equality comparison for semantic version when number of segments = max allowed segments (#2794) * fix: equality comparison for semantic version comparison when number of segments = max allowed segments * minor refactor * Update condition-evaluator-internal.ts * chore:update UT --- src/remote-config/condition-evaluator-internal.ts | 10 ++++++---- test/unit/remote-config/condition-evaluator.spec.ts | 5 +++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/remote-config/condition-evaluator-internal.ts b/src/remote-config/condition-evaluator-internal.ts index c0fc0484a8..b49b35dc8d 100644 --- a/src/remote-config/condition-evaluator-internal.ts +++ b/src/remote-config/condition-evaluator-internal.ts @@ -302,14 +302,15 @@ function compareSemanticVersions( const version1 = String(actualValue).split('.').map(Number); const version2 = targetValue.split('.').map(Number); + if (version1.length > MAX_LENGTH || version2.length > MAX_LENGTH) { + return false; + } + for (let i = 0; i < MAX_LENGTH; i++) { // Check to see if segments are present. Note that these may be present and be NaN. const version1HasSegment = version1[i] !== undefined; const version2HasSegment = version2[i] !== undefined; - // If both are undefined, we've consumed everything and they're equal. - if (!version1HasSegment && !version2HasSegment) return predicateFn(0) - // Insert zeros if undefined for easier comparison. if (!version1HasSegment) version1[i] = 0; if (!version2HasSegment) version2[i] = 0; @@ -321,5 +322,6 @@ function compareSemanticVersions( if (version1[i] < version2[i]) return predicateFn(-1); if (version1[i] > version2[i]) return predicateFn(1); } - return false; + // If this point is reached, the semantic versions are equal. + return predicateFn(0); } diff --git a/test/unit/remote-config/condition-evaluator.spec.ts b/test/unit/remote-config/condition-evaluator.spec.ts index 8bfa168df6..7368457fcf 100644 --- a/test/unit/remote-config/condition-evaluator.spec.ts +++ b/test/unit/remote-config/condition-evaluator.spec.ts @@ -1114,6 +1114,7 @@ describe('ConditionEvaluator', () => { { targets: ['5.12.3'], actual: '5.11.9', outcome: true }, { targets: ['5.12.3'], actual: '5.12.3', outcome: true }, { targets: ['5.12.3'], actual: '5.12.9', outcome: false }, + { targets: ['5.6.7.8.9'], actual: '5.6.7.8.9', outcome: true }, invalidNumericSignalTestCase, ]; @@ -1127,6 +1128,9 @@ describe('ConditionEvaluator', () => { { targets: ['5.0'], actual: 5.0, outcome: true }, { targets: ['5.12.3'], actual: '5.12.9', outcome: false }, { targets: ['5.12.3'], actual: '5.12.3.0.0.0.0', outcome: false }, + { targets: ['5.6.7.8.9'], actual: '5.6.7.8.9', outcome: true }, + { targets: ['5.6.7.8.9'], actual: '4.5.6.7.8', outcome: false }, + { targets: ['5.6.7.8.9.0'], actual: '5.6.7.8.9.0', outcome: false }, invalidNumericSignalTestCase, ]; @@ -1166,6 +1170,7 @@ describe('ConditionEvaluator', () => { { targets: ['5'], actual: 5.0, outcome: true }, { targets: ['5.0'], actual: 5.0, outcome: true }, { targets: ['5.12.3'], actual: '5.11.9', outcome: false }, + { targets: ['5.6.7.8.9'], actual: '5.6.7.8.9', outcome: true }, invalidNumericSignalTestCase ];