mirror of
https://github.com/signalapp/Signal-Server
synced 2026-04-22 01:30:24 +01:00
Use GetLatestConfiguration in config manager
Use StartConfigurationSession/GetLatestConfiguration instead of GetConfiguration since the latter has been deprecated
This commit is contained in:
committed by
ravi-signal
parent
f5a75c6319
commit
d3cd1d1b15
@@ -6,37 +6,127 @@ import static org.mockito.Mockito.when;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.junit.jupiter.api.Timeout;
|
||||
import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration;
|
||||
import software.amazon.awssdk.core.SdkBytes;
|
||||
import software.amazon.awssdk.services.appconfig.AppConfigClient;
|
||||
import software.amazon.awssdk.services.appconfig.model.GetConfigurationRequest;
|
||||
import software.amazon.awssdk.services.appconfig.model.GetConfigurationResponse;
|
||||
import software.amazon.awssdk.services.appconfigdata.AppConfigDataClient;
|
||||
import software.amazon.awssdk.services.appconfigdata.model.GetLatestConfigurationRequest;
|
||||
import software.amazon.awssdk.services.appconfigdata.model.GetLatestConfigurationResponse;
|
||||
import software.amazon.awssdk.services.appconfigdata.model.StartConfigurationSessionRequest;
|
||||
import software.amazon.awssdk.services.appconfigdata.model.StartConfigurationSessionResponse;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
class DynamicConfigurationManagerTest {
|
||||
|
||||
private DynamicConfigurationManager<DynamicConfiguration> dynamicConfigurationManager;
|
||||
private AppConfigClient appConfig;
|
||||
private AppConfigDataClient appConfig;
|
||||
private StartConfigurationSessionRequest startConfigurationSession;
|
||||
|
||||
@BeforeEach
|
||||
void setup() {
|
||||
this.appConfig = mock(AppConfigClient.class);
|
||||
this.dynamicConfigurationManager = new DynamicConfigurationManager<>(appConfig, "foo", "bar", "baz", "poof", DynamicConfiguration.class);
|
||||
this.appConfig = mock(AppConfigDataClient.class);
|
||||
this.dynamicConfigurationManager = new DynamicConfigurationManager<>(
|
||||
appConfig, "foo", "bar", "baz", DynamicConfiguration.class);
|
||||
this.startConfigurationSession = StartConfigurationSessionRequest.builder()
|
||||
.applicationIdentifier("foo")
|
||||
.environmentIdentifier("bar")
|
||||
.configurationProfileIdentifier("baz")
|
||||
.build();
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetConfig() {
|
||||
ArgumentCaptor<GetConfigurationRequest> captor = ArgumentCaptor.forClass(GetConfigurationRequest.class);
|
||||
when(appConfig.getConfiguration(captor.capture())).thenReturn(
|
||||
GetConfigurationResponse.builder().content(SdkBytes.fromByteArray("test: true".getBytes())).configurationVersion("1").build());
|
||||
void testGetInitalConfig() {
|
||||
when(appConfig.startConfigurationSession(startConfigurationSession))
|
||||
.thenReturn(StartConfigurationSessionResponse.builder()
|
||||
.initialConfigurationToken("initial")
|
||||
.build());
|
||||
|
||||
// call with initial token will return a real config
|
||||
when(appConfig.getLatestConfiguration(GetLatestConfigurationRequest.builder()
|
||||
.configurationToken("initial").build()))
|
||||
.thenReturn(GetLatestConfigurationResponse.builder()
|
||||
.configuration(SdkBytes.fromUtf8String("test: true"))
|
||||
.nextPollConfigurationToken("next").build());
|
||||
|
||||
// subsequent config calls will return empty (no update)
|
||||
when(appConfig.getLatestConfiguration(GetLatestConfigurationRequest.builder().
|
||||
configurationToken("next").build()))
|
||||
.thenReturn(GetLatestConfigurationResponse.builder()
|
||||
.configuration(SdkBytes.fromUtf8String(""))
|
||||
.nextPollConfigurationToken("next").build());
|
||||
|
||||
dynamicConfigurationManager.start();
|
||||
|
||||
assertThat(captor.getValue().application()).isEqualTo("foo");
|
||||
assertThat(captor.getValue().environment()).isEqualTo("bar");
|
||||
assertThat(captor.getValue().configuration()).isEqualTo("baz");
|
||||
assertThat(captor.getValue().clientId()).isEqualTo("poof");
|
||||
|
||||
assertThat(dynamicConfigurationManager.getConfiguration()).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void testBadConfig() {
|
||||
when(appConfig.startConfigurationSession(startConfigurationSession))
|
||||
.thenReturn(StartConfigurationSessionResponse.builder()
|
||||
.initialConfigurationToken("initial")
|
||||
.build());
|
||||
|
||||
// call with initial token will return a bad config
|
||||
when(appConfig.getLatestConfiguration(GetLatestConfigurationRequest.builder()
|
||||
.configurationToken("initial").build()))
|
||||
.thenReturn(GetLatestConfigurationResponse.builder()
|
||||
.configuration(SdkBytes.fromUtf8String("zzz"))
|
||||
.nextPollConfigurationToken("goodconfig").build());
|
||||
|
||||
// next config call will return a good config
|
||||
when(appConfig.getLatestConfiguration(GetLatestConfigurationRequest.builder().
|
||||
configurationToken("goodconfig").build()))
|
||||
.thenReturn(GetLatestConfigurationResponse.builder()
|
||||
.configuration(SdkBytes.fromUtf8String("test: true"))
|
||||
.nextPollConfigurationToken("next").build());
|
||||
|
||||
// all subsequent config calls will return an empty config (no update)
|
||||
when(appConfig.getLatestConfiguration(GetLatestConfigurationRequest.builder().
|
||||
configurationToken("next").build()))
|
||||
.thenReturn(GetLatestConfigurationResponse.builder()
|
||||
.configuration(SdkBytes.fromUtf8String(""))
|
||||
.nextPollConfigurationToken("next").build());
|
||||
dynamicConfigurationManager.start();
|
||||
assertThat(dynamicConfigurationManager.getConfiguration()).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Timeout(value=5, unit= TimeUnit.SECONDS)
|
||||
void testGetConfigMultiple() throws InterruptedException {
|
||||
when(appConfig.startConfigurationSession(startConfigurationSession))
|
||||
.thenReturn(StartConfigurationSessionResponse.builder()
|
||||
.initialConfigurationToken("0")
|
||||
.build());
|
||||
|
||||
// initial config
|
||||
when(appConfig.getLatestConfiguration(GetLatestConfigurationRequest.builder().
|
||||
configurationToken("0").build()))
|
||||
.thenReturn(GetLatestConfigurationResponse.builder()
|
||||
.configuration(SdkBytes.fromUtf8String("test: true"))
|
||||
.nextPollConfigurationToken("1").build());
|
||||
|
||||
// config update with a real config
|
||||
when(appConfig.getLatestConfiguration(GetLatestConfigurationRequest.builder().
|
||||
configurationToken("1").build()))
|
||||
.thenReturn(GetLatestConfigurationResponse.builder()
|
||||
.configuration(SdkBytes.fromUtf8String("""
|
||||
featureFlags:
|
||||
- testFlag
|
||||
"""))
|
||||
.nextPollConfigurationToken("2").build());
|
||||
|
||||
// all subsequent are no update
|
||||
when(appConfig.getLatestConfiguration(GetLatestConfigurationRequest.builder().
|
||||
configurationToken("2").build()))
|
||||
.thenReturn(GetLatestConfigurationResponse.builder()
|
||||
.configuration(SdkBytes.fromUtf8String(""))
|
||||
.nextPollConfigurationToken("2").build());
|
||||
|
||||
// we should eventually get the updated config (or the test will timeout)
|
||||
dynamicConfigurationManager.start();
|
||||
while (dynamicConfigurationManager.getConfiguration().getActiveFeatureFlags().isEmpty()) {
|
||||
Thread.sleep(100);
|
||||
}
|
||||
assertThat(dynamicConfigurationManager.getConfiguration().getActiveFeatureFlags()).containsExactly("testFlag");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user