Skip to content

Commit e9dbda8

Browse files
committed
feat:support config empty protection.
1 parent d4ed5dd commit e9dbda8

File tree

4 files changed

+195
-5
lines changed

4 files changed

+195
-5
lines changed

polaris-configuration/polaris-configuration-client/src/main/java/com/tencent/polaris/configuration/client/internal/RemoteConfigFileRepo.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package com.tencent.polaris.configuration.client.internal;
1919

20+
import com.tencent.polaris.annonation.JustForTest;
2021
import com.tencent.polaris.api.control.Destroyable;
2122
import com.tencent.polaris.api.exception.ServerCodes;
2223
import com.tencent.polaris.api.plugin.configuration.ConfigFile;
@@ -343,7 +344,8 @@ private void submitEmptyProtectionExpireTask(Runnable runnable) {
343344
}
344345
}
345346

346-
private String getIdentifier() {
347+
@JustForTest
348+
String getIdentifier() {
347349
return configFileMetadata.getNamespace() + "."
348350
+ configFileMetadata.getFileGroup() + "."
349351
+ configFileMetadata.getFileName();

polaris-configuration/polaris-configuration-client/src/test/java/com/tencent/polaris/configuration/client/internal/RemoteConfigFileRepoTest.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import java.util.concurrent.TimeUnit;
4141
import java.util.concurrent.atomic.AtomicInteger;
4242

43+
import static org.assertj.core.api.Assertions.assertThat;
4344
import static org.mockito.ArgumentMatchers.any;
4445
import static org.mockito.Mockito.*;
4546

@@ -233,4 +234,61 @@ public void testNotifyAndPullSecondTime() throws InterruptedException {
233234
Assert.assertEquals(newContent, remoteConfigFileRepo.getContent());
234235
Assert.assertEquals(newVersion, remoteConfigFileRepo.getConfigFileVersion());
235236
}
237+
238+
@Test
239+
public void testGetIdentifierWithNormalValues() {
240+
// 准备
241+
ConfigFileMetadata configFileMetadata = new DefaultConfigFileMetadata("testNamespace", "testGroup", "testFile");
242+
RemoteConfigFileRepo remoteConfigFileRepo =
243+
new RemoteConfigFileRepo(sdkContext, configFileLongPollingService, configFileFilterChain, configFileConnector,
244+
configFileMetadata, configFilePersistHandler);
245+
// 验证
246+
assertThat(remoteConfigFileRepo.getIdentifier()).isEqualTo("testNamespace.testGroup.testFile");
247+
}
248+
249+
@Test
250+
public void testGetIdentifierWithEmptyValues() {
251+
// 准备
252+
ConfigFileMetadata configFileMetadata = new DefaultConfigFileMetadata("", "", "");
253+
RemoteConfigFileRepo remoteConfigFileRepo =
254+
new RemoteConfigFileRepo(sdkContext, configFileLongPollingService, configFileFilterChain, configFileConnector,
255+
configFileMetadata, configFilePersistHandler);
256+
// 验证
257+
assertThat(remoteConfigFileRepo.getIdentifier()).isEqualTo("..");
258+
}
259+
260+
@Test
261+
public void testGetIdentifierWithSpecialCharacters() {
262+
// 准备
263+
ConfigFileMetadata configFileMetadata = new DefaultConfigFileMetadata("test@namespace", "test-group", "test_file.properties");
264+
RemoteConfigFileRepo remoteConfigFileRepo =
265+
new RemoteConfigFileRepo(sdkContext, configFileLongPollingService, configFileFilterChain, configFileConnector,
266+
configFileMetadata, configFilePersistHandler);
267+
// 验证
268+
assertThat(remoteConfigFileRepo.getIdentifier()).isEqualTo("[email protected]_file.properties");
269+
}
270+
271+
@Test
272+
public void testGetIdentifierWithNullValues() {
273+
// 准备
274+
ConfigFileMetadata configFileMetadata = new DefaultConfigFileMetadata(null, null, null);
275+
RemoteConfigFileRepo remoteConfigFileRepo =
276+
new RemoteConfigFileRepo(sdkContext, configFileLongPollingService, configFileFilterChain, configFileConnector,
277+
configFileMetadata, configFilePersistHandler);
278+
279+
// 验证
280+
assertThat(remoteConfigFileRepo.getIdentifier()).isEqualTo("null.null.null");
281+
}
282+
283+
@Test
284+
public void testGetIdentifierWithMixedValues() {
285+
// 准备
286+
ConfigFileMetadata configFileMetadata = new DefaultConfigFileMetadata("prod", "", "application.yaml");
287+
RemoteConfigFileRepo remoteConfigFileRepo =
288+
new RemoteConfigFileRepo(sdkContext, configFileLongPollingService, configFileFilterChain, configFileConnector,
289+
configFileMetadata, configFilePersistHandler);
290+
291+
// 验证
292+
assertThat(remoteConfigFileRepo.getIdentifier()).isEqualTo("prod..application.yaml");
293+
}
236294
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/*
2+
* Tencent is pleased to support the open source community by making polaris-java available.
3+
*
4+
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
5+
*
6+
* Licensed under the BSD 3-Clause License (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* https://opensource.org/licenses/BSD-3-Clause
11+
*
12+
* Unless required by applicable law or agreed to in writing, software distributed
13+
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
14+
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
15+
* specific language governing permissions and limitations under the License.
16+
*/
17+
18+
package com.tencent.polaris.configuration.client.util;
19+
20+
import com.tencent.polaris.api.exception.ServerCodes;
21+
import com.tencent.polaris.api.plugin.configuration.ConfigFile;
22+
import com.tencent.polaris.api.plugin.configuration.ConfigFileResponse;
23+
import org.junit.Test;
24+
25+
import static org.assertj.core.api.Assertions.assertThat;
26+
27+
/**
28+
* Tests for {@link ConfigFileUtils}.
29+
*
30+
* @author Haotian Zhang
31+
*/
32+
public class ConfigFileUtilsTest {
33+
34+
@Test
35+
public void testCheckConfigContentEmpty_WhenResponseIsNull() {
36+
// 准备:设置输入为null
37+
ConfigFileResponse response = null;
38+
39+
// 执行:调用待测方法
40+
boolean result = ConfigFileUtils.checkConfigContentEmpty(response);
41+
42+
// 验证:预期返回true
43+
assertThat(result).isTrue();
44+
}
45+
46+
@Test
47+
public void testCheckConfigContentEmpty_WhenResponseCodeIsNotFound() {
48+
// 准备:创建响应对象,设置响应码为NOT_FOUND_RESOURCE
49+
ConfigFileResponse response = new ConfigFileResponse(ServerCodes.NOT_FOUND_RESOURCE, "not found", null);
50+
51+
// 执行:调用待测方法
52+
boolean result = ConfigFileUtils.checkConfigContentEmpty(response);
53+
54+
// 验证:预期返回true
55+
assertThat(result).isTrue();
56+
}
57+
58+
@Test
59+
public void testCheckConfigContentEmpty_WhenConfigFileIsNull() {
60+
// 准备:创建响应对象,不设置configFile
61+
ConfigFileResponse response = new ConfigFileResponse(ServerCodes.EXECUTE_SUCCESS, "success", null);
62+
63+
// 执行:调用待测方法
64+
boolean result = ConfigFileUtils.checkConfigContentEmpty(response);
65+
66+
// 验证:预期返回true
67+
assertThat(result).isTrue();
68+
}
69+
70+
@Test
71+
public void testCheckConfigContentEmpty_WhenContentIsEmpty() {
72+
// 准备:创建完整的响应对象,但内容为空
73+
ConfigFile configFile = new ConfigFile("namespace", "group", "name");
74+
configFile.setContent("");
75+
76+
ConfigFileResponse response = new ConfigFileResponse(ServerCodes.EXECUTE_SUCCESS, "success", configFile);
77+
78+
// 执行:调用待测方法
79+
boolean result = ConfigFileUtils.checkConfigContentEmpty(response);
80+
81+
// 验证:预期返回true
82+
assertThat(result).isTrue();
83+
}
84+
85+
@Test
86+
public void testCheckConfigContentEmpty_WhenContentIsBlank() {
87+
// 准备:创建完整的响应对象,但内容为空白字符
88+
ConfigFile configFile = new ConfigFile("namespace", "group", "name");
89+
configFile.setContent(" ");
90+
91+
ConfigFileResponse response = new ConfigFileResponse(ServerCodes.EXECUTE_SUCCESS, "success", configFile);
92+
93+
// 执行:调用待测方法
94+
boolean result = ConfigFileUtils.checkConfigContentEmpty(response);
95+
96+
// 验证:预期返回true
97+
assertThat(result).isTrue();
98+
}
99+
100+
@Test
101+
public void testCheckConfigContentEmpty_WhenContentIsValid() {
102+
// 准备:创建完整的响应对象,且有有效内容
103+
ConfigFile configFile = new ConfigFile("namespace", "group", "name");
104+
configFile.setContent("valid content");
105+
106+
ConfigFileResponse response = new ConfigFileResponse(ServerCodes.EXECUTE_SUCCESS, "success", configFile);
107+
108+
// 执行:调用待测方法
109+
boolean result = ConfigFileUtils.checkConfigContentEmpty(response);
110+
111+
// 验证:预期返回false
112+
assertThat(result).isFalse();
113+
}
114+
115+
@Test
116+
public void testCheckConfigContentEmpty_WhenResponseCodeIsSuccessButContentIsNull() {
117+
// 准备:创建响应对象,设置成功响应码但内容为null
118+
ConfigFile configFile = new ConfigFile("namespace", "group", "name");
119+
configFile.setContent(null);
120+
121+
ConfigFileResponse response = new ConfigFileResponse(ServerCodes.EXECUTE_SUCCESS, "success", configFile);
122+
123+
// 执行:调用待测方法
124+
boolean result = ConfigFileUtils.checkConfigContentEmpty(response);
125+
126+
// 验证:预期返回true
127+
assertThat(result).isTrue();
128+
}
129+
}

polaris-ratelimit/polaris-ratelimit-factory/src/test/java/com/tencent/polaris/ratelimit/test/core/MultiRuleTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,15 @@
4040
import com.tencent.polaris.specification.api.v1.traffic.manage.RateLimitProto.Rule.Type;
4141
import com.tencent.polaris.test.common.TestUtils;
4242
import com.tencent.polaris.test.mock.discovery.NamingServer;
43-
import java.io.IOException;
44-
import java.util.HashSet;
45-
import java.util.Set;
4643
import org.junit.After;
4744
import org.junit.Assert;
4845
import org.junit.Before;
4946
import org.junit.Test;
5047

48+
import java.io.IOException;
49+
import java.util.HashSet;
50+
import java.util.Set;
51+
5152
public class MultiRuleTest {
5253

5354
private static final int PORT = 10092;
@@ -152,7 +153,7 @@ public void testGetQuotaLayer2() {
152153
// first query header
153154
boolean hasLimited = false;
154155
boolean hasPassed = false;
155-
for (int i = 0; i < 16; i++) {
156+
for (int i = 0; i < 18; i++) {
156157
QuotaResponse quotaResponse = quotaAcquire(limitAPI, Consts.METHOD_PAY, Consts.HEADER_VALUE);
157158
QuotaResultCode code = quotaResponse.getCode();
158159
if (code == QuotaResultCode.QuotaResultLimited) {

0 commit comments

Comments
 (0)