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
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<groupId>com.github.switcherapi</groupId>
<artifactId>switcher-client</artifactId>
<packaging>jar</packaging>
<version>2.0.7</version>
<version>2.1.0-SNAPSHOT</version>

<name>Switcher Client</name>
<description>Switcher Client SDK for working with Switcher API</description>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ public abstract class SwitcherBuilder {
protected boolean remote;

protected boolean bypassMetrics;

protected String defaultResult;

protected List<Entry> entry;

Expand Down Expand Up @@ -58,6 +60,17 @@ public SwitcherBuilder remote(boolean remote) {
this.remote = remote;
return this;
}

/**
* Set the default result when client panics
*
* @param defaultResult true/false
* @return {@link SwitcherBuilder}
*/
public SwitcherBuilder defaultResult(boolean defaultResult) {
this.defaultResult = String.valueOf(defaultResult);
return this;
}

/**
* Add a validation to the entry stack
Expand Down Expand Up @@ -219,4 +232,8 @@ public SwitcherBuilder bypassMetrics() {
public boolean isRemote() {
return remote;
}

public String getDefaultResult() {
return defaultResult;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ public CriteriaResponse buildFromSwitcher(Switcher switcher) {
return this;
}

public static CriteriaResponse buildFromDefault(Switcher switcher) {
return new CriteriaResponse(true, "Default result", switcher);
}

public boolean isItOn() {
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@

import com.github.switcherapi.client.SwitcherContextBase;
import com.github.switcherapi.client.SwitcherExecutor;
import com.github.switcherapi.client.exception.SwitcherContextException;
import com.github.switcherapi.client.exception.SwitcherException;
import com.github.switcherapi.client.exception.SwitcherSnapshotLoadException;
import com.github.switcherapi.client.exception.SwitchersValidationException;
import com.github.switcherapi.client.exception.*;
import com.github.switcherapi.client.model.ContextKey;
import com.github.switcherapi.client.model.Switcher;
import com.github.switcherapi.client.model.criteria.Domain;
Expand Down Expand Up @@ -71,12 +68,20 @@ public CriteriaResponse executeCriteria(final Switcher switcher) {
SwitcherUtils.debug(logger, "switcher: {}", switcher);

CriteriaResponse response;
if (switcher.isRemote()) {
response = this.clientRemote.executeCriteria(switcher);
SwitcherUtils.debug(logger, "[Remote] response: {}", response);
} else {
response = this.clientLocalService.executeCriteria(switcher, this.domain);
SwitcherUtils.debug(logger, "[Local] response: {}", response);
try {
if (switcher.isRemote()) {
response = this.clientRemote.executeCriteria(switcher);
SwitcherUtils.debug(logger, "[Remote] response: {}", response);
} else {
response = this.clientLocalService.executeCriteria(switcher, this.domain);
SwitcherUtils.debug(logger, "[Local] response: {}", response);
}
} catch (SwitcherKeyNotFoundException e) {
if (StringUtils.isNotBlank(switcher.getDefaultResult())) {
return CriteriaResponse.buildFromDefault(switcher);
}

throw e;
}

return response;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,27 @@ public CriteriaResponse executeCriteria(final Switcher switcher) {
return response;
} catch (final SwitcherRemoteException e) {
logger.error("Failed to execute criteria - {}\nCause: {}", e.getMessage(), e.getCause());
return executeSilentCriteria(switcher, e);
return tryExecuteLocalCriteria(switcher, e);
}
}

private CriteriaResponse executeSilentCriteria(final Switcher switcher,
final SwitcherRemoteException e) {
private CriteriaResponse tryExecuteLocalCriteria(final Switcher switcher,
final SwitcherRemoteException e) {
if (StringUtils.isNotBlank(SwitcherContextBase.contextStr(ContextKey.SILENT_MODE))) {
CriteriaResponse response = this.switcherLocal.executeCriteria(switcher);
final CriteriaResponse response = this.switcherLocal.executeCriteria(switcher);
SwitcherUtils.debug(logger, "[Silent] response: {}", response);

return response;
} else {
throw e;
}

if (StringUtils.isNotBlank(switcher.getDefaultResult())) {
final CriteriaResponse response = CriteriaResponse.buildFromDefault(switcher);
SwitcherUtils.debug(logger, "[Default] response: {}", response);

return response;
}

throw e;
}

@Override
Expand Down
12 changes: 12 additions & 0 deletions src/test/java/com/github/switcherapi/client/SwitcherFail1Test.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,18 @@ void shouldReturnError_keyNotFound() {
Switcher switcher = Switchers.getSwitcher(Switchers.REMOTE_KEY);
assertThrows(SwitcherRemoteException.class, switcher::isItOn);
}

@Test
void shouldReturnSuccessDefaultResult_keyNotFound() {
//auth
givenResponse(generateMockAuth(10));

//criteria
givenResponse(generateStatusResponse("404"));

Switcher switcher = Switchers.getSwitcher(Switchers.REMOTE_KEY);
assertTrue(switcher.defaultResult(true).isItOn());
}

@Test
void shouldReturnError_unauthorizedAPIAccess() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package com.github.switcherapi.client;

import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

import java.nio.file.Paths;
import java.util.Set;
import java.util.stream.Stream;
Expand All @@ -27,6 +23,8 @@
import com.github.switcherapi.client.model.Switcher;
import com.github.switcherapi.client.service.local.SwitcherLocalService;

import static org.junit.jupiter.api.Assertions.*;

class SwitcherLocal3Test {

private static final String SNAPSHOTS_LOCAL = Paths.get(StringUtils.EMPTY).toAbsolutePath() + "/src/test/resources/snapshot";
Expand Down Expand Up @@ -101,4 +99,10 @@ void localShouldCheckSwitchers_notFound() {
ex.getMessage());
}

@Test
void localShouldReturnTrue_defaultResult() {
Switcher switcher = Switchers.getSwitcher(Switchers.NOT_FOUND_KEY);
assertTrue(switcher.defaultResult(true).isItOn());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ protected MockResponse generateCheckSnapshotVersionResponse(String status) {
*/
protected MockResponse generateStatusResponse(String code) {
MockResponse.Builder builder = new MockResponse.Builder();
builder.status(code);
builder.setCode(Integer.parseInt(code));
return builder.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ public static void test() {
.url("https://api.switcherapi.com")
.apiKey("JDJiJDA4JEFweTZjSTR2bE9pUjNJOUYvRy9raC4vRS80Q2tzUnk1d3o1aXFmS2o5eWJmVW11cjR0ODNT")
.domain("Playground")
.local(true)
.snapshotLocation("src/test/resources/snapshot/playground")
.component("switcher-playground"));

initializeClient();
Expand Down
34 changes: 34 additions & 0 deletions src/test/resources/snapshot/playground/default.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"data": {
"domain": {
"name": "Playground",
"version": 0,
"description": "My playground",
"activated": true,
"group": [
{
"name": "Experimental",
"description": "Open feature flags for experimentation",
"activated": true,
"config": [
{
"key": "MY_SWITCHER",
"description": "My first switcher",
"activated": true,
"strategies": [
{
"strategy": "VALUE_VALIDATION",
"operation": "EXIST",
"activated": false,
"values": [
"user_1"
]
}
]
}
]
}
]
}
}
}