Skip to content

Commit dff0160

Browse files
authored
Label prefixing in FT calculator (#804)
1 parent cc5542d commit dff0160

File tree

5 files changed

+98
-27
lines changed

5 files changed

+98
-27
lines changed

src/main/java/io/split/android/client/fallback/FallbackTreatment.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,30 @@
55

66
import java.util.Objects;
77

8-
import io.split.android.grammar.Treatments;
9-
108
/**
119
* Represents the fallback treatment, with an optional config and a fixed label.
1210
*/
1311
public final class FallbackTreatment {
1412

15-
private static final String LABEL_PREFIX = "fallback - ";
16-
17-
/**
18-
* Default fallback representing "control" treatment with no config.
19-
*/
20-
public static final FallbackTreatment CONTROL = new FallbackTreatment(Treatments.CONTROL);
21-
2213
@NonNull
2314
private final String mTreatment;
2415
@Nullable
2516
private final String mConfig;
17+
@Nullable
18+
private final String mLabel;
2619

2720
public FallbackTreatment(@NonNull String treatment) {
2821
this(treatment, null);
2922
}
3023

3124
public FallbackTreatment(@NonNull String treatment, @Nullable String config) {
25+
this(treatment, config, null);
26+
}
27+
28+
FallbackTreatment(@NonNull String treatment, @Nullable String config, @Nullable String label) {
3229
mTreatment = treatment;
3330
mConfig = config;
31+
mLabel = label;
3432
}
3533

3634
public String getTreatment() {
@@ -42,8 +40,13 @@ public String getConfig() {
4240
return mConfig;
4341
}
4442

45-
public String getLabelPrefix() {
46-
return LABEL_PREFIX;
43+
@Nullable
44+
public String getLabel() {
45+
return mLabel;
46+
}
47+
48+
FallbackTreatment copyWithLabel(String label) {
49+
return new FallbackTreatment(mTreatment, mConfig, label);
4750
}
4851

4952
@Override
@@ -52,11 +55,12 @@ public boolean equals(Object o) {
5255
if (o == null || getClass() != o.getClass()) return false;
5356
FallbackTreatment that = (FallbackTreatment) o;
5457
return Objects.equals(mTreatment, that.mTreatment) &&
55-
Objects.equals(mConfig, that.mConfig);
58+
Objects.equals(mConfig, that.mConfig) &&
59+
Objects.equals(mLabel, that.mLabel);
5660
}
5761

5862
@Override
5963
public int hashCode() {
60-
return Objects.hash(mTreatment, mConfig);
64+
return Objects.hash(mTreatment, mConfig, mLabel);
6165
}
6266
}
Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.split.android.client.fallback;
22

33
import androidx.annotation.NonNull;
4+
import androidx.annotation.Nullable;
45

56
/**
67
* Resolves a fallback treatment for a given flag name.
@@ -10,10 +11,19 @@ public interface FallbackTreatmentsCalculator {
1011

1112
/**
1213
* Resolve a fallback for a given flag name.
13-
*
1414
* @param flagName non-null flag name
15-
* @return a fallback treatment if configured, otherwise "control"
15+
* @return a fallback treatment with a null label, if configured; otherwise "control"
1616
*/
1717
@NonNull
1818
FallbackTreatment resolve(@NonNull String flagName);
19+
20+
/**
21+
* Resolve a fallback for a given flag name and label.
22+
*
23+
* @param flagName non-null flag name
24+
* @param label nullable label
25+
* @return a fallback treatment if configured, with a prefixed label if provided; otherwise "control"
26+
*/
27+
@NonNull
28+
FallbackTreatment resolve(@NonNull String flagName, @Nullable String label);
1929
}
Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package io.split.android.client.fallback;
22

33
import androidx.annotation.NonNull;
4+
import androidx.annotation.Nullable;
45

56
import java.util.Map;
67

8+
import io.split.android.grammar.Treatments;
9+
710
public final class FallbackTreatmentsCalculatorImpl implements FallbackTreatmentsCalculator {
811

12+
private static final String LABEL_PREFIX = "fallback - ";
13+
914
@NonNull
1015
private final FallbackConfiguration mConfig;
1116

@@ -16,17 +21,32 @@ public FallbackTreatmentsCalculatorImpl(@NonNull FallbackConfiguration config) {
1621
@NonNull
1722
@Override
1823
public FallbackTreatment resolve(@NonNull String flagName) {
24+
return resolve(flagName, null);
25+
}
26+
27+
@NonNull
28+
@Override
29+
public FallbackTreatment resolve(@NonNull String flagName, @Nullable String label) {
1930
Map<String, FallbackTreatment> byFlag = mConfig.getByFlag();
2031
if (byFlag != null) {
2132
FallbackTreatment flagTreatment = byFlag.get(flagName);
2233
if (flagTreatment != null) {
23-
return flagTreatment;
34+
return flagTreatment.copyWithLabel(resolveLabel(label));
2435
}
2536
}
2637
FallbackTreatment global = mConfig.getGlobal();
2738
if (global != null) {
28-
return global;
39+
return global.copyWithLabel(resolveLabel(label));
2940
}
30-
return FallbackTreatment.CONTROL;
41+
return new FallbackTreatment(Treatments.CONTROL, null, label);
42+
}
43+
44+
@Nullable
45+
private static String resolveLabel(@Nullable String label) {
46+
if (label == null) {
47+
return null;
48+
}
49+
50+
return LABEL_PREFIX + label;
3151
}
3252
}

src/test/java/io/split/android/client/fallback/FallbackTreatmentTest.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,36 @@
88

99
public class FallbackTreatmentTest {
1010

11-
private static final String FALLBACK_TREATMENT = "fallback - ";
12-
1311
@Test
1412
public void constructorSetsFields() {
15-
FallbackTreatment ft = new FallbackTreatment("off", "{\"k\":true}");
13+
FallbackTreatment ft = new FallbackTreatment("off", "{\"k\":true}", "my label");
1614
assertEquals("off", ft.getTreatment());
1715
assertEquals("{\"k\":true}", ft.getConfig());
18-
assertEquals(FALLBACK_TREATMENT, ft.getLabelPrefix());
16+
assertEquals("my label", ft.getLabel());
1917
}
2018

2119
@Test
2220
public void configCanBeNull() {
23-
FallbackTreatment ft = new FallbackTreatment("off", null);
21+
FallbackTreatment ft = new FallbackTreatment("off", null, "my label");
22+
assertEquals("off", ft.getTreatment());
23+
assertNull(ft.getConfig());
24+
assertEquals("my label", ft.getLabel());
25+
}
26+
27+
@Test
28+
public void labelCanBeNull() {
29+
FallbackTreatment ft = new FallbackTreatment("off", null, null);
2430
assertEquals("off", ft.getTreatment());
2531
assertNull(ft.getConfig());
26-
assertEquals(FALLBACK_TREATMENT, ft.getLabelPrefix());
32+
assertNull(ft.getLabel());
2733
}
2834

2935
@Test
30-
public void convenienceConstructorSetsNullConfig() {
36+
public void convenienceConstructorSetsNullConfigAndLabel() {
3137
FallbackTreatment ft = new FallbackTreatment("off");
3238
assertEquals("off", ft.getTreatment());
3339
assertNull(ft.getConfig());
34-
assertEquals(FALLBACK_TREATMENT, ft.getLabelPrefix());
40+
assertNull(ft.getLabel());
3541
}
3642

3743
@Test

src/test/java/io/split/android/client/fallback/FallbackTreatmentsCalculatorTest.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
import static org.junit.Assert.assertEquals;
44
import static org.junit.Assert.assertNotNull;
5+
import static org.junit.Assert.assertNull;
56

67
import org.junit.Test;
78

89
import java.util.Collections;
910
import java.util.HashMap;
1011
import java.util.Map;
1112

13+
import io.split.android.client.TreatmentLabels;
14+
1215
public class FallbackTreatmentsCalculatorTest {
1316

1417
@Test
@@ -72,7 +75,7 @@ public void returnsControlWhenNoFallbackConfigured() {
7275
FallbackTreatment resolved = calculator.resolve("nope");
7376

7477
assertNotNull(resolved);
75-
assertEquals(FallbackTreatment.CONTROL, resolved);
78+
assertEquals(new FallbackTreatment("control", null, null), resolved);
7679
}
7780

7881
@Test
@@ -91,4 +94,32 @@ public void nonexistentFlagFallsBackToGlobal() {
9194
assertNotNull(resolved);
9295
assertEquals(global, resolved);
9396
}
97+
98+
@Test
99+
public void labelIsPrefixed() {
100+
FallbackTreatment global = new FallbackTreatment("off");
101+
FallbackConfiguration config = FallbackConfiguration.builder()
102+
.global(global)
103+
.build();
104+
105+
FallbackTreatmentsCalculator calculator = new FallbackTreatmentsCalculatorImpl(config);
106+
FallbackTreatment resolved = calculator.resolve("flagA", TreatmentLabels.EXCEPTION);
107+
108+
assertNotNull(resolved);
109+
assertEquals("fallback - exception", resolved.getLabel());
110+
}
111+
112+
@Test
113+
public void noLabelReturnsNull() {
114+
FallbackTreatment global = new FallbackTreatment("off");
115+
FallbackConfiguration config = FallbackConfiguration.builder()
116+
.global(global)
117+
.build();
118+
119+
FallbackTreatmentsCalculator calculator = new FallbackTreatmentsCalculatorImpl(config);
120+
FallbackTreatment resolved = calculator.resolve("flagA", null);
121+
122+
assertNotNull(resolved);
123+
assertNull(resolved.getLabel());
124+
}
94125
}

0 commit comments

Comments
 (0)