unit test (#268)

* unit test

* add Apache license & remove *
diff --git a/dubbo-admin-backend/src/test/java/org/apache/dubbo/admin/common/util/CoderUtilTest.java b/dubbo-admin-backend/src/test/java/org/apache/dubbo/admin/common/util/CoderUtilTest.java
new file mode 100644
index 0000000..7c9daf5
--- /dev/null
+++ b/dubbo-admin-backend/src/test/java/org/apache/dubbo/admin/common/util/CoderUtilTest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.dubbo.admin.common.util;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Java6Assertions.fail;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+public class CoderUtilTest {
+
+    @Test
+    public void MD5_16bit() {
+        assertNull(CoderUtil.MD5_16bit(null));
+
+        String input = "dubbo";
+        String output = "2CC9DEED96FE012E";
+        assertEquals(output, CoderUtil.MD5_16bit(input));
+    }
+
+    @Test
+    public void MD5_32bit() {
+        String input = null;
+        assertNull(CoderUtil.MD5_32bit(input));
+
+        input = "dubbo";
+        String output = "AA4E1B8C2CC9DEED96FE012EF2E0752A";
+        assertEquals(output, CoderUtil.MD5_32bit(input));
+    }
+
+    @Test
+    public void MD5_32bit1() {
+        byte[] input = null;
+        assertNull(CoderUtil.MD5_32bit(input));
+
+        input = "dubbo".getBytes();
+        String output = "AA4E1B8C2CC9DEED96FE012EF2E0752A";
+        assertEquals(output, CoderUtil.MD5_32bit(input));
+    }
+
+    @Test
+    public void decodeBase64() {
+        try {
+            CoderUtil.decodeBase64(null);
+            fail("when param is null, this should throw exception");
+        } catch (Exception e) {
+        }
+
+        String input = "ZHViYm8=";
+        String output = "dubbo";
+        assertEquals(output, CoderUtil.decodeBase64(input));
+    }
+}
\ No newline at end of file
diff --git a/dubbo-admin-backend/src/test/java/org/apache/dubbo/admin/service/RegistryServerSyncTest.java b/dubbo-admin-backend/src/test/java/org/apache/dubbo/admin/service/RegistryServerSyncTest.java
new file mode 100644
index 0000000..45e2747
--- /dev/null
+++ b/dubbo-admin-backend/src/test/java/org/apache/dubbo/admin/service/RegistryServerSyncTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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.dubbo.admin.service;
+
+import org.apache.dubbo.admin.common.util.Constants;
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.registry.Registry;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+public class RegistryServerSyncTest {
+
+    @Mock
+    private Registry registry;
+
+    @InjectMocks
+    private RegistryServerSync registryServerSync;
+
+    @Test
+    public void testGetRegistryCache() {
+        registryServerSync.getRegistryCache();
+    }
+
+    @Test
+    public void testAfterPropertiesSet() throws Exception {
+        registryServerSync.afterPropertiesSet();
+        verify(registry).subscribe(any(URL.class), any(RegistryServerSync.class));
+    }
+
+    @Test
+    public void testDestroy() throws Exception {
+        registryServerSync.destroy();
+        verify(registry).unsubscribe(any(URL.class), any(RegistryServerSync.class));
+    }
+
+    @Test
+    public void testNotify() {
+        registryServerSync.notify(null);
+        registryServerSync.notify(Collections.emptyList());
+
+        // when url.getProtocol is not empty protocol
+        URL consumerUrl = mock(URL.class);
+        URL providerUrl = mock(URL.class);
+
+        when(consumerUrl.getParameter(Constants.CATEGORY_KEY, Constants.PROVIDERS_CATEGORY)).thenReturn(org.apache.dubbo.common.Constants.CONSUMER_PROTOCOL);
+        when(consumerUrl.getServiceInterface()).thenReturn("org.apache.dubbo.consumer");
+        when(consumerUrl.getServiceKey()).thenReturn("org.apache.dubbo.consumer");
+        when(consumerUrl.toFullString()).thenReturn("consumer://192.168.1.10/sunbufu.dubbo.consumer?application=dubbo&category=consumer&check=false&dubbo=2.7.0&interface=sunbufu.dubbo.consumer&loadbalabce=roundrobin&mehods=sayHi,sayGoodBye&owner=sunbufu&pid=18&protocol=dubbo&side=consumer&timeout=3000&timestamp=1548127407769");
+        when(providerUrl.getParameter(Constants.CATEGORY_KEY, Constants.PROVIDERS_CATEGORY)).thenReturn(org.apache.dubbo.common.Constants.PROVIDER_PROTOCOL);
+        when(providerUrl.getServiceInterface()).thenReturn("org.apache.dubbo.provider");
+        when(providerUrl.getServiceKey()).thenReturn("org.apache.dubbo.provider");
+        when(providerUrl.toFullString()).thenReturn("consumer://192.168.1.10/sunbufu.dubbo.consumer?application=dubbo&category=consumer&check=false&dubbo=2.6.2&interface=sunbufu.dubbo.consumer&loadbalabce=roundrobin&mehods=sayHi,sayGoodBye&owner=sunbufu&pid=18&protocol=dubbo&side=consumer&timeout=3000&timestamp=1548127407769");
+
+        registryServerSync.notify(Arrays.asList(consumerUrl, consumerUrl, providerUrl));
+
+        ConcurrentMap<String, Map<String, URL>> consumerMap = registryServerSync.getRegistryCache().get(org.apache.dubbo.common.Constants.CONSUMER_PROTOCOL);
+        assertTrue(consumerMap.keySet().contains("org.apache.dubbo.consumer"));
+        ConcurrentMap<String, Map<String, URL>> providerMap = registryServerSync.getRegistryCache().get(org.apache.dubbo.common.Constants.PROVIDER_PROTOCOL);
+        assertTrue(providerMap.keySet().contains("org.apache.dubbo.provider"));
+
+        // when url.getProtocol is empty protocol
+        when(consumerUrl.getProtocol()).thenReturn(org.apache.dubbo.common.Constants.EMPTY_PROTOCOL);
+        when(consumerUrl.getParameter(Constants.GROUP_KEY)).thenReturn("dubbo");
+        when(consumerUrl.getParameter(Constants.VERSION_KEY)).thenReturn("2.7.0");
+        registryServerSync.notify(Collections.singletonList(consumerUrl));
+
+        assertTrue(!consumerMap.keySet().contains("org.apache.dubbo.consumer"));
+
+        // when url's group or version is ANY_VALUE (*)
+        when(providerUrl.getProtocol()).thenReturn(org.apache.dubbo.common.Constants.EMPTY_PROTOCOL);
+        when(providerUrl.getParameter(Constants.GROUP_KEY)).thenReturn(Constants.ANY_VALUE);
+        registryServerSync.notify(Collections.singletonList(providerUrl));
+
+        assertTrue(!providerMap.keySet().contains("org.apache.dubbo.provider"));
+    }
+}
\ No newline at end of file