///*
// * 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.configcenter.consul;
//
//import org.apache.dubbo.common.URL;
//
//import com.google.common.net.HostAndPort;
//import com.orbitz.consul.Consul;
//import com.orbitz.consul.KeyValueClient;
//import com.orbitz.consul.cache.KVCache;
//import com.orbitz.consul.model.kv.Value;
//import com.pszymczyk.consul.ConsulProcess;
//import com.pszymczyk.consul.ConsulStarterBuilder;
//import org.junit.jupiter.api.AfterAll;
//import org.junit.jupiter.api.Assertions;
//import org.junit.jupiter.api.BeforeAll;
//import org.junit.jupiter.api.Test;
//
//import java.util.Arrays;
//import java.util.Optional;
//import java.util.TreeSet;
//
//import static org.junit.jupiter.api.Assertions.assertEquals;
//
///**
// *
// */
//public class ConsulDynamicConfigurationTest {
//
//    private static ConsulProcess consul;
//    private static URL configCenterUrl;
//    private static ConsulDynamicConfiguration configuration;
//
//    private static Consul client;
//    private static KeyValueClient kvClient;
//
//    @BeforeAll
//    public static void setUp() throws Exception {
//        consul = ConsulStarterBuilder.consulStarter()
//                .build()
//                .start();
//        configCenterUrl = URL.valueOf("consul://127.0.0.1:" + consul.getHttpPort());
//
//        configuration = new ConsulDynamicConfiguration(configCenterUrl);
//        client = Consul.builder().withHostAndPort(HostAndPort.fromParts("127.0.0.1", consul.getHttpPort())).build();
//        kvClient = client.keyValueClient();
//    }
//
//    @AfterAll
//    public static void tearDown() throws Exception {
//        consul.close();
//        configuration.close();
//    }
//
//    @Test
//    public void testGetConfig() {
//        kvClient.putValue("/dubbo/config/dubbo/foo", "bar");
//        // test equals
//        assertEquals("bar", configuration.getConfig("foo", "dubbo"));
//        // test does not block
//        assertEquals("bar", configuration.getConfig("foo", "dubbo"));
//        Assertions.assertNull(configuration.getConfig("not-exist", "dubbo"));
//    }
//
//    @Test
//    public void testPublishConfig() {
//        configuration.publishConfig("value", "metadata", "1");
//        // test equals
//        assertEquals("1", configuration.getConfig("value", "/metadata"));
//        assertEquals("1", kvClient.getValueAsString("/dubbo/config/metadata/value").get());
//    }
//
//    @Test
//    public void testAddListener() {
//        KVCache cache = KVCache.newCache(kvClient, "/dubbo/config/dubbo/foo");
//        cache.addListener(newValues -> {
//            // Cache notifies all paths with "foo" the root path
//            // If you want to watch only "foo" value, you must filter other paths
//            Optional<Value> newValue = newValues.values().stream()
//                    .filter(value -> value.getKey().equals("foo"))
//                    .findAny();
//
//            newValue.ifPresent(value -> {
//                // Values are encoded in key/value store, decode it if needed
//                Optional<String> decodedValue = newValue.get().getValueAsString();
//                decodedValue.ifPresent(v -> System.out.println(String.format("Value is: %s", v))); //prints "bar"
//            });
//        });
//        cache.start();
//
//        kvClient.putValue("/dubbo/config/dubbo/foo", "new-value");
//        kvClient.putValue("/dubbo/config/dubbo/foo/sub", "sub-value");
//        kvClient.putValue("/dubbo/config/dubbo/foo/sub2", "sub-value2");
//        kvClient.putValue("/dubbo/config/foo", "parent-value");
//
//        System.out.println(kvClient.getKeys("/dubbo/config/dubbo/foo"));
//        System.out.println(kvClient.getKeys("/dubbo/config"));
//        System.out.println(kvClient.getValues("/dubbo/config/dubbo/foo"));
//    }
//
//    @Test
//    public void testGetConfigKeys() {
//        configuration.publishConfig("v1", "metadata", "1");
//        configuration.publishConfig("v2", "metadata", "2");
//        configuration.publishConfig("v3", "metadata", "3");
//        // test equals
//        assertEquals(new TreeSet(Arrays.asList("v1", "v2", "v3")), configuration.getConfigKeys("metadata"));
//    }
//}
