Skip to content

test: add Apollo mock test case #6764

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Aug 28, 2024
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: 2 additions & 0 deletions changes/en-us/2.x.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,11 @@ Add changes here for all PR submitted to the 2.x branch.
- [[#6608](https://github.com/apache/incubator-seata/pull/6608)] add unit test for sql-parser-core
- [[#6647](https://github.com/apache/incubator-seata/pull/6647)] improve the test case coverage of saga module to 70%
- [[#6695](https://github.com/apache/incubator-seata/pull/6695)] old version(< 0.7.1) client test case for multi-version protocol
- [[#6764](https://github.com/apache/incubator-seata/pull/6764)] add Apollo mock test case
- [[#6750](https://github.com/apache/incubator-seata/pull/6750)] increase spring autoconfigure module unit test converage
- [[#6773](https://github.com/apache/incubator-seata/pull/6773)] fix the wrong code coverage from codecov icon in default branch


Thanks to these contributors for their code commits. Please report an unintended omission.

<!-- Please make sure your Github ID is in the list below -->
Expand Down
1 change: 1 addition & 0 deletions changes/zh-cn/2.x.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@
- [[#6608](https://github.com/apache/incubator-seata/pull/6608)] 添加sql-parser-core模块测试用例
- [[#6647](https://github.com/apache/incubator-seata/pull/6647)] 增加saga模块的测试用例覆盖率
- [[#6695](https://github.com/apache/incubator-seata/pull/6695)] 多版本协议的旧版本(< 0.7.1)客户端测试用例
- [[#6764](https://github.com/apache/incubator-seata/pull/6764)] 增加 Apollo Mock 测试用例
- [[#6750](https://github.com/apache/incubator-seata/pull/6750)] 提升spring autoconfigure模块单测覆盖率
- [[#6773](https://github.com/apache/incubator-seata/pull/6773)] 修复codecov图标显示错误的代码覆盖率

Expand Down
10 changes: 10 additions & 0 deletions config/seata-config-apollo/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,16 @@
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>mockwebserver</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.seata.config.apollo;

import java.io.IOException;

import org.apache.seata.common.exception.NotSupportYetException;
import org.apache.seata.config.ConfigurationChangeEvent;
import org.apache.seata.config.ConfigurationChangeListener;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

/**
* The type Apollo configuration test.
*/
public class ApolloConfigurationTest {

private static final int PORT = 8081;
private static ApolloMockServer apolloMockServer;

private static ApolloConfiguration apolloConfiguration;

/**
* Sets up.
*
* @throws IOException the io exception
*/
@BeforeAll
public static void setUp() throws IOException {
System.setProperty("seataEnv", "test");
apolloMockServer = new ApolloMockServer(PORT);
apolloConfiguration = ApolloConfiguration.getInstance();
}

/**
* Test get config.
*/
@Test
public void testGetConfig() {
String value = apolloConfiguration.getConfig("seata.test");
Assertions.assertEquals("mockdata", value);
value = apolloConfiguration.getConfig("seata.key");
Assertions.assertNull(value);
value = apolloConfiguration.getConfig("seata.key.1", "default");
Assertions.assertEquals("default", value);
value = apolloConfiguration.getLatestConfig("seata.key.2", "default", 3000);
Assertions.assertEquals("default", value);
}

/**
* Test update config.
*/
@Test
public void testUpdateConfig() {
Assertions.assertThrows(NotSupportYetException.class, () -> {
apolloConfiguration.putConfig("seata.test", "mockdata");
});
Assertions.assertThrows(NotSupportYetException.class, () -> {
apolloConfiguration.putConfigIfAbsent("seata.test", "mockdata");
});
Assertions.assertThrows(NotSupportYetException.class, () -> {
apolloConfiguration.removeConfig("seata.test");
});
}

/**
* Test listener.
*/
@Test
public void testListener() {
ConfigurationChangeListener listener = new ConfigurationChangeListener() {
@Override
public void onChangeEvent(ConfigurationChangeEvent event) {

}
};
apolloConfiguration.addConfigListener("seata.test", listener);
Assertions.assertEquals(1, apolloConfiguration.getConfigListeners("seata.test").size());
apolloConfiguration.removeConfigListener("seata.test", null);
Assertions.assertEquals(1, apolloConfiguration.getConfigListeners("seata.test").size());
apolloConfiguration.removeConfigListener("seata.test", listener);
Assertions.assertEquals(0, apolloConfiguration.getConfigListeners("seata.test").size());

}

/**
* Tear down.
*
* @throws IOException the io exception
*/
@AfterAll
public static void tearDown() throws IOException {
System.clearProperty("seataEnv");
apolloMockServer.stop();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.seata.config.apollo;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import com.ctrip.framework.apollo.core.dto.ApolloConfig;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.mockwebserver.Dispatcher;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
import okhttp3.mockwebserver.RecordedRequest;

/**
* The type Apollo mock server.
*/
public class ApolloMockServer {

private MockWebServer server;
private final ObjectMapper mapper = new ObjectMapper();

private final String CONFIG_PREFIX_PATH = "/configs";

/**
* Instantiates a new Apollo mock server.
*
* @param port the port
* @throws IOException the io exception
*/
public ApolloMockServer(int port) throws IOException {

server = new MockWebServer();
server.setDispatcher(new Dispatcher() {
@Override
public MockResponse dispatch(RecordedRequest request) throws InterruptedException {
if (request.getPath().startsWith(CONFIG_PREFIX_PATH)) {
List<String> pathSegments = request.getRequestUrl().pathSegments();
String appId = pathSegments.get(1);
String cluster = pathSegments.get(2);
String namespace = pathSegments.get(3);
String result;
try {
result = loadMockData(appId, cluster, namespace);
return new MockResponse().setResponseCode(200).setBody(result);
} catch (JsonProcessingException e) {
}
}
return new MockResponse().setResponseCode(404);
}
});
server.start(port);
System.setProperty("apollo.configService", "http://localhost:" + port);

}

private String loadMockData(String appId, String Cluster, String namespace) throws JsonProcessingException {
String fileName = "mock-" + namespace + ".properties";
ApolloConfig apolloConfig = new ApolloConfig(appId, Cluster, namespace, "releaseKey");
Properties properties = new Properties();
try (InputStream input = this.getClass().getClassLoader().getResourceAsStream(fileName)) {
if (null != input) {
properties.load(input);
}
} catch (Exception ignore) {
}
Map<String, String> configurations = new HashMap<>();
for (Map.Entry<Object, Object> entry : properties.entrySet()) {
configurations.put(entry.getKey().toString(), entry.getValue().toString());
}
apolloConfig.setConfigurations(configurations);
String json = mapper.writeValueAsString(apolloConfig);
return json;

}

/**
* Stop.
*
* @throws IOException the io exception
*/
public void stop() throws IOException {
if (null != server) {
server.shutdown();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
org.apache.seata.config.apollo.ApolloConfigurationProvider
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
seata.test=mockdata
84 changes: 84 additions & 0 deletions config/seata-config-apollo/src/test/resources/registry-test.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa、custom
type = "file"

nacos {
application = "seata-server"
serverAddr = "127.0.0.1:8848"
group = "SEATA_GROUP"
namespace = ""
username = ""
password = ""
contextPath = "/foo"
##if use MSE Nacos with auth, mutex with username/password attribute
#accessKey = ""
#secretKey = ""
##if use Nacos naming meta-data for SLB service registry, specify nacos address pattern rules here
#slbPattern = ""
}
eureka {
serviceUrl = "http://localhost:8761/eureka"
weight = "1"
}
redis {
serverAddr = "localhost:6379"
db = "0"
password = ""
timeout = "0"
}
zk {
serverAddr = "127.0.0.1:2181"
sessionTimeout = 6000
connectTimeout = 2000
username = ""
password = ""
}
consul {
serverAddr = "127.0.0.1:8500"
aclToken = ""
}
etcd3 {
serverAddr = "http://localhost:2379"
}
sofa {
serverAddr = "127.0.0.1:9603"
region = "DEFAULT_ZONE"
datacenter = "DefaultDataCenter"
group = "SEATA_GROUP"
addressWaitTime = "3000"
}
file {
name = "file.conf"
}
custom {
name = ""
}
}

config {
# file、nacos 、apollo、zk、consul、etcd3、springCloudConfig、custom
type = "apollo"

apollo {
appId = "seata-server"
apolloMeta = "http://localhost:8801"
namespace = "application"
}
}
1 change: 1 addition & 0 deletions dependencies/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@
<assertj-core.version>3.12.2</assertj-core.version>
<jetty-version>9.4.38.v20210224</jetty-version>
<janino-version>3.1.7</janino-version>
<mockwebserver-version>4.12.0</mockwebserver-version>
<native-lib-loader.version>2.4.0</native-lib-loader.version>
</properties>

Expand Down
Loading