This is an automated email from the ASF dual-hosted git repository.
xiaoyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new aaad59f27 [type:test] zookeeper client test. (#3988)
aaad59f27 is described below
commit aaad59f27baac5619c5b81b4b6617b5cd776ca23
Author: yunlongn <[email protected]>
AuthorDate: Sat Sep 24 14:34:30 2022 +0800
[type:test] zookeeper client test. (#3988)
* [type:test] zookeeper client test .
* [type:test] zookeeper client test.
* [type:test] zookeeper client test.
* [type:test] zookeeper client test.
---
.../server/zookeeper/ZookeeperClientTest.java | 218 +++++------
.../ZookeeperServerRegisterRepositoryTest.java | 152 ++++----
.../ZookeeperClientRegisterRepositoryTest.java | 126 +++---
.../client/zookeeper/ZookeeperClientTest.java | 244 +++++-------
.../instance/zookeeper/ZookeeperClientTest.java | 187 +++++----
.../ZookeeperInstanceRegisterRepositoryTest.java | 71 ++--
.../sync/data/zookeeper/ZookeeperClientTest.java | 235 ++++++------
.../zookeeper/ZookeeperSyncDataServiceTest.java | 422 ++++-----------------
8 files changed, 649 insertions(+), 1006 deletions(-)
diff --git
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientTest.java
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientTest.java
index de56445b1..61647ce93 100644
---
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientTest.java
+++
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientTest.java
@@ -18,52 +18,81 @@
package org.apache.shenyu.register.client.server.zookeeper;
import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.api.ACLBackgroundPathAndBytesable;
+import org.apache.curator.framework.api.BackgroundVersionable;
+import org.apache.curator.framework.api.ChildrenDeletable;
+import org.apache.curator.framework.api.CreateBuilder;
+import org.apache.curator.framework.api.CreateBuilder2;
+import org.apache.curator.framework.api.DeleteBuilder;
+import org.apache.curator.framework.api.GetChildrenBuilder;
+import org.apache.curator.framework.api.GetDataBuilder;
+import
org.apache.curator.framework.api.ProtectACLCreateModeStatPathAndBytesable;
+import org.apache.curator.framework.imps.ExistsBuilderImpl;
import org.apache.curator.framework.recipes.cache.TreeCache;
-import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
-import org.apache.curator.test.TestingServer;
-import org.apache.shenyu.common.dto.MetaData;
import org.apache.shenyu.common.exception.ShenyuException;
-import org.apache.shenyu.common.utils.GsonUtils;
import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.data.Stat;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
-import java.io.IOException;
import java.lang.reflect.Field;
+import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.when;
class ZookeeperClientTest {
private ZookeeperClient client;
- private TestingServer server;
+ private CuratorFramework curatorFramework;
@BeforeEach
- public void setup() throws Exception {
- this.server = new TestingServer();
- ZookeeperConfig config = new
ZookeeperConfig(server.getConnectString());
- config.setNamespace("namespace");
- config.setDigest("digest");
- client = new ZookeeperClient(config);
- client.start();
+ public void setup() {
+ curatorFramework = mock(CuratorFramework.class);
+ try (MockedStatic<CuratorFrameworkFactory>
frameworkFactoryMockedStatic = mockStatic(CuratorFrameworkFactory.class)) {
+ CuratorFrameworkFactory.Builder builder =
mock(CuratorFrameworkFactory.Builder.class);
+
frameworkFactoryMockedStatic.when(CuratorFrameworkFactory::builder).thenReturn(builder);
+ when(builder.connectString(anyString())).thenReturn(builder);
+ when(builder.retryPolicy(any())).thenReturn(builder);
+ when(builder.connectionTimeoutMs(anyInt())).thenReturn(builder);
+ when(builder.sessionTimeoutMs(anyInt())).thenReturn(builder);
+ when(builder.namespace(anyString())).thenReturn(builder);
+ when(builder.build()).thenReturn(curatorFramework);
+ ZookeeperConfig config = new ZookeeperConfig("services");
+ config.setNamespace("namespace");
+ config.setDigest("digest");
+ client = new ZookeeperClient(config);
+ client.start();
+
doThrow(InterruptedException.class).when(curatorFramework).blockUntilConnected();
+ assertDoesNotThrow(() -> client.start());
+ } catch (Exception e) {
+ throw new ShenyuException(e);
+ }
}
@AfterEach
- public void cleanup() throws IOException {
+ public void cleanup() {
client.close();
- this.server.close();
}
@Test
@@ -73,116 +102,91 @@ class ZookeeperClientTest {
}
@Test
- void isExist() {
+ void isExist() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.isExist("/test"));
+ ExistsBuilderImpl existsBuilder = mock(ExistsBuilderImpl.class);
+ when(curatorFramework.checkExists()).thenReturn(existsBuilder);
+ when(existsBuilder.forPath(anyString())).thenReturn(new Stat());
boolean exist = client.isExist("/test");
- assertFalse(exist);
-
- client.createOrUpdate("/test", "", CreateMode.PERSISTENT);
- exist = client.isExist("/test");
assertTrue(exist);
}
@Test
- void errorTest() throws NoSuchFieldException, InterruptedException,
IllegalAccessException {
- final Field curatorFramework =
ZookeeperClient.class.getDeclaredField("client");
- final CuratorFramework curatorFrameworkMock =
mock(CuratorFramework.class);
- curatorFramework.setAccessible(true);
- curatorFramework.set(client, curatorFrameworkMock);
-
doThrow(InterruptedException.class).when(curatorFrameworkMock).blockUntilConnected();
- Assertions.assertDoesNotThrow(() -> client.start());
-
-
doThrow(ShenyuException.class).when(curatorFrameworkMock).checkExists();
- Assertions.assertThrows(ShenyuException.class, () ->
client.isExist("key"));
-
- doThrow(ShenyuException.class).when(curatorFrameworkMock).getData();
- Assertions.assertThrows(ShenyuException.class, () ->
client.getDirectly("key"));
-
- doThrow(ShenyuException.class).when(curatorFrameworkMock).create();
- Assertions.assertThrows(ShenyuException.class, () ->
client.createOrUpdate("key", "value", CreateMode.PERSISTENT));
-
- doThrow(ShenyuException.class).when(curatorFrameworkMock).delete();
- Assertions.assertThrows(ShenyuException.class, () ->
client.delete("key"));
-
-
doThrow(ShenyuException.class).when(curatorFrameworkMock).getChildren();
- Assertions.assertThrows(ShenyuException.class, () ->
client.getChildren("key"));
- }
-
- @Test
- void getDirectly() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+ void getDirectly() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.getDirectly("/test"));
+ GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+ when(curatorFramework.getData()).thenReturn(getDataBuilder);
+
when(getDataBuilder.forPath(anyString())).thenReturn("hello".getBytes());
String val = client.getDirectly("/test");
assertEquals("hello", val);
+ when(getDataBuilder.forPath(anyString())).thenReturn(null);
+ String val2 = client.getDirectly("/test");
+ assertNull(val2);
}
@Test
- void get() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals("hello", val);
- }
-
- @Test
- void createOrUpdate() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals("hello", val);
- }
-
- @Test
- void testCreateOrUpdate() {
- MetaData data = new MetaData();
- data.setAppName("test");
- client.createOrUpdate("/test", data, CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals(GsonUtils.getInstance().toJson(data), val);
+ void delete() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.delete("/test"));
+ DeleteBuilder deleteBuilder = mock(DeleteBuilder.class);
+ when(curatorFramework.delete()).thenReturn(deleteBuilder);
+ ChildrenDeletable childrenDeletable = mock(ChildrenDeletable.class);
+ when(deleteBuilder.guaranteed()).thenReturn(childrenDeletable);
+ BackgroundVersionable backgroundVersionable =
mock(BackgroundVersionable.class);
+
when(childrenDeletable.deletingChildrenIfNeeded()).thenReturn(backgroundVersionable);
+ doNothing().when(backgroundVersionable).forPath(anyString());
+ assertDoesNotThrow(() -> client.delete("/test"));
}
@Test
- void delete() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals("hello", val);
-
- client.delete("/test");
- boolean exist = client.isExist("/test");
- assertFalse(exist);
- }
-
- @Test
- void getChildren() {
- client.createOrUpdate("/test/1", "hello", CreateMode.PERSISTENT);
- client.createOrUpdate("/test/2", "hello", CreateMode.PERSISTENT);
-
+ void getChildren() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.getChildren("/test"));
+ GetChildrenBuilder getChildrenBuilder = mock(GetChildrenBuilder.class);
+ when(curatorFramework.getChildren()).thenReturn(getChildrenBuilder);
+ when(getChildrenBuilder.forPath(anyString())).thenReturn(new
ArrayList<>());
List<String> children = client.getChildren("/test");
- assertTrue(children.contains("1"));
- assertTrue(children.contains("2"));
- assertEquals(2, children.size());
+ assertEquals(0, children.size());
}
@Test
- void getCache() {
- TreeCache cache = client.getCache("/test");
- assertNull(cache);
-
- client.addCache("/test");
- cache = client.getCache("/test");
- assertNotNull(cache);
+ void createOrUpdate() throws Exception {
+ assertThrows(ShenyuException.class, () ->
+ client.createOrUpdate("/test", "hello",
CreateMode.PERSISTENT));
+ CreateBuilder createBuilder = mock(CreateBuilder.class);
+ when(curatorFramework.create()).thenReturn(createBuilder);
+ CreateBuilder2 createBuilder2 = mock(CreateBuilder2.class);
+ when(createBuilder.orSetData()).thenReturn(createBuilder2);
+ ProtectACLCreateModeStatPathAndBytesable
protectACLCreateModeStatPathAndBytesable =
mock(ProtectACLCreateModeStatPathAndBytesable.class);
+
when(createBuilder2.creatingParentsIfNeeded()).thenReturn(protectACLCreateModeStatPathAndBytesable);
+ ACLBackgroundPathAndBytesable pathAndBytesable =
mock(ACLBackgroundPathAndBytesable.class);
+
when(protectACLCreateModeStatPathAndBytesable.withMode(any())).thenReturn(pathAndBytesable);
+ when(pathAndBytesable.forPath(anyString(),
any(byte[].class))).thenReturn(null);
+ client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+ client.createOrUpdate("", "hello", CreateMode.PERSISTENT);
+ client.createOrUpdate("", (Object) null, CreateMode.PERSISTENT);
+ client.createOrUpdate("", new Object(), CreateMode.PERSISTENT);
}
@Test
- void addCache() throws InterruptedException {
- List<String> paths = new ArrayList<>();
- TreeCacheListener listener = (client, event) -> {
- if (event.getType() == TreeCacheEvent.Type.NODE_ADDED ||
event.getType() == TreeCacheEvent.Type.NODE_UPDATED) {
- paths.add(event.getData().getPath());
- }
- };
- client.createOrUpdate("/test", "", CreateMode.PERSISTENT);
- client.addCache("/test", listener);
- TreeCache cache = client.getCache("/test");
-
- Thread.sleep(500);
- assertNotNull(cache);
- assertEquals("/test", paths.get(0));
+ void cacheTest() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.addCache("/path",
mock(TreeCacheListener.class), mock(TreeCacheListener.class)));
+ Field clientField = ZookeeperClient.class.getDeclaredField("client");
+ clientField.setAccessible(true);
+ CuratorFramework curatorFramework = mock(CuratorFramework.class);
+ clientField.set(client, curatorFramework);
+
+ GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+ when(curatorFramework.getData()).thenReturn(getDataBuilder);
+
when(getDataBuilder.forPath(any())).thenReturn("path".getBytes(StandardCharsets.UTF_8));
+ client.get("/path");
+ client.get("/test");
+ client.getCache("/test");
+ MockedStatic<TreeCache> treeCacheMockedStatic =
mockStatic(TreeCache.class);
+ TreeCache.Builder treeCacheBuilder = mock(TreeCache.Builder.class);
+ treeCacheMockedStatic.when(() -> TreeCache.newBuilder(any(),
any())).thenReturn(treeCacheBuilder);
+ TreeCache treeCache = mock(TreeCache.class);
+ when(treeCacheBuilder.build()).thenReturn(treeCache);
+ when(treeCache.start()).thenThrow(ShenyuException.class);
+ Assertions.assertThrows(ShenyuException.class, () ->
client.addCache("/path"));
+ treeCacheMockedStatic.close();
}
}
diff --git
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
index 800554ac3..204bb9555 100644
---
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
+++
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
@@ -17,105 +17,91 @@
package org.apache.shenyu.register.client.server.zookeeper;
-import org.apache.curator.test.TestingServer;
-import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.listen.Listenable;
+import org.apache.curator.framework.recipes.cache.ChildData;
+import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
+import org.apache.curator.framework.recipes.cache.TreeCacheListener;
+import org.apache.shenyu.common.exception.ShenyuException;
import
org.apache.shenyu.register.client.server.api.ShenyuClientServerRegisterPublisher;
import org.apache.shenyu.register.common.config.ShenyuRegisterCenterConfig;
-import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
-import org.apache.shenyu.register.common.dto.URIRegisterDTO;
-import org.apache.shenyu.register.common.type.DataTypeParent;
-import org.apache.zookeeper.CreateMode;
-import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedConstruction;
+import org.springframework.util.ObjectUtils;
-import java.lang.reflect.Field;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Properties;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doNothing;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.mockConstruction;
+import static org.mockito.Mockito.when;
/**
* Test for Zookeeper register center.
*/
public class ZookeeperServerRegisterRepositoryTest {
-
- private ZookeeperClientServerRegisterRepository repository;
-
- private ShenyuClientServerRegisterPublisher publisher;
-
- private ZookeeperClient client;
-
- @BeforeEach
- public void setUp() throws Exception {
- this.publisher = mockPublish();
-
- TestingServer server = new TestingServer();
- ShenyuRegisterCenterConfig config = new ShenyuRegisterCenterConfig();
- config.setServerLists(server.getConnectString());
- this.repository = new ZookeeperClientServerRegisterRepository();
- this.repository.init(publisher, config);
-
- Class<? extends ZookeeperClientServerRegisterRepository> clazz =
this.repository.getClass();
-
- String fieldString = "client";
- Field field = clazz.getDeclaredField(fieldString);
- field.setAccessible(true);
- this.client = (ZookeeperClient) field.get(repository);
- }
-
- private ShenyuClientServerRegisterPublisher mockPublish() {
- ShenyuClientServerRegisterPublisher publisher =
mock(ShenyuClientServerRegisterPublisher.class);
- doNothing().when(publisher).publish(localAny());
- return publisher;
- }
@Test
- public void testSubscribeMetaData() throws InterruptedException {
- MetaDataRegisterDTO data = MetaDataRegisterDTO.builder()
- .rpcType("http")
- .host("host")
- .port(80)
- .contextPath("/context")
- .ruleName("ruleName")
- .build();
- String metadataPath =
"/shenyu/register/metadata/http/context/context-ruleName";
- client.createOrUpdate(metadataPath,
GsonUtils.getInstance().toJson(data), CreateMode.PERSISTENT);
-
- // wait 1ms for listener being invoked.
- Thread.sleep(1000);
-
- verify(publisher, times(1)).publish(localAny());
- repository.close();
+ public void testZookeeperInstanceRegisterRepository() {
+ final Listenable listenable = mock(Listenable.class);
+ final List<TreeCacheListener> treeCacheListeners = new ArrayList<>();
+ final CuratorFramework curatorFramework = mock(CuratorFramework.class);
+ try (MockedConstruction<ZookeeperClient> construction =
mockConstruction(ZookeeperClient.class, (mock, context) -> {
+ when(mock.getClient()).thenReturn(curatorFramework);
+
when(curatorFramework.getConnectionStateListenable()).thenReturn(listenable);
+ doAnswer(invocationOnMock -> {
+ treeCacheListeners.add(invocationOnMock.getArgument(1));
+ return null;
+ }).when(mock).addCache(any(), any());
+ List<String> childrenList = new ArrayList<>(1);
+ childrenList.add("");
+ when(mock.getChildren(anyString())).thenReturn(childrenList);
+ when(mock.get(anyString())).thenReturn("{}");
+ })) {
+ final ZookeeperClientServerRegisterRepository repository = new
ZookeeperClientServerRegisterRepository();
+ ShenyuRegisterCenterConfig config = new
ShenyuRegisterCenterConfig();
+ final ShenyuClientServerRegisterPublisher
shenyuClientServerRegisterPublisher =
mock(ShenyuClientServerRegisterPublisher.class);
+ repository.init(shenyuClientServerRegisterPublisher, config);
+
+ List<TreeCacheEvent> treeCacheEvent = new ArrayList<>();
+ // register uri
+
treeCacheEvent.add(treeCacheEvent("/shenyu/register/uri/test/test/test"));
+ // register metadata
+
treeCacheEvent.add(treeCacheEvent("/shenyu/register/metadata/test/test/test"));
+
+ for (TreeCacheListener treeCacheListener : treeCacheListeners) {
+ for (TreeCacheEvent event : treeCacheEvent) {
+ treeCacheListener.childEvent(curatorFramework, event);
+ }
+ }
+ final TreeCacheListener treeCacheListener =
treeCacheListeners.stream().findFirst().orElse(null);
+ if (!ObjectUtils.isEmpty(treeCacheListener)) {
+ TreeCacheEvent event = mock(TreeCacheEvent.class);
+ ChildData childData = mock(ChildData.class);
+ treeCacheListener.childEvent(curatorFramework, event);
+ when(event.getData()).thenReturn(childData);
+ when(childData.getPath()).thenReturn("");
+ treeCacheListener.childEvent(curatorFramework, event);
+ }
+ final Properties configProps = config.getProps();
+ configProps.setProperty("digest", "digest");
+ repository.init(shenyuClientServerRegisterPublisher, config);
+ repository.close();
+ } catch (Exception e) {
+ throw new ShenyuException(e);
+ }
}
-
- @Test
- public void testSubscribeURI() throws Exception {
- URIRegisterDTO data = URIRegisterDTO.builder()
- .rpcType("http")
- .host("host")
- .port(80)
- .appName("/context")
- .build();
- String uriPath = "/shenyu/register/uri/http/context/host:80";
- client.createOrUpdate(uriPath, GsonUtils.getInstance().toJson(data),
CreateMode.EPHEMERAL);
-
- // wait 1ms for listener being invoked.
- Thread.sleep(1000);
-
- verify(publisher, times(1)).publish(localAny());
- client.delete(uriPath);
-
- // wait 1ms for listener being invoked.
- Thread.sleep(1000);
-
- verify(publisher, times(2)).publish(localAny());
- }
-
- private List<DataTypeParent> localAny() {
- return any();
+ private static TreeCacheEvent treeCacheEvent(final String path) {
+ TreeCacheEvent treeCacheEvent = mock(TreeCacheEvent.class);
+ ChildData childData = mock(ChildData.class);
+ when(treeCacheEvent.getData()).thenReturn(childData);
+ when(childData.getPath()).thenReturn(path);
+ when(childData.getData()).thenReturn("{}".getBytes());
+ return treeCacheEvent;
}
}
diff --git
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientRegisterRepositoryTest.java
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientRegisterRepositoryTest.java
index 973d38528..dce4b2d5f 100644
---
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientRegisterRepositoryTest.java
+++
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientRegisterRepositoryTest.java
@@ -17,104 +17,68 @@
package org.apache.shenyu.register.client.zookeeper;
-import org.apache.curator.test.TestingServer;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.listen.Listenable;
+import org.apache.curator.framework.state.ConnectionState;
+import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.shenyu.common.enums.RpcTypeEnum;
-import org.apache.shenyu.common.utils.GsonUtils;
import org.apache.shenyu.register.common.config.ShenyuRegisterCenterConfig;
import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
import org.apache.shenyu.register.common.dto.URIRegisterDTO;
-import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedConstruction;
-import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Properties;
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockConstruction;
+import static org.mockito.Mockito.when;
/**
* Test for Zookeeper client register repository.
*/
public class ZookeeperClientRegisterRepositoryTest {
- private ZookeeperClientRegisterRepository repository;
-
- private ZookeeperClient client;
-
- @BeforeEach
- public void setUp() throws Exception {
- TestingServer server = new TestingServer();
- this.repository = new ZookeeperClientRegisterRepository();
- ShenyuRegisterCenterConfig config = new ShenyuRegisterCenterConfig();
- config.setServerLists(server.getConnectString());
- this.repository.init(config);
-
- Class<? extends ZookeeperClientRegisterRepository> clazz =
this.repository.getClass();
-
- String fieldString = "client";
- Field field = clazz.getDeclaredField(fieldString);
- field.setAccessible(true);
- this.client = (ZookeeperClient) field.get(repository);
- }
-
@Test
- public void initTest() throws Exception {
- TestingServer server = new TestingServer();
- ShenyuRegisterCenterConfig config = new ShenyuRegisterCenterConfig();
- config.setServerLists(server.getConnectString());
- this.repository = new ZookeeperClientRegisterRepository(config);
- Properties configProps = config.getProps();
- configProps.setProperty("digest", "digest");
- this.repository.init(config);
- }
+ public void testZookeeperInstanceRegisterRepository() {
+ final Listenable listenable = mock(Listenable.class);
+ try (MockedConstruction<ZookeeperClient> construction =
mockConstruction(ZookeeperClient.class, (mock, context) -> {
+ final CuratorFramework curatorFramework =
mock(CuratorFramework.class);
+ when(mock.getClient()).thenReturn(curatorFramework);
+
when(curatorFramework.getConnectionStateListenable()).thenReturn(listenable);
+ })) {
+ ShenyuRegisterCenterConfig config = new
ShenyuRegisterCenterConfig();
+ final ZookeeperClientRegisterRepository repository = new
ZookeeperClientRegisterRepository(config);
+ final Properties configProps = config.getProps();
+ configProps.setProperty("digest", "digest");
+ List<ConnectionStateListener> connectionStateListeners = new
ArrayList<>();
+ doAnswer(invocationOnMock -> {
+ connectionStateListeners.add(invocationOnMock.getArgument(0));
+ return null;
+ }).when(listenable).addListener(any());
+ repository.init(config);
- @Test
- public void testPersistInterface() {
- MetaDataRegisterDTO data = MetaDataRegisterDTO.builder()
- .rpcType("http")
- .host("host")
- .port(80)
- .contextPath("/context")
- .ruleName("ruleName")
- .build();
- repository.persistInterface(data);
- String metadataPath =
"/shenyu/register/metadata/http/context/context-ruleName";
- String value = client.get(metadataPath);
- assertEquals(value, GsonUtils.getInstance().toJson(data));
- repository.close();
- }
+
repository.persistInterface(MetaDataRegisterDTO.builder().appName("mockServer").contextPath("/mock")
+
.ruleName("/rule").host("127.0.0.1").rpcType(RpcTypeEnum.HTTP.getName()).build());
- @Test
- public void testPersistUri() {
- URIRegisterDTO data = URIRegisterDTO.builder()
- .rpcType("http")
- .host("host")
- .port(80)
- .appName("/context")
- .build();
- repository.persistURI(data);
- String uriPath = "/shenyu/register/uri/http/context/host:80";
- String value = client.get(uriPath);
- assertEquals(value, GsonUtils.getInstance().toJson(data));
- repository.close();
- }
+
repository.persistInterface(MetaDataRegisterDTO.builder().appName("mockServer").contextPath("/mock")
+
.ruleName("/rule").host("127.0.0.1").rpcType(RpcTypeEnum.SPRING_CLOUD.getName()).build());
- @Test
- public void testPersistInterfaceDoAnswerWriteData4Grpc() {
- final MetaDataRegisterDTO data = MetaDataRegisterDTO.builder()
- .rpcType(RpcTypeEnum.GRPC.getName())
- .host("host")
- .port(80)
- .contextPath("/context")
- .ruleName("ruleName")
- .serviceName("testService")
- .methodName("testMethod")
- .build();
- repository.persistInterface(data);
- // hit `metadataSet.contains(realNode)`
- repository.persistInterface(data);
- String metadataPath =
"/shenyu/register/metadata/grpc/context/testService.testMethod";
- String value = client.get(metadataPath);
- assertEquals(value, GsonUtils.getInstance().toJson(data));
- repository.close();
+
repository.persistInterface(MetaDataRegisterDTO.builder().appName("mockServer").contextPath("/mock")
+
.ruleName("/rule").host("127.0.0.1").rpcType(RpcTypeEnum.TARS.getName()).build());
+
+
repository.persistURI(URIRegisterDTO.builder().protocol("http://").appName("test1")
+
.rpcType(RpcTypeEnum.HTTP.getName()).host("localhost").port(8091).build());
+ connectionStateListeners.forEach(connectionStateListener -> {
+ connectionStateListener.stateChanged(null,
ConnectionState.RECONNECTED);
+ });
+ Assertions.assertDoesNotThrow(() -> new
ZookeeperClientRegisterRepository());
+ repository.close();
+ }
}
}
diff --git
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientTest.java
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientTest.java
index 8a42bf479..c3a3d8804 100644
---
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientTest.java
+++
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-zookeeper/src/test/java/org/apache/shenyu/register/client/zookeeper/ZookeeperClientTest.java
@@ -18,34 +18,43 @@
package org.apache.shenyu.register.client.zookeeper;
import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.api.ACLBackgroundPathAndBytesable;
+import org.apache.curator.framework.api.BackgroundVersionable;
+import org.apache.curator.framework.api.ChildrenDeletable;
+import org.apache.curator.framework.api.CreateBuilder;
+import org.apache.curator.framework.api.CreateBuilder2;
+import org.apache.curator.framework.api.DeleteBuilder;
+import org.apache.curator.framework.api.GetChildrenBuilder;
import org.apache.curator.framework.api.GetDataBuilder;
-import org.apache.curator.framework.recipes.cache.ChildData;
+import
org.apache.curator.framework.api.ProtectACLCreateModeStatPathAndBytesable;
+import org.apache.curator.framework.imps.ExistsBuilderImpl;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
-import org.apache.curator.test.TestingServer;
-import org.apache.shenyu.common.dto.MetaData;
import org.apache.shenyu.common.exception.ShenyuException;
-import org.apache.shenyu.common.utils.GsonUtils;
import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.data.Stat;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
-import java.io.IOException;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockStatic;
@@ -55,24 +64,35 @@ class ZookeeperClientTest {
private ZookeeperClient client;
- private TestingServer server;
+ private CuratorFramework curatorFramework;
@BeforeEach
- public void setup() throws Exception {
- this.server = new TestingServer();
- ZookeeperConfig config = new
ZookeeperConfig(server.getConnectString());
- client = new ZookeeperClient(config);
- client.start();
+ public void setup() {
+ curatorFramework = mock(CuratorFramework.class);
+ try (MockedStatic<CuratorFrameworkFactory>
frameworkFactoryMockedStatic = mockStatic(CuratorFrameworkFactory.class)) {
+ CuratorFrameworkFactory.Builder builder =
mock(CuratorFrameworkFactory.Builder.class);
+
frameworkFactoryMockedStatic.when(CuratorFrameworkFactory::builder).thenReturn(builder);
+ when(builder.connectString(anyString())).thenReturn(builder);
+ when(builder.retryPolicy(any())).thenReturn(builder);
+ when(builder.connectionTimeoutMs(anyInt())).thenReturn(builder);
+ when(builder.sessionTimeoutMs(anyInt())).thenReturn(builder);
+ when(builder.namespace(anyString())).thenReturn(builder);
+ when(builder.build()).thenReturn(curatorFramework);
+ ZookeeperConfig config = new ZookeeperConfig("services");
+ config.setNamespace("namespace");
+ config.setDigest("digest");
+ client = new ZookeeperClient(config);
+ client.start();
+
doThrow(InterruptedException.class).when(curatorFramework).blockUntilConnected();
+ assertDoesNotThrow(() -> client.start());
+ } catch (Exception e) {
+ throw new ShenyuException(e);
+ }
}
@AfterEach
- public void cleanup() throws IOException {
- if (this.client != null) {
- this.client.close();
- }
- if (this.server != null) {
- this.server.close();
- }
+ public void cleanup() {
+ client.close();
}
@Test
@@ -82,128 +102,73 @@ class ZookeeperClientTest {
}
@Test
- void zookeeperClientTest() {
- ZookeeperConfig config = new
ZookeeperConfig(server.getConnectString());
- config.setDigest("digest");
- config.setNamespace("namespace");
- client = new ZookeeperClient(config);
-
- }
-
- @Test
- void isExist() {
+ void isExist() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.isExist("/test"));
+ ExistsBuilderImpl existsBuilder = mock(ExistsBuilderImpl.class);
+ when(curatorFramework.checkExists()).thenReturn(existsBuilder);
+ when(existsBuilder.forPath(anyString())).thenReturn(new Stat());
boolean exist = client.isExist("/test");
- assertFalse(exist);
-
- client.createOrUpdate("/test", "", CreateMode.PERSISTENT);
- exist = client.isExist("/test");
assertTrue(exist);
}
@Test
- void getDirectly() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+ void getDirectly() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.getDirectly("/test"));
+ GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+ when(curatorFramework.getData()).thenReturn(getDataBuilder);
+
when(getDataBuilder.forPath(anyString())).thenReturn("hello".getBytes());
String val = client.getDirectly("/test");
assertEquals("hello", val);
+ when(getDataBuilder.forPath(anyString())).thenReturn(null);
+ String val2 = client.getDirectly("/test");
+ assertNull(val2);
}
@Test
- void get() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals("hello", val);
- }
-
- @Test
- void createOrUpdate() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals("hello", val);
+ void delete() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.delete("/test"));
+ DeleteBuilder deleteBuilder = mock(DeleteBuilder.class);
+ when(curatorFramework.delete()).thenReturn(deleteBuilder);
+ ChildrenDeletable childrenDeletable = mock(ChildrenDeletable.class);
+ when(deleteBuilder.guaranteed()).thenReturn(childrenDeletable);
+ BackgroundVersionable backgroundVersionable =
mock(BackgroundVersionable.class);
+
when(childrenDeletable.deletingChildrenIfNeeded()).thenReturn(backgroundVersionable);
+ doNothing().when(backgroundVersionable).forPath(anyString());
+ assertDoesNotThrow(() -> client.delete("/test"));
}
@Test
- void testCreateOrUpdate() {
- MetaData data = new MetaData();
- data.setAppName("test");
- client.createOrUpdate("/test", data, CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals(GsonUtils.getInstance().toJson(data), val);
- }
-
- @Test
- void delete() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals("hello", val);
-
- client.delete("/test");
- boolean exist = client.isExist("/test");
- assertFalse(exist);
- }
-
- @Test
- void getChildren() {
- client.createOrUpdate("/test/1", "hello", CreateMode.PERSISTENT);
- client.createOrUpdate("/test/2", "hello", CreateMode.PERSISTENT);
-
+ void getChildren() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.getChildren("/test"));
+ GetChildrenBuilder getChildrenBuilder = mock(GetChildrenBuilder.class);
+ when(curatorFramework.getChildren()).thenReturn(getChildrenBuilder);
+ when(getChildrenBuilder.forPath(anyString())).thenReturn(new
ArrayList<>());
List<String> children = client.getChildren("/test");
- assertTrue(children.contains("1"));
- assertTrue(children.contains("2"));
- assertEquals(2, children.size());
- }
-
- @Test
- void getCache() {
- TreeCache cache = client.getCache("/test");
- assertNull(cache);
-
- client.addCache("/test");
- cache = client.getCache("/test");
- assertNotNull(cache);
+ assertEquals(0, children.size());
}
@Test
- void addCache() {
- client.addCache("/test");
- TreeCache cache = client.getCache("/test");
- assertNotNull(cache);
- }
-
- @Test
- void startErrorTest() throws Exception {
- Field clientField = ZookeeperClient.class.getDeclaredField("client");
- clientField.setAccessible(true);
- CuratorFramework curatorFramework = mock(CuratorFramework.class);
- clientField.set(client, curatorFramework);
-
-
doThrow(InterruptedException.class).when(curatorFramework).blockUntilConnected();
- client.start();
-
- doThrow(ShenyuException.class).when(curatorFramework).checkExists();
- Assertions.assertThrows(ShenyuException.class, () ->
client.isExist("key"));
-
- GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
- when(curatorFramework.getData()).thenReturn(getDataBuilder);
- when(getDataBuilder.forPath(any())).thenReturn(null);
- Assertions.assertDoesNotThrow(() -> client.getDirectly("key"));
-
- doThrow(ShenyuException.class).when(curatorFramework).getData();
- Assertions.assertThrows(ShenyuException.class, () ->
client.getDirectly("key"));
-
- doThrow(ShenyuException.class).when(curatorFramework).getChildren();
- Assertions.assertThrows(ShenyuException.class, () ->
client.getChildren("key"));
-
- doThrow(ShenyuException.class).when(curatorFramework).delete();
- Assertions.assertThrows(ShenyuException.class, () ->
client.delete("key"));
-
- doThrow(ShenyuException.class).when(curatorFramework).create();
- Assertions.assertThrows(ShenyuException.class, () ->
client.createOrUpdate(null, null, null));
- curatorFramework.close();
+ void createOrUpdate() throws Exception {
+ assertThrows(ShenyuException.class, () ->
+ client.createOrUpdate("/test", "hello",
CreateMode.PERSISTENT));
+ CreateBuilder createBuilder = mock(CreateBuilder.class);
+ when(curatorFramework.create()).thenReturn(createBuilder);
+ CreateBuilder2 createBuilder2 = mock(CreateBuilder2.class);
+ when(createBuilder.orSetData()).thenReturn(createBuilder2);
+ ProtectACLCreateModeStatPathAndBytesable
protectACLCreateModeStatPathAndBytesable =
mock(ProtectACLCreateModeStatPathAndBytesable.class);
+
when(createBuilder2.creatingParentsIfNeeded()).thenReturn(protectACLCreateModeStatPathAndBytesable);
+ ACLBackgroundPathAndBytesable pathAndBytesable =
mock(ACLBackgroundPathAndBytesable.class);
+
when(protectACLCreateModeStatPathAndBytesable.withMode(any())).thenReturn(pathAndBytesable);
+ when(pathAndBytesable.forPath(anyString(),
any(byte[].class))).thenReturn(null);
+ client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+ client.createOrUpdate("", "hello", CreateMode.PERSISTENT);
+ client.createOrUpdate("", (Object) null, CreateMode.PERSISTENT);
+ client.createOrUpdate("", new Object(), CreateMode.PERSISTENT);
}
@Test
void cacheTest() throws Exception {
- client.addCache("/path", mock(TreeCacheListener.class),
mock(TreeCacheListener.class));
+ assertThrows(ShenyuException.class, () -> client.addCache("/path",
mock(TreeCacheListener.class), mock(TreeCacheListener.class)));
Field clientField = ZookeeperClient.class.getDeclaredField("client");
clientField.setAccessible(true);
CuratorFramework curatorFramework = mock(CuratorFramework.class);
@@ -214,7 +179,7 @@ class ZookeeperClientTest {
when(getDataBuilder.forPath(any())).thenReturn("path".getBytes(StandardCharsets.UTF_8));
client.get("/path");
client.get("/test");
-
+ client.getCache("/test");
MockedStatic<TreeCache> treeCacheMockedStatic =
mockStatic(TreeCache.class);
TreeCache.Builder treeCacheBuilder = mock(TreeCache.Builder.class);
treeCacheMockedStatic.when(() -> TreeCache.newBuilder(any(),
any())).thenReturn(treeCacheBuilder);
@@ -224,37 +189,4 @@ class ZookeeperClientTest {
Assertions.assertThrows(ShenyuException.class, () ->
client.addCache("/path"));
treeCacheMockedStatic.close();
}
-
- @Test
- void findFromCacheTest() throws Exception {
- Field clientField = ZookeeperClient.class.getDeclaredField("client");
- clientField.setAccessible(true);
- CuratorFramework curatorFramework = mock(CuratorFramework.class);
- clientField.set(client, curatorFramework);
- GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
- when(curatorFramework.getData()).thenReturn(getDataBuilder);
-
when(getDataBuilder.forPath(any())).thenReturn("path".getBytes(StandardCharsets.UTF_8));
- Assertions.assertDoesNotThrow(() -> client.get("/path"));
-
- Field cachesField = ZookeeperClient.class.getDeclaredField("caches");
- cachesField.setAccessible(true);
-
- TreeCache treeCache = mock(TreeCache.class);
- Map<String, TreeCache> caches = new ConcurrentHashMap<>();
- caches.put("/path", treeCache);
- cachesField.set(client, caches);
-
- ChildData childData = mock(ChildData.class);
- when(treeCache.getCurrentData(any())).thenReturn(childData);
- Assertions.assertDoesNotThrow(() -> client.get("/path"));
-
- when(childData.getData()).thenReturn(new byte[1]);
- Assertions.assertDoesNotThrow(() -> client.get("/path"));
- }
-
- @Test
- void createOrUpdateTest() {
- Assertions.assertThrows(ShenyuException.class, () ->
client.createOrUpdate("key", (Object) null, CreateMode.PERSISTENT));
- Assertions.assertThrows(ShenyuException.class, () ->
client.createOrUpdate("key", new Object(), CreateMode.PERSISTENT));
- }
}
diff --git
a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperClientTest.java
b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperClientTest.java
index 225cb56b3..cc84ee5e2 100644
---
a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperClientTest.java
+++
b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperClientTest.java
@@ -18,42 +18,81 @@
package org.apache.shenyu.register.instance.zookeeper;
import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.api.ACLBackgroundPathAndBytesable;
+import org.apache.curator.framework.api.BackgroundVersionable;
+import org.apache.curator.framework.api.ChildrenDeletable;
+import org.apache.curator.framework.api.CreateBuilder;
+import org.apache.curator.framework.api.CreateBuilder2;
+import org.apache.curator.framework.api.DeleteBuilder;
+import org.apache.curator.framework.api.GetChildrenBuilder;
+import org.apache.curator.framework.api.GetDataBuilder;
+import
org.apache.curator.framework.api.ProtectACLCreateModeStatPathAndBytesable;
+import org.apache.curator.framework.imps.ExistsBuilderImpl;
import org.apache.curator.framework.recipes.cache.TreeCache;
-import org.apache.curator.test.TestingServer;
-import org.apache.shenyu.common.dto.MetaData;
-import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.curator.framework.recipes.cache.TreeCacheListener;
+import org.apache.shenyu.common.exception.ShenyuException;
import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.data.Stat;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
-import java.io.IOException;
+import java.lang.reflect.Field;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
import java.util.List;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.when;
class ZookeeperClientTest {
private ZookeeperClient client;
- private TestingServer server;
+ private CuratorFramework curatorFramework;
@BeforeEach
- public void setup() throws Exception {
- this.server = new TestingServer();
- ZookeeperConfig config = new
ZookeeperConfig(server.getConnectString());
- client = new ZookeeperClient(config);
- client.start();
+ public void setup() {
+ curatorFramework = mock(CuratorFramework.class);
+ try (MockedStatic<CuratorFrameworkFactory>
frameworkFactoryMockedStatic = mockStatic(CuratorFrameworkFactory.class)) {
+ CuratorFrameworkFactory.Builder builder =
mock(CuratorFrameworkFactory.Builder.class);
+
frameworkFactoryMockedStatic.when(CuratorFrameworkFactory::builder).thenReturn(builder);
+ when(builder.connectString(anyString())).thenReturn(builder);
+ when(builder.retryPolicy(any())).thenReturn(builder);
+ when(builder.connectionTimeoutMs(anyInt())).thenReturn(builder);
+ when(builder.sessionTimeoutMs(anyInt())).thenReturn(builder);
+ when(builder.namespace(anyString())).thenReturn(builder);
+ when(builder.build()).thenReturn(curatorFramework);
+ ZookeeperConfig config = new ZookeeperConfig("services");
+ config.setNamespace("namespace");
+ config.setDigest("digest");
+ client = new ZookeeperClient(config);
+ client.start();
+
doThrow(InterruptedException.class).when(curatorFramework).blockUntilConnected();
+ assertDoesNotThrow(() -> client.start());
+ } catch (Exception e) {
+ throw new ShenyuException(e);
+ }
}
@AfterEach
- public void cleanup() throws IOException {
+ public void cleanup() {
client.close();
- this.server.close();
}
@Test
@@ -63,81 +102,91 @@ class ZookeeperClientTest {
}
@Test
- void isExist() {
+ void isExist() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.isExist("/test"));
+ ExistsBuilderImpl existsBuilder = mock(ExistsBuilderImpl.class);
+ when(curatorFramework.checkExists()).thenReturn(existsBuilder);
+ when(existsBuilder.forPath(anyString())).thenReturn(new Stat());
boolean exist = client.isExist("/test");
- assertFalse(exist);
-
- client.createOrUpdate("/test", "", CreateMode.PERSISTENT);
- exist = client.isExist("/test");
assertTrue(exist);
}
@Test
- void getDirectly() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+ void getDirectly() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.getDirectly("/test"));
+ GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+ when(curatorFramework.getData()).thenReturn(getDataBuilder);
+
when(getDataBuilder.forPath(anyString())).thenReturn("hello".getBytes());
String val = client.getDirectly("/test");
assertEquals("hello", val);
+ when(getDataBuilder.forPath(anyString())).thenReturn(null);
+ String val2 = client.getDirectly("/test");
+ assertNull(val2);
}
@Test
- void get() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals("hello", val);
- }
-
- @Test
- void createOrUpdate() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals("hello", val);
- }
-
- @Test
- void testCreateOrUpdate() {
- MetaData data = new MetaData();
- data.setAppName("test");
- client.createOrUpdate("/test", data, CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals(GsonUtils.getInstance().toJson(data), val);
+ void delete() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.delete("/test"));
+ DeleteBuilder deleteBuilder = mock(DeleteBuilder.class);
+ when(curatorFramework.delete()).thenReturn(deleteBuilder);
+ ChildrenDeletable childrenDeletable = mock(ChildrenDeletable.class);
+ when(deleteBuilder.guaranteed()).thenReturn(childrenDeletable);
+ BackgroundVersionable backgroundVersionable =
mock(BackgroundVersionable.class);
+
when(childrenDeletable.deletingChildrenIfNeeded()).thenReturn(backgroundVersionable);
+ doNothing().when(backgroundVersionable).forPath(anyString());
+ assertDoesNotThrow(() -> client.delete("/test"));
}
@Test
- void delete() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals("hello", val);
-
- client.delete("/test");
- boolean exist = client.isExist("/test");
- assertFalse(exist);
- }
-
- @Test
- void getChildren() {
- client.createOrUpdate("/test/1", "hello", CreateMode.PERSISTENT);
- client.createOrUpdate("/test/2", "hello", CreateMode.PERSISTENT);
-
+ void getChildren() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.getChildren("/test"));
+ GetChildrenBuilder getChildrenBuilder = mock(GetChildrenBuilder.class);
+ when(curatorFramework.getChildren()).thenReturn(getChildrenBuilder);
+ when(getChildrenBuilder.forPath(anyString())).thenReturn(new
ArrayList<>());
List<String> children = client.getChildren("/test");
- assertTrue(children.contains("1"));
- assertTrue(children.contains("2"));
- assertEquals(2, children.size());
+ assertEquals(0, children.size());
}
@Test
- void getCache() {
- TreeCache cache = client.getCache("/test");
- assertNull(cache);
-
- client.addCache("/test");
- cache = client.getCache("/test");
- assertNotNull(cache);
+ void createOrUpdate() throws Exception {
+ assertThrows(ShenyuException.class, () ->
+ client.createOrUpdate("/test", "hello",
CreateMode.PERSISTENT));
+ CreateBuilder createBuilder = mock(CreateBuilder.class);
+ when(curatorFramework.create()).thenReturn(createBuilder);
+ CreateBuilder2 createBuilder2 = mock(CreateBuilder2.class);
+ when(createBuilder.orSetData()).thenReturn(createBuilder2);
+ ProtectACLCreateModeStatPathAndBytesable
protectACLCreateModeStatPathAndBytesable =
mock(ProtectACLCreateModeStatPathAndBytesable.class);
+
when(createBuilder2.creatingParentsIfNeeded()).thenReturn(protectACLCreateModeStatPathAndBytesable);
+ ACLBackgroundPathAndBytesable pathAndBytesable =
mock(ACLBackgroundPathAndBytesable.class);
+
when(protectACLCreateModeStatPathAndBytesable.withMode(any())).thenReturn(pathAndBytesable);
+ when(pathAndBytesable.forPath(anyString(),
any(byte[].class))).thenReturn(null);
+ client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+ client.createOrUpdate("", "hello", CreateMode.PERSISTENT);
+ client.createOrUpdate("", (Object) null, CreateMode.PERSISTENT);
+ client.createOrUpdate("", new Object(), CreateMode.PERSISTENT);
}
@Test
- void addCache() {
- client.addCache("/test");
- TreeCache cache = client.getCache("/test");
- assertNotNull(cache);
+ void cacheTest() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.addCache("/path",
mock(TreeCacheListener.class), mock(TreeCacheListener.class)));
+ Field clientField = ZookeeperClient.class.getDeclaredField("client");
+ clientField.setAccessible(true);
+ CuratorFramework curatorFramework = mock(CuratorFramework.class);
+ clientField.set(client, curatorFramework);
+
+ GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+ when(curatorFramework.getData()).thenReturn(getDataBuilder);
+
when(getDataBuilder.forPath(any())).thenReturn("path".getBytes(StandardCharsets.UTF_8));
+ client.get("/path");
+ client.get("/test");
+ client.getCache("/test");
+ MockedStatic<TreeCache> treeCacheMockedStatic =
mockStatic(TreeCache.class);
+ TreeCache.Builder treeCacheBuilder = mock(TreeCache.Builder.class);
+ treeCacheMockedStatic.when(() -> TreeCache.newBuilder(any(),
any())).thenReturn(treeCacheBuilder);
+ TreeCache treeCache = mock(TreeCache.class);
+ when(treeCacheBuilder.build()).thenReturn(treeCache);
+ when(treeCache.start()).thenThrow(ShenyuException.class);
+ Assertions.assertThrows(ShenyuException.class, () ->
client.addCache("/path"));
+ treeCacheMockedStatic.close();
}
}
diff --git
a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepositoryTest.java
b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepositoryTest.java
index 2ace0d864..c1ff22c61 100644
---
a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepositoryTest.java
+++
b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepositoryTest.java
@@ -17,48 +17,51 @@
package org.apache.shenyu.register.instance.zookeeper;
-import org.apache.curator.test.TestingServer;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.listen.Listenable;
+import org.apache.curator.framework.state.ConnectionState;
+import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.shenyu.common.config.ShenyuConfig;
-import org.apache.shenyu.common.utils.GsonUtils;
import org.apache.shenyu.register.common.dto.InstanceRegisterDTO;
-import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedConstruction;
-import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockConstruction;
+import static org.mockito.Mockito.when;
public class ZookeeperInstanceRegisterRepositoryTest {
- private final ZookeeperInstanceRegisterRepository repository
- = new ZookeeperInstanceRegisterRepository();
-
- private ZookeeperClient client;
-
- @BeforeEach
- public void setup() throws Exception {
- TestingServer server = new TestingServer();
- ShenyuConfig.InstanceConfig config = new ShenyuConfig.InstanceConfig();
- config.setServerLists(server.getConnectString());
- this.repository.init(config);
-
- Class<? extends ZookeeperInstanceRegisterRepository> clazz =
this.repository.getClass();
-
- String fieldString = "client";
- Field field = clazz.getDeclaredField(fieldString);
- field.setAccessible(true);
- this.client = (ZookeeperClient) field.get(repository);
- }
-
@Test
- public void testPersistInstance() {
- InstanceRegisterDTO data = InstanceRegisterDTO.builder()
- .appName("shenyu-test")
- .host("shenyu-host")
- .port(9195)
- .build();
- repository.persistInstance(data);
- String value =
client.get("/shenyu/register/instance/shenyu-host:9195");
- assertEquals(value, GsonUtils.getInstance().toJson(data));
+ public void testZookeeperInstanceRegisterRepository() {
+ final Listenable listenable = mock(Listenable.class);
+ try (MockedConstruction<ZookeeperClient> construction =
mockConstruction(ZookeeperClient.class, (mock, context) -> {
+ final CuratorFramework curatorFramework =
mock(CuratorFramework.class);
+ when(mock.getClient()).thenReturn(curatorFramework);
+
when(curatorFramework.getConnectionStateListenable()).thenReturn(listenable);
+ })) {
+ final ZookeeperInstanceRegisterRepository repository = new
ZookeeperInstanceRegisterRepository();
+ ShenyuConfig.InstanceConfig config = new
ShenyuConfig.InstanceConfig();
+ repository.init(config);
+ final Properties configProps = config.getProps();
+ configProps.setProperty("digest", "digest");
+ List<ConnectionStateListener> connectionStateListeners = new
ArrayList<>();
+ doAnswer(invocationOnMock -> {
+ connectionStateListeners.add(invocationOnMock.getArgument(0));
+ return null;
+ }).when(listenable).addListener(any());
+ repository.init(config);
+ repository.persistInstance(mock(InstanceRegisterDTO.class));
+ connectionStateListeners.forEach(connectionStateListener -> {
+ connectionStateListener.stateChanged(null,
ConnectionState.RECONNECTED);
+ });
+ repository.close();
+ }
}
}
diff --git
a/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperClientTest.java
b/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperClientTest.java
index 603316937..6a1b701a4 100644
---
a/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperClientTest.java
+++
b/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperClientTest.java
@@ -18,52 +18,86 @@
package org.apache.shenyu.sync.data.zookeeper;
import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.api.ACLBackgroundPathAndBytesable;
+import org.apache.curator.framework.api.BackgroundVersionable;
+import org.apache.curator.framework.api.ChildrenDeletable;
+import org.apache.curator.framework.api.CreateBuilder;
+import org.apache.curator.framework.api.CreateBuilder2;
+import org.apache.curator.framework.api.DeleteBuilder;
+import org.apache.curator.framework.api.GetChildrenBuilder;
+import org.apache.curator.framework.api.GetDataBuilder;
+import
org.apache.curator.framework.api.ProtectACLCreateModeStatPathAndBytesable;
+import org.apache.curator.framework.imps.ExistsBuilderImpl;
import org.apache.curator.framework.recipes.cache.TreeCache;
-import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
-import org.apache.curator.test.TestingServer;
-import org.apache.shenyu.common.dto.MetaData;
import org.apache.shenyu.common.exception.ShenyuException;
-import org.apache.shenyu.common.utils.GsonUtils;
import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.data.Stat;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
-import java.io.IOException;
import java.lang.reflect.Field;
+import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.when;
class ZookeeperClientTest {
private ZookeeperClient client;
- private TestingServer server;
+ private CuratorFramework curatorFramework;
@BeforeEach
- public void setup() throws Exception {
- this.server = new TestingServer();
- ZookeeperConfig config = new
ZookeeperConfig(server.getConnectString());
- config.setNamespace("namespace");
- config.setDigest("digest");
- client = new ZookeeperClient(config);
- client.start();
+ public void setup() {
+ curatorFramework = mock(CuratorFramework.class);
+ try (MockedStatic<CuratorFrameworkFactory>
frameworkFactoryMockedStatic = mockStatic(CuratorFrameworkFactory.class)) {
+ CuratorFrameworkFactory.Builder builder =
mock(CuratorFrameworkFactory.Builder.class);
+
frameworkFactoryMockedStatic.when(CuratorFrameworkFactory::builder).thenReturn(builder);
+ when(builder.connectString(anyString())).thenReturn(builder);
+ when(builder.retryPolicy(any())).thenReturn(builder);
+ when(builder.connectionTimeoutMs(anyInt())).thenReturn(builder);
+ when(builder.sessionTimeoutMs(anyInt())).thenReturn(builder);
+ when(builder.namespace(anyString())).thenReturn(builder);
+ when(builder.build()).thenReturn(curatorFramework);
+ ZookeeperConfig config = new ZookeeperConfig("services");
+ config.setNamespace("namespace");
+ config.setDigest("digest");
+ config.setBaseSleepTimeMilliseconds(1);
+ config.setMaxSleepTimeMilliseconds(1);
+ config.setMaxRetries(1);
+ config.setSessionTimeoutMilliseconds(1);
+ config.setConnectionTimeoutMilliseconds(1);
+ client = new ZookeeperClient(config);
+ client.start();
+
doThrow(InterruptedException.class).when(curatorFramework).blockUntilConnected();
+ assertDoesNotThrow(() -> client.start());
+ } catch (Exception e) {
+ throw new ShenyuException(e);
+ }
}
@AfterEach
- public void cleanup() throws IOException {
+ public void cleanup() {
client.close();
- this.server.close();
}
@Test
@@ -73,128 +107,91 @@ class ZookeeperClientTest {
}
@Test
- void isExist() {
+ void isExist() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.isExist("/test"));
+ ExistsBuilderImpl existsBuilder = mock(ExistsBuilderImpl.class);
+ when(curatorFramework.checkExists()).thenReturn(existsBuilder);
+ when(existsBuilder.forPath(anyString())).thenReturn(new Stat());
boolean exist = client.isExist("/test");
- assertFalse(exist);
-
- client.createOrUpdate("/test", "", CreateMode.PERSISTENT);
- exist = client.isExist("/test");
assertTrue(exist);
}
@Test
- void errorTest() throws NoSuchFieldException, InterruptedException,
IllegalAccessException {
- final Field curatorFramework =
ZookeeperClient.class.getDeclaredField("client");
- final CuratorFramework curatorFrameworkMock =
mock(CuratorFramework.class);
- curatorFramework.setAccessible(true);
- curatorFramework.set(client, curatorFrameworkMock);
-
doThrow(InterruptedException.class).when(curatorFrameworkMock).blockUntilConnected();
- Assertions.assertDoesNotThrow(() -> client.start());
-
-
doThrow(ShenyuException.class).when(curatorFrameworkMock).checkExists();
- Assertions.assertThrows(ShenyuException.class, () ->
client.isExist("key"));
-
- doThrow(ShenyuException.class).when(curatorFrameworkMock).getData();
- Assertions.assertThrows(ShenyuException.class, () ->
client.getDirectly("key"));
-
- doThrow(ShenyuException.class).when(curatorFrameworkMock).create();
- Assertions.assertThrows(ShenyuException.class, () ->
client.createOrUpdate("key", "value", CreateMode.PERSISTENT));
-
- doThrow(ShenyuException.class).when(curatorFrameworkMock).delete();
- Assertions.assertThrows(ShenyuException.class, () ->
client.delete("key"));
-
-
doThrow(ShenyuException.class).when(curatorFrameworkMock).getChildren();
- Assertions.assertThrows(ShenyuException.class, () ->
client.getChildren("key"));
- }
-
- @Test
- void getDirectly() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+ void getDirectly() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.getDirectly("/test"));
+ GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+ when(curatorFramework.getData()).thenReturn(getDataBuilder);
+
when(getDataBuilder.forPath(anyString())).thenReturn("hello".getBytes());
String val = client.getDirectly("/test");
assertEquals("hello", val);
+ when(getDataBuilder.forPath(anyString())).thenReturn(null);
+ String val2 = client.getDirectly("/test");
+ assertNull(val2);
}
@Test
- void get() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals("hello", val);
- }
-
- @Test
- void createOrUpdate() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals("hello", val);
+ void delete() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.delete("/test"));
+ DeleteBuilder deleteBuilder = mock(DeleteBuilder.class);
+ when(curatorFramework.delete()).thenReturn(deleteBuilder);
+ ChildrenDeletable childrenDeletable = mock(ChildrenDeletable.class);
+ when(deleteBuilder.guaranteed()).thenReturn(childrenDeletable);
+ BackgroundVersionable backgroundVersionable =
mock(BackgroundVersionable.class);
+
when(childrenDeletable.deletingChildrenIfNeeded()).thenReturn(backgroundVersionable);
+ doNothing().when(backgroundVersionable).forPath(anyString());
+ assertDoesNotThrow(() -> client.delete("/test"));
}
@Test
- void testCreateOrUpdate() {
- MetaData data = new MetaData();
- data.setAppName("test");
- client.createOrUpdate("/test", data, CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals(GsonUtils.getInstance().toJson(data), val);
- }
-
- @Test
- void delete() {
- client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
- String val = client.get("/test");
- assertEquals("hello", val);
-
- client.delete("/test");
- boolean exist = client.isExist("/test");
- assertFalse(exist);
- }
-
- @Test
- void getChildren() {
- client.createOrUpdate("/test/1", "hello", CreateMode.PERSISTENT);
- client.createOrUpdate("/test/2", "hello", CreateMode.PERSISTENT);
-
+ void getChildren() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.getChildren("/test"));
+ GetChildrenBuilder getChildrenBuilder = mock(GetChildrenBuilder.class);
+ when(curatorFramework.getChildren()).thenReturn(getChildrenBuilder);
+ when(getChildrenBuilder.forPath(anyString())).thenReturn(new
ArrayList<>());
List<String> children = client.getChildren("/test");
- assertTrue(children.contains("1"));
- assertTrue(children.contains("2"));
- assertEquals(2, children.size());
- }
-
- @Test
- void getCache() {
- TreeCache cache = client.getCache("/test");
- assertNull(cache);
-
- client.addCache("/test");
- cache = client.getCache("/test");
- assertNotNull(cache);
+ assertEquals(0, children.size());
}
@Test
- void configTest() {
- ZookeeperConfig config = new
ZookeeperConfig(server.getConnectString());
- config.setNamespace("namespace");
- config.setDigest("digest");
- config.setConnectionTimeoutMilliseconds(0);
- config.setMaxSleepTimeMilliseconds(0);
- config.setSessionTimeoutMilliseconds(0);
- config.setBaseSleepTimeMilliseconds(0);
- config.setMaxRetries(3);
+ void createOrUpdate() throws Exception {
+ assertThrows(ShenyuException.class, () ->
+ client.createOrUpdate("/test", "hello",
CreateMode.PERSISTENT));
+ CreateBuilder createBuilder = mock(CreateBuilder.class);
+ when(curatorFramework.create()).thenReturn(createBuilder);
+ CreateBuilder2 createBuilder2 = mock(CreateBuilder2.class);
+ when(createBuilder.orSetData()).thenReturn(createBuilder2);
+ ProtectACLCreateModeStatPathAndBytesable
protectACLCreateModeStatPathAndBytesable =
mock(ProtectACLCreateModeStatPathAndBytesable.class);
+
when(createBuilder2.creatingParentsIfNeeded()).thenReturn(protectACLCreateModeStatPathAndBytesable);
+ ACLBackgroundPathAndBytesable pathAndBytesable =
mock(ACLBackgroundPathAndBytesable.class);
+
when(protectACLCreateModeStatPathAndBytesable.withMode(any())).thenReturn(pathAndBytesable);
+ when(pathAndBytesable.forPath(anyString(),
any(byte[].class))).thenReturn(null);
+ client.createOrUpdate("/test", "hello", CreateMode.PERSISTENT);
+ client.createOrUpdate("", "hello", CreateMode.PERSISTENT);
+ client.createOrUpdate("", (Object) null, CreateMode.PERSISTENT);
+ client.createOrUpdate("", new Object(), CreateMode.PERSISTENT);
}
@Test
- void addCache() throws InterruptedException {
- List<String> paths = new ArrayList<>();
- TreeCacheListener listener = (client, event) -> {
- if (event.getType() == TreeCacheEvent.Type.NODE_ADDED ||
event.getType() == TreeCacheEvent.Type.NODE_UPDATED) {
- paths.add(event.getData().getPath());
- }
- };
- client.createOrUpdate("/test", "", CreateMode.PERSISTENT);
- client.addCache("/test", listener);
- TreeCache cache = client.getCache("/test");
-
- Thread.sleep(500);
- assertNotNull(cache);
- assertEquals("/test", paths.get(0));
+ void cacheTest() throws Exception {
+ assertThrows(ShenyuException.class, () -> client.addCache("/path",
mock(TreeCacheListener.class), mock(TreeCacheListener.class)));
+ Field clientField = ZookeeperClient.class.getDeclaredField("client");
+ clientField.setAccessible(true);
+ CuratorFramework curatorFramework = mock(CuratorFramework.class);
+ clientField.set(client, curatorFramework);
+
+ GetDataBuilder getDataBuilder = mock(GetDataBuilder.class);
+ when(curatorFramework.getData()).thenReturn(getDataBuilder);
+
when(getDataBuilder.forPath(any())).thenReturn("path".getBytes(StandardCharsets.UTF_8));
+ client.get("/path");
+ client.get("/test");
+ client.getCache("/test");
+ MockedStatic<TreeCache> treeCacheMockedStatic =
mockStatic(TreeCache.class);
+ TreeCache.Builder treeCacheBuilder = mock(TreeCache.Builder.class);
+ treeCacheMockedStatic.when(() -> TreeCache.newBuilder(any(),
any())).thenReturn(treeCacheBuilder);
+ TreeCache treeCache = mock(TreeCache.class);
+ when(treeCacheBuilder.build()).thenReturn(treeCache);
+ when(treeCache.start()).thenThrow(ShenyuException.class);
+ Assertions.assertThrows(ShenyuException.class, () ->
client.addCache("/path"));
+ treeCacheMockedStatic.close();
}
}
diff --git
a/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperSyncDataServiceTest.java
b/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperSyncDataServiceTest.java
index 202889637..b2cf7fa5e 100644
---
a/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperSyncDataServiceTest.java
+++
b/shenyu-sync-data-center/shenyu-sync-data-zookeeper/src/test/java/org/apache/shenyu/sync/data/zookeeper/ZookeeperSyncDataServiceTest.java
@@ -17,376 +17,84 @@
package org.apache.shenyu.sync.data.zookeeper;
-import com.google.common.collect.Lists;
-import org.apache.curator.test.TestingServer;
-import org.apache.shenyu.common.constant.DefaultPathConstants;
-import org.apache.shenyu.common.dto.AppAuthData;
-import org.apache.shenyu.common.dto.MetaData;
-import org.apache.shenyu.common.dto.PluginData;
-import org.apache.shenyu.common.dto.RuleData;
-import org.apache.shenyu.common.dto.SelectorData;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.recipes.cache.ChildData;
+import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
+import org.apache.curator.framework.recipes.cache.TreeCacheListener;
import org.apache.shenyu.sync.data.api.AuthDataSubscriber;
import org.apache.shenyu.sync.data.api.MetaDataSubscriber;
import org.apache.shenyu.sync.data.api.PluginDataSubscriber;
-import org.apache.zookeeper.CreateMode;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import static junit.framework.TestCase.assertTrue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.Is.is;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
public final class ZookeeperSyncDataServiceTest {
- private static final String MOCK_PLUGIN_PARENT_PATH = "/shenyu/plugin";
-
- private static final String MOCK_PLUGIN_PATH = "/shenyu/plugin/divide";
-
- private static final String MOCK_PLUGIN_NAME = "divide";
-
- private static final String MOCK_SELECTOR_PARENT_PATH =
"/shenyu/selector/divide";
-
- private static final String MOCK_SELECTOR_PATH =
"/shenyu/selector/divide/test";
-
- private static final String MOCK_SELECTOR_NAME = "test";
-
- private static final String MOCK_RULE_PARENT_PATH = "/shenyu/rule/divide";
-
- private static final String MOCK_RULE_PATH =
"/shenyu/rule/divide/test-test";
-
- private static final String MOCK_RULE_NAME = "test-test";
-
- private static final String MOCK_APP_AUTH_PARENT_PATH = "/shenyu/auth";
-
- private static final String MOCK_APP_AUTH_PATH = "/shenyu/auth/test";
-
- private static final String MOCK_APP_AUTH_KEY = "test";
-
- private static final String MOCK_META_DATA_PARENT_PATH =
"/shenyu/metaData";
-
- private static final String MOCK_META_DATA_PATH = "/shenyu/metaData/test";
-
- private static final String MOCK_META_DATA_ID = "test";
-
- private ZookeeperClient zkClient;
-
- private ZookeeperSyncDataService syncDataService;
-
- @BeforeEach
- public void setUp() throws Exception {
- TestingServer server = new TestingServer();
- ZookeeperConfig config = new
ZookeeperConfig(server.getConnectString());
- zkClient = new ZookeeperClient(config);
- zkClient.start();
- }
-
- @Test
- public void testWatchPluginWhenInit() throws InterruptedException {
- final List<PluginData> subscribeList = new ArrayList<>(1);
- PluginData pluginData =
PluginData.builder().name(MOCK_PLUGIN_NAME).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_PLUGIN_PATH, pluginData,
CreateMode.PERSISTENT);
-
- syncDataService = new ZookeeperSyncDataService(zkClient, new
PluginDataSubscriber() {
- @Override
- public void onSubscribe(final PluginData pluginData) {
- subscribeList.add(pluginData);
- }
- }, Collections.emptyList(), Collections.emptyList());
- // wait for listener taking action
- Thread.sleep(200);
- assertThat(subscribeList.size(), is(1));
- assertThat(subscribeList.get(0).getName(), is("divide"));
- }
-
- @Test
- public void testWatchPluginWhenDataChange() throws Exception {
- final List<PluginData> subscribeList = new ArrayList<>(1);
- syncDataService = new ZookeeperSyncDataService(zkClient, new
PluginDataSubscriber() {
- @Override
- public void onSubscribe(final PluginData pluginData) {
- subscribeList.add(pluginData);
- }
- }, Collections.emptyList(), Collections.emptyList());
-
- PluginData pluginData =
PluginData.builder().name(MOCK_PLUGIN_NAME).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_PLUGIN_PATH, pluginData,
CreateMode.PERSISTENT);
- // wait for listener taking action
- Thread.sleep(200);
- assertThat(subscribeList.size(), is(1));
- assertThat(subscribeList.get(0).getName(), is("divide"));
- }
-
- @Test
- public void testWatchPluginWhenDataDeleted() throws Exception {
- final List<PluginData> unSubscribeList = new ArrayList<>(1);
- PluginData pluginData =
PluginData.builder().name(MOCK_PLUGIN_NAME).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_PLUGIN_PATH, pluginData,
CreateMode.PERSISTENT);
-
- syncDataService = new ZookeeperSyncDataService(zkClient, new
PluginDataSubscriber() {
- @Override
- public void unSubscribe(final PluginData pluginData) {
- unSubscribeList.add(pluginData);
- }
- }, Collections.emptyList(), Collections.emptyList());
- Thread.sleep(200);
- zkClient.delete(MOCK_PLUGIN_PATH);
- // wait for listener taking action
- Thread.sleep(200);
- assertThat(unSubscribeList.size(), is(1));
- assertThat(unSubscribeList.get(0).getName(), is("divide"));
- }
-
- @Test
- public void testWatchSelectorWhenInit() throws InterruptedException {
- final List<SelectorData> subscribeList = new ArrayList<>(1);
- SelectorData selectorData =
SelectorData.builder().name(MOCK_SELECTOR_NAME).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_SELECTOR_PATH, selectorData,
CreateMode.PERSISTENT);
- syncDataService = new ZookeeperSyncDataService(zkClient, new
PluginDataSubscriber() {
- @Override
- public void onSelectorSubscribe(final SelectorData selectorData) {
- subscribeList.add(selectorData);
- }
- }, Collections.emptyList(), Collections.emptyList());
- Thread.sleep(200);
- assertThat(subscribeList.size(), is(1));
- assertThat(subscribeList.get(0).getName(), is("test"));
- }
-
- @Test
- public void testWatchSelectorWhenDataChange() throws Exception {
- final List<SelectorData> subscribeList = new ArrayList<>(1);
- SelectorData selectorData =
SelectorData.builder().name(MOCK_SELECTOR_NAME).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_SELECTOR_PATH, selectorData,
CreateMode.PERSISTENT);
- syncDataService = new ZookeeperSyncDataService(zkClient, new
PluginDataSubscriber() {
- @Override
- public void onSelectorSubscribe(final SelectorData selectorData) {
- subscribeList.add(selectorData);
- }
- }, Collections.emptyList(), Collections.emptyList());
- Thread.sleep(200);
- zkClient.createOrUpdate(MOCK_SELECTOR_PATH, selectorData,
CreateMode.PERSISTENT);
- Thread.sleep(200);
- assertThat(subscribeList.size(), is(2));
- assertThat(subscribeList.get(0).getName(), is("test"));
- }
-
- @Test
- public void testWatchSelectorWhenDataDeleted() throws Exception {
- final List<SelectorData> unSubscribeList = new ArrayList<>(1);
- SelectorData selectorData =
SelectorData.builder().name(MOCK_SELECTOR_NAME).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_SELECTOR_PATH, selectorData,
CreateMode.PERSISTENT);
- syncDataService = new ZookeeperSyncDataService(zkClient, new
PluginDataSubscriber() {
- @Override
- public void unSelectorSubscribe(final SelectorData selectorData) {
- unSubscribeList.add(selectorData);
- }
- }, Collections.emptyList(), Collections.emptyList());
- Thread.sleep(200);
- zkClient.delete(MOCK_SELECTOR_PATH);
- Thread.sleep(200);
- assertThat(unSubscribeList.size(), is(1));
- assertThat(unSubscribeList.get(0).getId(), is("test"));
- }
-
@Test
- public void testWatchRuleWhenInit() throws InterruptedException {
- final List<RuleData> subscribeList = new ArrayList<>(1);
- RuleData ruleData =
RuleData.builder().name(MOCK_RULE_NAME).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_RULE_PATH, ruleData,
CreateMode.PERSISTENT);
- syncDataService = new ZookeeperSyncDataService(zkClient, new
PluginDataSubscriber() {
- @Override
- public void onRuleSubscribe(final RuleData data) {
- subscribeList.add(data);
- }
- }, Collections.emptyList(), Collections.emptyList());
- Thread.sleep(200);
- assertThat(subscribeList.size(), is(1));
- assertThat(subscribeList.get(0).getName(), is(MOCK_RULE_NAME));
- }
-
- @Test
- public void testWatchRuleWhenDataChange() throws Exception {
- final List<RuleData> subscribeList = new ArrayList<>(1);
- RuleData ruleData =
RuleData.builder().name(MOCK_RULE_NAME).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_RULE_PATH, ruleData,
CreateMode.PERSISTENT);
- syncDataService = new ZookeeperSyncDataService(zkClient, new
PluginDataSubscriber() {
- @Override
- public void onRuleSubscribe(final RuleData data) {
- subscribeList.add(data);
- }
- }, Collections.emptyList(), Collections.emptyList());
- Thread.sleep(200);
- zkClient.createOrUpdate(MOCK_RULE_PATH, ruleData,
CreateMode.PERSISTENT);
- Thread.sleep(200);
- assertThat(subscribeList.size(), is(2));
- assertThat(subscribeList.get(0).getName(), is(MOCK_RULE_NAME));
- }
-
- @Test
- public void testWatchRuleWhenDataDeleted() throws Exception {
- final List<RuleData> unSubscribeList = new ArrayList<>(1);
- RuleData ruleData =
RuleData.builder().name(MOCK_RULE_NAME).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_RULE_PATH, ruleData,
CreateMode.PERSISTENT);
- syncDataService = new ZookeeperSyncDataService(zkClient, new
PluginDataSubscriber() {
- @Override
- public void unRuleSubscribe(final RuleData data) {
- unSubscribeList.add(data);
- }
- }, Collections.emptyList(), Collections.emptyList());
- Thread.sleep(200);
- zkClient.delete(MOCK_RULE_PATH);
- Thread.sleep(200);
- assertThat(unSubscribeList.size(), is(1));
- assertThat(unSubscribeList.get(0).getSelectorId() +
DefaultPathConstants.SELECTOR_JOIN_RULE + unSubscribeList.get(0).getId(),
is(MOCK_RULE_NAME));
- }
-
- @Test
- public void testWatchAppAuthWhenInit() throws InterruptedException {
- final List<AppAuthData> subscribeList = new ArrayList<>(1);
- AppAuthData appAuthData =
AppAuthData.builder().appKey(MOCK_APP_AUTH_KEY).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_APP_AUTH_PATH, appAuthData,
CreateMode.PERSISTENT);
- AuthDataSubscriber authDataSubscriber = new AuthDataSubscriber() {
- @Override
- public void onSubscribe(final AppAuthData appAuthData) {
- subscribeList.add(appAuthData);
- }
-
- @Override
- public void unSubscribe(final AppAuthData appAuthData) {
- }
- };
- syncDataService = new ZookeeperSyncDataService(zkClient,
- null, Collections.emptyList(),
Lists.newArrayList(authDataSubscriber));
- Thread.sleep(200);
- assertThat(subscribeList.size(), is(1));
- }
-
- @Test
- public void testWatchAppAuthWhenDataChange() throws Exception {
- final List<AppAuthData> subscribeList = new ArrayList<>(1);
- AppAuthData appAuthData =
AppAuthData.builder().appKey(MOCK_APP_AUTH_KEY).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_APP_AUTH_PATH, appAuthData,
CreateMode.PERSISTENT);
- AuthDataSubscriber authDataSubscriber = new AuthDataSubscriber() {
- @Override
- public void onSubscribe(final AppAuthData appAuthData) {
- subscribeList.add(appAuthData);
- }
-
- @Override
- public void unSubscribe(final AppAuthData appAuthData) {
- }
- };
- syncDataService = new ZookeeperSyncDataService(zkClient,
- null, Collections.emptyList(),
Lists.newArrayList(authDataSubscriber));
- Thread.sleep(200);
- appAuthData.setEnabled(true);
- zkClient.createOrUpdate(MOCK_APP_AUTH_PATH, appAuthData,
CreateMode.PERSISTENT);
- Thread.sleep(200);
- assertThat(subscribeList.size(), is(2));
- assertTrue(subscribeList.get(1).getEnabled());
- }
-
- @Test
- public void testWatchAppAuthWhenDataDeleted() throws Exception {
- final List<AppAuthData> unSubscribeList = new ArrayList<>(1);
- AppAuthData appAuthData =
AppAuthData.builder().appKey(MOCK_APP_AUTH_KEY).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_APP_AUTH_PATH, appAuthData,
CreateMode.PERSISTENT);
- AuthDataSubscriber authDataSubscriber = new AuthDataSubscriber() {
- @Override
- public void onSubscribe(final AppAuthData appAuthData) {
- }
-
- @Override
- public void unSubscribe(final AppAuthData appAuthData) {
- unSubscribeList.add(appAuthData);
- }
- };
- syncDataService = new ZookeeperSyncDataService(zkClient,
- null, Collections.emptyList(),
Lists.newArrayList(authDataSubscriber));
- Thread.sleep(200);
- zkClient.delete(MOCK_APP_AUTH_PATH);
- Thread.sleep(200);
- assertThat(unSubscribeList.size(), is(1));
- assertThat(unSubscribeList.get(0).getAppKey(), is(MOCK_APP_AUTH_KEY));
- }
-
- @Test
- public void testWatchMetaDataWhenInit() throws InterruptedException {
- final List<MetaData> subscribeList = new ArrayList<>(1);
- MetaData metaData =
MetaData.builder().id(MOCK_META_DATA_ID).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_META_DATA_PATH, metaData,
CreateMode.PERSISTENT);
- MetaDataSubscriber metaDataSubscriber = new MetaDataSubscriber() {
- @Override
- public void onSubscribe(final MetaData metaData) {
- subscribeList.add(metaData);
- }
-
- @Override
- public void unSubscribe(final MetaData metaData) {
- }
- };
- syncDataService = new ZookeeperSyncDataService(zkClient,
- null, Lists.newArrayList(metaDataSubscriber),
Collections.emptyList());
- Thread.sleep(200);
- assertThat(subscribeList.size(), is(1));
+ public void testZookeeperInstanceRegisterRepository() throws Exception {
+
+ ZookeeperClient zkClient = mock(ZookeeperClient.class);
+ PluginDataSubscriber pluginDataSubscriber =
mock(PluginDataSubscriber.class);
+
+ List<TreeCacheListener> treeCacheListeners = new ArrayList<>();
+ doAnswer(invocationOnMock -> {
+ treeCacheListeners.add(invocationOnMock.getArgument(1));
+ return null;
+ }).when(zkClient).addCache(any(), any());
+ final AuthDataSubscriber authDataSubscriber =
mock(AuthDataSubscriber.class);
+ final MetaDataSubscriber metaDataSubscriber =
mock(MetaDataSubscriber.class);
+ final ZookeeperSyncDataService zookeeperSyncDataService = new
ZookeeperSyncDataService(zkClient,
+ pluginDataSubscriber,
Collections.singletonList(metaDataSubscriber),
Collections.singletonList(authDataSubscriber));
+
+ List<TreeCacheEvent> treeCacheEvents = new ArrayList<>();
+ // register uri
+ treeCacheEvents.add(treeCacheEvent("/shenyu/uri/test/test/test",
TreeCacheEvent.Type.NODE_REMOVED));
+ // register metadata
+ treeCacheEvents.add(treeCacheEvent("/shenyu/metaData/test",
TreeCacheEvent.Type.NODE_REMOVED));
+ // register auth
+ treeCacheEvents.add(treeCacheEvent("/shenyu/auth/test",
TreeCacheEvent.Type.NODE_REMOVED));
+ // register rule
+ treeCacheEvents.add(treeCacheEvent("/shenyu/rule/test/test-1",
TreeCacheEvent.Type.NODE_REMOVED));
+ // register plugin
+ treeCacheEvents.add(treeCacheEvent("/shenyu/plugin/test",
TreeCacheEvent.Type.NODE_REMOVED));
+ // register selector
+ treeCacheEvents.add(treeCacheEvent("/shenyu/selector/test/test",
TreeCacheEvent.Type.NODE_REMOVED));
+
+ final CuratorFramework curatorFramework = mock(CuratorFramework.class);
+ for (TreeCacheListener treeCacheListener : treeCacheListeners) {
+ for (TreeCacheEvent event : treeCacheEvents) {
+ treeCacheListener.childEvent(curatorFramework, event);
+ }
+ }
+ final TreeCacheListener treeCacheListener =
treeCacheListeners.stream().findFirst().orElse(null);
+ if (!ObjectUtils.isEmpty(treeCacheListener)) {
+ TreeCacheEvent event = mock(TreeCacheEvent.class);
+ ChildData childData = mock(ChildData.class);
+ treeCacheListener.childEvent(curatorFramework, event);
+ when(event.getData()).thenReturn(childData);
+ when(childData.getPath()).thenReturn("");
+ treeCacheListener.childEvent(curatorFramework, event);
+ }
+
+ zookeeperSyncDataService.close();
+ }
+
+ private static TreeCacheEvent treeCacheEvent(final String path, final
TreeCacheEvent.Type type) {
+ TreeCacheEvent treeCacheEvent = mock(TreeCacheEvent.class);
+ ChildData childData = mock(ChildData.class);
+ when(treeCacheEvent.getData()).thenReturn(childData);
+ when(treeCacheEvent.getType()).thenReturn(type);
+ when(childData.getPath()).thenReturn(path);
+ when(childData.getData()).thenReturn("{}".getBytes());
+ return treeCacheEvent;
}
- @Test
- public void testWatchMetaDataWhenDataChange() throws Exception {
- final List<MetaData> subscribeList = new ArrayList<>(1);
- MetaData metaData =
MetaData.builder().id(MOCK_META_DATA_ID).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_META_DATA_PATH, metaData,
CreateMode.PERSISTENT);
- MetaDataSubscriber metaDataSubscriber = new MetaDataSubscriber() {
- @Override
- public void onSubscribe(final MetaData metaData) {
- subscribeList.add(metaData);
- }
-
- @Override
- public void unSubscribe(final MetaData metaData) {
- }
- };
- syncDataService = new ZookeeperSyncDataService(zkClient,
- null, Lists.newArrayList(metaDataSubscriber),
Collections.emptyList());
- Thread.sleep(200);
- metaData.setEnabled(true);
- zkClient.createOrUpdate(MOCK_META_DATA_PATH, metaData,
CreateMode.PERSISTENT);
- Thread.sleep(200);
- assertThat(subscribeList.size(), is(2));
- assertTrue(subscribeList.get(1).getEnabled());
- }
-
- @Test
- public void testWatchMetaDataWhenDataDeleted() throws Exception {
- final List<MetaData> unSubscribeList = new ArrayList<>(1);
- MetaData metaData =
MetaData.builder().id(MOCK_META_DATA_ID).enabled(Boolean.FALSE).build();
- zkClient.createOrUpdate(MOCK_META_DATA_PATH, metaData,
CreateMode.PERSISTENT);
- MetaDataSubscriber metaDataSubscriber = new MetaDataSubscriber() {
- @Override
- public void onSubscribe(final MetaData metaData) {
- }
-
- @Override
- public void unSubscribe(final MetaData metaData) {
- unSubscribeList.add(metaData);
- }
- };
- syncDataService = new ZookeeperSyncDataService(zkClient,
- null, Lists.newArrayList(metaDataSubscriber),
Collections.emptyList());
- Thread.sleep(200);
- zkClient.delete(MOCK_META_DATA_PATH);
- Thread.sleep(200);
- assertThat(unSubscribeList.size(), is(1));
- assertThat(unSubscribeList.get(0).getPath(), is(MOCK_META_DATA_ID));
- }
-
- @AfterEach
- public void tearDown() {
- syncDataService.close();
- }
}