1717
1818package com .tencent .polaris .circuitbreaker .factory .test ;
1919
20+ import com .google .common .cache .Cache ;
2021import com .google .protobuf .util .JsonFormat ;
2122import com .tencent .polaris .api .config .Configuration ;
23+ import com .tencent .polaris .api .plugin .circuitbreaker .CircuitBreaker ;
24+ import com .tencent .polaris .api .plugin .circuitbreaker .ResourceStat ;
25+ import com .tencent .polaris .api .plugin .circuitbreaker .entity .Resource ;
26+ import com .tencent .polaris .api .plugin .circuitbreaker .entity .ServiceResource ;
2227import com .tencent .polaris .api .pojo .Instance ;
2328import com .tencent .polaris .api .pojo .RetStatus ;
2429import com .tencent .polaris .api .pojo .ServiceKey ;
2934import com .tencent .polaris .circuitbreak .api .CircuitBreakAPI ;
3035import com .tencent .polaris .circuitbreak .api .FunctionalDecorator ;
3136import com .tencent .polaris .circuitbreak .api .pojo .FunctionalDecoratorRequest ;
37+ import com .tencent .polaris .circuitbreak .client .api .DefaultCircuitBreakAPI ;
3238import com .tencent .polaris .circuitbreak .client .exception .CallAbortedException ;
3339import com .tencent .polaris .circuitbreak .factory .CircuitBreakAPIFactory ;
3440import com .tencent .polaris .client .util .Utils ;
41+ import com .tencent .polaris .factory .config .ConfigurationImpl ;
3542import com .tencent .polaris .logging .LoggerFactory ;
43+ import com .tencent .polaris .plugins .circuitbreaker .composite .PolarisCircuitBreaker ;
44+ import com .tencent .polaris .plugins .circuitbreaker .composite .ResourceCounters ;
3645import com .tencent .polaris .specification .api .v1 .fault .tolerance .CircuitBreakerProto ;
3746import com .tencent .polaris .test .common .TestUtils ;
3847import com .tencent .polaris .test .mock .discovery .NamingServer ;
3948import com .tencent .polaris .test .mock .discovery .NamingService .InstanceParameter ;
4049import org .junit .After ;
41- import org .junit .Assert ;
4250import org .junit .Before ;
4351import org .junit .Test ;
4452import org .slf4j .Logger ;
4957import java .io .InputStreamReader ;
5058import java .nio .charset .StandardCharsets ;
5159import java .util .List ;
60+ import java .util .Map ;
61+ import java .util .Optional ;
62+ import java .util .concurrent .TimeUnit ;
5263import java .util .function .Consumer ;
5364import java .util .stream .Collectors ;
5465
5566import static com .tencent .polaris .test .common .Consts .NAMESPACE_TEST ;
5667import static com .tencent .polaris .test .common .Consts .SERVICE_CIRCUIT_BREAKER ;
5768import static com .tencent .polaris .test .common .TestUtils .SERVER_ADDRESS_ENV ;
69+ import static org .assertj .core .api .Assertions .assertThat ;
70+ import static org .assertj .core .api .Assertions .assertThatThrownBy ;
71+ import static org .assertj .core .api .Assertions .fail ;
5872
5973/**
6074 * CircuitBreakerTest.java
@@ -76,7 +90,7 @@ public void before() throws IOException {
7690 namingServer = NamingServer .startNamingServer (-1 );
7791 System .setProperty (SERVER_ADDRESS_ENV , String .format ("127.0.0.1:%d" , namingServer .getPort ()));
7892 } catch (IOException e ) {
79- Assert . fail (e .getMessage ());
93+ fail (e .getMessage ());
8094 }
8195 ServiceKey serviceKey = new ServiceKey (NAMESPACE_TEST , SERVICE_CIRCUIT_BREAKER );
8296 InstanceParameter parameter = new InstanceParameter ();
@@ -124,7 +138,7 @@ public void testUpdateServiceCallResult() {
124138 req .setNamespace (NAMESPACE_TEST );
125139 req .setService (SERVICE_CIRCUIT_BREAKER );
126140 List <Instance > instances = assemblyAPI .getReachableInstances (req );
127- Assert . assertEquals ( MAX_COUNT , instances .size ());
141+ assertThat ( instances .size ()). isEqualTo ( MAX_COUNT );
128142 Instance instanceToLimit = instances .get (index );
129143 ServiceCallResult result = instanceToResult (instanceToLimit );
130144 result .setRetCode (-1 );
@@ -158,8 +172,38 @@ public void testFunctionalDecorator() {
158172 throw e ;
159173 }
160174 }
161- Assert . assertThrows ( CallAbortedException . class , () -> integerConsumer .accept (3 ));
175+ assertThatThrownBy ( () -> integerConsumer .accept (3 )). isInstanceOf ( CallAbortedException . class );
162176 }
163177 }
164178
179+ @ Test
180+ public void testCircuitBreakerRuleExpiration () throws InterruptedException {
181+ Configuration configuration = TestUtils .configWithEnvAddress ();
182+ ConfigurationImpl configurationImpl = (ConfigurationImpl ) configuration ;
183+ configurationImpl .getConsumer ().getLocalCache ().setServiceExpireEnable (true );
184+ configurationImpl .getConsumer ().getLocalCache ().setServiceExpireTime (5000 );
185+ configurationImpl .getConsumer ().getCircuitBreaker ().setDefaultRuleEnable (false );
186+ try (CircuitBreakAPI circuitBreakAPI = CircuitBreakAPIFactory .createCircuitBreakAPIByConfig (configurationImpl )) {
187+ Utils .sleepUninterrupted (10000 );
188+ ServiceKey serviceKey = new ServiceKey (NAMESPACE_TEST , SERVICE_CIRCUIT_BREAKER );
189+ Resource svcResource = new ServiceResource (serviceKey );
190+ ResourceStat resourceStat = new ResourceStat (svcResource , 500 , 1000 );
191+ circuitBreakAPI .report (resourceStat );
192+
193+ DefaultCircuitBreakAPI defaultCircuitBreakAPI = (DefaultCircuitBreakAPI ) circuitBreakAPI ;
194+ CircuitBreaker circuitBreaker = defaultCircuitBreakAPI .getSDKContext ().getExtensions ().getResourceBreaker ();
195+ PolarisCircuitBreaker polarisCircuitBreaker = (PolarisCircuitBreaker ) circuitBreaker ;
196+ Map <CircuitBreakerProto .Level , Cache <Resource , Optional <ResourceCounters >>> countersCache = polarisCircuitBreaker .getCountersCache ();
197+ Cache <Resource , Optional <ResourceCounters >> cacheValue = countersCache .get (CircuitBreakerProto .Level .SERVICE );
198+ assertThat (cacheValue .getIfPresent (svcResource )).isNotNull ();
199+
200+ // 熔断规则过期清理熔断器
201+ TimeUnit .MILLISECONDS .sleep (10000 );
202+ assertThat (cacheValue .getIfPresent (svcResource )).isNull ();
203+
204+ // 重新创建熔断器
205+ polarisCircuitBreaker .report (resourceStat );
206+ assertThat (cacheValue .getIfPresent (svcResource )).isNotNull ();
207+ }
208+ }
165209}
0 commit comments