public void setConfig(Config config) { // check for the config map if (config.getFeatureMap() == null) config.generateFeatureMap(); setSourceType(SourceType.CONFIG); // store source PersistUtils.storeSourceType(getContext(), SourceType.CONFIG); // store config storeConfigInMem(config); PersistUtils.storeConfig(getContext(), config); }
@NonNull private static Config getStandardConfig(String metadata) { List<Rule> rules = new ArrayList<>(); Value value1 = new Value(14, 18, null, null, null, null, null, null); Value value2 = new Value(null, null, null, null, 1453196880000L, null, null, null); rules.add(new Rule(Toggle.DISABLED, metadata, value1)); rules.add(new Rule(Toggle.DISABLED, metadata, value2)); Feature featureVideo = new Feature("video", null, Toggle.ENABLED, featureMetadata, rules); Feature featureAudio = new Feature("audio", Toggle.ENABLED, null, featureMetadata, rules); Feature featureSpeech = new Feature("speech", null, Toggle.DISABLED, featureMetadata, rules); List<Feature> features = new ArrayList<>(); features.add(featureVideo); features.add(featureAudio); features.add(featureSpeech); return new Config("myapp", features); }
public Config(String name, List<Feature> features) { this.name = name; this.features = features; generateFeatureMap(); }
/** * Code for enabling/disabling a feature based on a request ({@link CheckRequest}) and a config ({@link Config}) * * @param config * @param checkRequest * @return */ public CheckResponse processConfig(Config config, CheckRequest checkRequest) { if (config != null && config.getFeatureMap().containsKey(checkRequest.featureName)) { Feature feature = config.getFeatureMap().get(checkRequest.featureName); ResponseDecisionMeta responseDecisionMeta = handleFeature(feature, checkRequest); // if there is a decisive state (either enabled or disabled) initiate the callback and break return new CheckResponse(checkRequest.featureName, responseDecisionMeta.state, responseDecisionMeta.featureMetadata, responseDecisionMeta.ruleMetadata); } // a) feature not found or b) no state could be made based on the config // check if there was no default state in the request, send enabled (default toggle) String state; if (checkRequest.defaultState == null) { state = DEFAULT_STATE; } else { state = checkRequest.defaultState; } return new CheckResponse(checkRequest.featureName, state, null, null, false); }
@Test public void processConfig_featureNotPresent_null_returnsEnabled() { Toggle toggle = new Toggle(context); List<Rule> rules = new ArrayList<>(); Value value = new Value(14, 18, null, null, null, null, null, null); rules.add(new Rule(Toggle.DISABLED, ruleMetadata, value)); Feature featureVideo = new Feature("video", null, null, featureMetadata, rules); Feature featureAudio = new Feature("audio", Toggle.ENABLED, null, featureMetadata, rules); Feature featureSpeech = new Feature("speech", null, Toggle.DISABLED, featureMetadata, rules); List<Feature> features = new ArrayList<>(); features.add(featureVideo); features.add(featureAudio); features.add(featureSpeech); Config config = new Config("myapp", features); // check the feature map assertValidConfig(config); String featureToBeSearched = "share"; String defaultStateInRequest = null; CheckRequest checkRequest = new CheckRequest(toggle, featureToBeSearched, null, defaultStateInRequest, false, null); CheckResponse checkResponse = toggle.processConfig(config, checkRequest); assertThat(checkResponse.featureName).isEqualTo(featureToBeSearched); assertThat(checkResponse.ruleMetadata).isEqualTo(null); assertThat(checkResponse.cached).isFalse(); assertThat(checkResponse.state).isEqualTo(Toggle.DEFAULT_STATE); }
@Override public void onSuccess(Config config) { // calculate the map config.generateFeatureMap(); // store in mem Toggle.storeConfigInMem(config); // call the success method configRetrievedSuccess(config, checkRequest); }
private void assertValidConfig(Config config) { assertThat(config.getFeatureMap()).isNotNull(); assertThat(config.getFeatureMap().get("video")).isNotNull(); assertThat(config.getFeatureMap().get("audio")).isNotNull(); assertThat(config.getFeatureMap().get("speech")).isNotNull(); assertThat(config.getFeatureMap().get("random")).isNull(); }
@Test public void processConfig_featurePresent_apiLevel_matchDisabled_returnsDisabled() { Toggle toggle = new Toggle(context); List<Rule> rules = new ArrayList<>(); Value value = new Value(14, 18, null, null, null, null, null, null); rules.add(new Rule(Toggle.DISABLED, ruleMetadata, value)); Feature featureVideo = new Feature("video", null, Toggle.ENABLED, featureMetadata, rules); Feature featureAudio = new Feature("audio", Toggle.ENABLED, null, featureMetadata, rules); Feature featureSpeech = new Feature("speech", null, Toggle.DISABLED, featureMetadata, rules); List<Feature> features = new ArrayList<>(); features.add(featureVideo); features.add(featureAudio); features.add(featureSpeech); Config config = new Config("myapp", features); // check the feature map assertValidConfig(config); String featureToBeSearched = "video"; String defaultStateInRequest = Toggle.ENABLED; PowerMockito.spy(RuleMatcher.class); Mockito.when(RuleMatcher.getBuildVersion()).thenReturn(16); CheckRequest checkRequest = new CheckRequest(toggle, featureToBeSearched, null, defaultStateInRequest, false, null); CheckResponse checkResponse = toggle.processConfig(config, checkRequest); assertThat(checkResponse.featureName).isEqualTo(featureToBeSearched); assertThat(checkResponse.ruleMetadata).isEqualTo(ruleMetadata); assertThat(checkResponse.cached).isTrue(); assertThat(checkResponse.state).isEqualTo(Toggle.DISABLED); }
@Override protected SetConfigResponse doInBackground(Void... params) { Config config = ConversionUtils.convertStringToConfig(configInString); // generate the map config.generateFeatureMap(); // store in memory Toggle.storeConfigInMem(config); // persist PersistUtils.storeConfig(context, config); return new SetConfigResponse(config); }
@Test public void processConfig_featurePresent_apiLevel_matchEnabled_returnsEnabled() { Toggle toggle = new Toggle(context); List<Rule> rules = new ArrayList<>(); Value value = new Value(14, 18, null, null, null, null, null, null); rules.add(new Rule(Toggle.ENABLED, ruleMetadata, value)); Feature featureVideo = new Feature("video", null, Toggle.DISABLED, featureMetadata, rules); Feature featureAudio = new Feature("audio", Toggle.ENABLED, null, featureMetadata, rules); Feature featureSpeech = new Feature("speech", null, Toggle.DISABLED, featureMetadata, rules); List<Feature> features = new ArrayList<>(); features.add(featureVideo); features.add(featureAudio); features.add(featureSpeech); Config config = new Config("myapp", features); // check the feature map assertValidConfig(config); String featureToBeSearched = "video"; String defaultStateInRequest = Toggle.DISABLED; PowerMockito.spy(RuleMatcher.class); Mockito.when(RuleMatcher.getBuildVersion()).thenReturn(16); CheckRequest checkRequest = new CheckRequest(toggle, featureToBeSearched, null, defaultStateInRequest, false, null); CheckResponse checkResponse = toggle.processConfig(config, checkRequest); assertThat(checkResponse.featureName).isEqualTo(featureToBeSearched); assertThat(checkResponse.ruleMetadata).isEqualTo(ruleMetadata); assertThat(checkResponse.cached).isTrue(); assertThat(checkResponse.state).isEqualTo(Toggle.ENABLED); }
public CheckResponse getAndProcessCachedConfigSync(final CheckRequest checkRequest) { Config config = null; try { config = PersistUtils.getConfigSync(getContext()); } catch (Exception exception) { exception.printStackTrace(); return getExceptionCheckResponse(checkRequest); } // check for null if (config == null) { if (checkRequest.defaultState == null) { throw new IllegalStateException("No configuration found (Config) and no default state configured in the state check"); } return new CheckResponse(checkRequest.featureName, checkRequest.defaultState, null, null, true); } else { // generate the map config.generateFeatureMap(); } // process the config CheckResponse checkResponse = processConfig(config, checkRequest); return checkResponse; }
@Test public void processConfig_featureNotPresent_defaultEnabled_returnsEnabled() { Toggle toggle = new Toggle(context); List<Rule> rules = new ArrayList<>(); Value value = new Value(14, 18, null, null, null, null, null, null); rules.add(new Rule(Toggle.DISABLED, ruleMetadata, value)); Feature featureVideo = new Feature("video", null, null, featureMetadata, rules); Feature featureAudio = new Feature("audio", Toggle.ENABLED, null, featureMetadata, rules); Feature featureSpeech = new Feature("speech", null, Toggle.DISABLED, featureMetadata, rules); List<Feature> features = new ArrayList<>(); features.add(featureVideo); features.add(featureAudio); features.add(featureSpeech); Config config = new Config("myapp", features); // check the feature map assertValidConfig(config); String featureToBeSearched = "share"; String defaultStateInRequest = Toggle.ENABLED; CheckRequest checkRequest = new CheckRequest(toggle, featureToBeSearched, null, defaultStateInRequest, false, null); CheckResponse checkResponse = toggle.processConfig(config, checkRequest); assertThat(checkResponse.featureName).isEqualTo(featureToBeSearched); assertThat(checkResponse.ruleMetadata).isEqualTo(null); assertThat(checkResponse.cached).isFalse(); assertThat(checkResponse.state).isEqualTo(defaultStateInRequest); }
config.generateFeatureMap();
@Test public void processConfig_featurePresent_butNoDefaultOrMatchInConfig_defaultInRequestDisabled_returnsDisabled() { Toggle toggle = new Toggle(context); List<Rule> rules = new ArrayList<>(); Value value = new Value(14, 18, null, null, null, null, null, null); rules.add(new Rule(Toggle.DISABLED, ruleMetadata, value)); Feature featureVideo = new Feature("video", null, null, featureMetadata, rules); Feature featureAudio = new Feature("audio", Toggle.ENABLED, null, featureMetadata, rules); Feature featureSpeech = new Feature("speech", null, Toggle.DISABLED, featureMetadata, rules); List<Feature> features = new ArrayList<>(); features.add(featureVideo); features.add(featureAudio); features.add(featureSpeech); Config config = new Config("myapp", features); // check the feature map assertValidConfig(config); String featureToBeSearched = "video"; String defaultStateInRequest = Toggle.DISABLED; PowerMockito.spy(RuleMatcher.class); Mockito.when(RuleMatcher.getBuildVersion()).thenReturn(20); CheckRequest checkRequest = new CheckRequest(toggle, featureToBeSearched, null, defaultStateInRequest, false, null); CheckResponse checkResponse = toggle.processConfig(config, checkRequest); assertThat(checkResponse.featureName).isEqualTo(featureToBeSearched); assertThat(checkResponse.ruleMetadata).isEqualTo(null); assertThat(checkResponse.cached).isTrue(); assertThat(checkResponse.state).isEqualTo(defaultStateInRequest); }
@Override protected CheckResponse doInBackground(Void... params) { // convert string to config Config config = ConversionUtils.convertStringToConfig(configInString); // generate the map config.generateFeatureMap(); // store config Toggle.storeConfigInMem(config); PersistUtils.storeConfig(checkRequest.toggle.getContext(), config); // process the resultant config CheckResponse result = checkRequest.toggle.processConfig(config, checkRequest); // disable the cache flag since this is a live request result.cached = false; return result; }
@Test public void processConfig_featurePresent_defaultPresentMatchInConfigEnabled_defaultInRequestAbsent_returnsEnabled() { Toggle toggle = new Toggle(context); List<Rule> rules = new ArrayList<>(); Value value = new Value(14, 18, null, null, null, null, null, null); rules.add(new Rule(Toggle.DISABLED, ruleMetadata, value)); Feature featureVideo = new Feature("video", null, Toggle.ENABLED, featureMetadata, rules); Feature featureAudio = new Feature("audio", Toggle.ENABLED, null, featureMetadata, rules); Feature featureSpeech = new Feature("speech", null, Toggle.DISABLED, featureMetadata, rules); List<Feature> features = new ArrayList<>(); features.add(featureVideo); features.add(featureAudio); features.add(featureSpeech); Config config = new Config("myapp", features); // check the feature map assertValidConfig(config); String featureToBeSearched = "video"; String defaultStateInRequest = null; PowerMockito.spy(RuleMatcher.class); Mockito.when(RuleMatcher.getBuildVersion()).thenReturn(20); CheckRequest checkRequest = new CheckRequest(toggle, featureToBeSearched, null, defaultStateInRequest, false, null); CheckResponse checkResponse = toggle.processConfig(config, checkRequest); assertThat(checkResponse.featureName).isEqualTo(featureToBeSearched); assertThat(checkResponse.ruleMetadata).isEqualTo(null); assertThat(checkResponse.cached).isTrue(); assertThat(checkResponse.state).isEqualTo(Toggle.ENABLED); }
public void setConfig(JsonElement configInJson) { setSourceType(SourceType.JSONOBJECT); // store source PersistUtils.storeSourceType(getContext(), SourceType.JSONOBJECT); // convert from json to config Config config = ConversionUtils.convertJSONObjectToConfig(configInJson); // generate the map config.generateFeatureMap(); // store config storeConfigInMem(config); PersistUtils.storeConfig(getContext(), config); }
@Test public void processConfig_featurePresent_defaultPresentInConfigDisabled_defaultInRequestEnabled_returnsEnabled() { Toggle toggle = new Toggle(context); List<Rule> rules = new ArrayList<>(); Value value = new Value(14, 18, null, null, null, null, null, null); rules.add(new Rule(Toggle.DISABLED, ruleMetadata, value)); Feature featureVideo = new Feature("video", null, Toggle.DISABLED, featureMetadata, rules); Feature featureAudio = new Feature("audio", Toggle.ENABLED, null, featureMetadata, rules); Feature featureSpeech = new Feature("speech", null, Toggle.DISABLED, featureMetadata, rules); List<Feature> features = new ArrayList<>(); features.add(featureVideo); features.add(featureAudio); features.add(featureSpeech); Config config = new Config("myapp", features); // check the feature map assertValidConfig(config); String featureToBeSearched = "video"; String defaultStateInRequest = Toggle.ENABLED; PowerMockito.spy(RuleMatcher.class); Mockito.when(RuleMatcher.getBuildVersion()).thenReturn(20); CheckRequest checkRequest = new CheckRequest(toggle, featureToBeSearched, null, defaultStateInRequest, false, null); CheckResponse checkResponse = toggle.processConfig(config, checkRequest); assertThat(checkResponse.featureName).isEqualTo(featureToBeSearched); assertThat(checkResponse.ruleMetadata).isEqualTo(null); assertThat(checkResponse.cached).isTrue(); assertThat(checkResponse.state).isEqualTo(defaultStateInRequest); }
public void setConfig(String configInString) { setSourceType(SourceType.STRING); // store source PersistUtils.storeSourceType(getContext(), SourceType.STRING); // convert from string to config Config config = ConversionUtils.convertStringToConfig(configInString); // generate the map config.generateFeatureMap(); // store config storeConfigInMem(config); PersistUtils.storeConfig(getContext(), config); }
/** * Process config tests */ // set 1: feature not present @Test public void processConfig_featureNotPresent_defaultDisabled_returnsDisabled() { Toggle toggle = new Toggle(context); List<Rule> rules = new ArrayList<>(); Value value = new Value(14, 18, null, null, null, null, null, null); rules.add(new Rule(Toggle.DISABLED, ruleMetadata, value)); Feature featureVideo = new Feature("video", null, null, featureMetadata, rules); Feature featureAudio = new Feature("audio", Toggle.ENABLED, null, featureMetadata, rules); Feature featureSpeech = new Feature("speech", null, Toggle.DISABLED, featureMetadata, rules); List<Feature> features = new ArrayList<>(); features.add(featureVideo); features.add(featureAudio); features.add(featureSpeech); Config config = new Config("myapp", features); // check the feature map assertValidConfig(config); String featureToBeSearched = "share"; String defaultStateInRequest = Toggle.DISABLED; CheckRequest checkRequest = new CheckRequest(toggle, featureToBeSearched, null, defaultStateInRequest, false, null); CheckResponse checkResponse = toggle.processConfig(config, checkRequest); assertThat(checkResponse.featureName).isEqualTo(featureToBeSearched); assertThat(checkResponse.ruleMetadata).isEqualTo(null); assertThat(checkResponse.cached).isFalse(); assertThat(checkResponse.state).isEqualTo(defaultStateInRequest); }