/*
 * Copyright 1999-2011 Alibaba Group.
 *  
 * Licensed 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 com.alibaba.dubbo.config.url.test;

import java.util.Arrays;

import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.MethodConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.api.DemoService;
import com.alibaba.dubbo.config.support.MockRegistry;
 

/**
 * @author haomin.liuhm
 *
 */
public class InvokerSideConfigUrlTest extends UrlTestBase {
    private static final Logger log = LoggerFactory.getLogger(InvokerSideConfigUrlTest.class);

    // ======================================================
    //   invoker related data preparing
    // ======================================================  
    private ApplicationConfig   appConfForConsumer;
    private ApplicationConfig   appConfForReference;
    private RegistryConfig      regConfForConsumer;
    private RegistryConfig      regConfForReference;
    private MethodConfig        methodConfForReference;
    private ConsumerConfig      consumerConf;
    private ReferenceConfig<DemoService>     refConf;
    
    private Object appConfForConsumerTable[][] = {
            {"", "", "", "", "", "", "", "", "", ""}, 
        }; 

    private Object appConfForReferenceTable[][] = {
            {"", "", "", "", "", "", "", "", "", ""}, 
        }; 
    
    private Object regConfForConsumerTable[][] = {
//            {"timeout", "registry.timeout", "int", 5000, 9000, "", "", "", "", ""}, 
//            {"file", "registry.file", "string", "", "regConfForServiceTable.log", "", "", "", "", ""}, 
//            {"wait", "registry.wait", "int", 0, 9000, "", "", "", "", ""}, 
//            {"transport", "registry.transporter", "string", "netty", "mina", "", "", "", "", ""}, 
            {"subscribe", "subscribe", "boolean", true, false, "", "", "", "", ""}, 
            {"dynamic", "dynamic", "boolean", true, false, "", "", "", "", ""},
        };
    
    private Object regConfForReferenceTable[][] = {
            {"timeout", "registry.timeout", "int", 5000, 9000, "", "", "", "", ""}, 
            {"file", "registry.file", "string", "", "regConfForServiceTable.log", "", "", "", "", ""}, 
            {"wait", "registry.wait", "int", 0, 9000, "", "", "", "", ""}, 
            {"transport", "registry.transporter", "string", "netty", "mina", "", "", "", "", ""}, 
            {"subscribe", "subscribe", "boolean", true, false, "", "", "", "", ""}, 
            {"dynamic", "dynamic", "boolean", true, false, "", "", "", "", ""},
        };
    
    private Object methodConfForReferenceTable[][] = {
            {"actives", "eatTiger.actives", "int", 0, 90, "", "", "", "", ""}, 
            {"executes", "eatTiger.executes", "int", 0, 90, "", "", "", "", ""}, 
            {"deprecated", "eatTiger.deprecated", "boolean", false, true, "", "", "", "", ""}, 
            {"async", "eatTiger.async", "boolean", false, true, "", "", "", "", ""}, 
            {"timeout", "eatTiger.timeout", "int", 0, 90, "", "", "", "", ""}, 
        };
    
    private Object refConfTable[][] = {
//            {"version", "version", "string", "0.0.0", "1.2.3", "", "", "", "", ""}, 
//            {"group", "group", "string", "", "HaominTest", "", "", "", "", ""}, 
            
//            {"delay", "delay", "int", 0, 5, "", "", "", "", ""}, // not boolean 
            {"timeout", "timeout", "int", 5000, 3000, "", "", "", "", ""}, 
            {"retries", "retries", "int", 2, 5, "", "", "", "", ""}, 
            {"connections", "connections", "boolean", 100, 20, "", "", "", "", ""}, 
            {"loadbalance", "loadbalance", "string", "random", "roundrobin", "leastactive", "", "", ""}, 
            {"async", "async", "boolean", false, true, "", "", "", "", ""}, 
            //excluded = true
//            {"generic", "generic", "boolean", false, true, "", "", "", "", ""},  
            {"check", "check", "boolean", false, true, "", "", "", "", ""}, 
            //{"local", "local", "string", "false", "HelloServiceLocal", "true", "", "", "", ""}, 
            //{"local", "local", "string", "false", "true", "", "", "", "", ""}, 
            //{"mock", "mock", "string", "false", "dubbo.test.HelloServiceMock", "true", "", "", "", ""}, 
            {"mock", "mock", "string", "false", "false", "", "", "", "", ""}, 
            {"proxy", "proxy", "boolean", "javassist", "jdk", "", "", "", "", ""}, 
            {"client", "client", "string", "netty", "mina", "", "", "", "", ""}, 
            {"client", "client", "string", "netty", "mina", "", "", "", "", ""}, 
            {"owner", "owner", "string", "", "haomin/ludvik", "", "", "", "", ""}, 
            {"actives", "actives", "int", 0, 30, "", "", "", "", ""},
            {"cluster", "cluster", "string", "failover", "failfast", "failsafe", "failback", "forking", "", ""}, 
            //excluded = true
//            {"filter", "service.filter", "string", "default", "-generic", "", "", "", "", ""}, 
            //excluded = true
//            {"listener", "exporter.listener", "string", "default", "-deprecated", "", "", "", "", ""}, 
            //{"", "", "", "", "", "", "", "", "", ""}, 
        }; 
    
    private Object consumerConfTable[][] = {
            {"timeout", "default.timeout", "int", 5000, 8000, "", "", "", "", ""}, 
            {"retries", "default.retries", "int", 2, 5, "", "", "", "", ""}, 
            {"loadbalance", "default.loadbalance", "string", "random", "leastactive", "", "", "", "", ""}, 
            {"async", "default.async", "boolean", false, true, "", "", "", "", ""}, 
            {"connections", "default.connections", "int", 100, 5, "", "", "", "", ""}, 
//            {"generic", "generic", "boolean", false, false, "", "", "", "", ""}, 
            {"check", "check", "boolean", true, false, "", "", "", "", ""}, 
            {"proxy", "proxy", "string", "javassist", "jdk", "javassist", "", "", "", ""}, 
            {"owner", "owner", "string", "", "haomin", "", "", "", "", ""}, 
            {"actives", "default.actives", "int", 0, 5, "", "", "", "", ""}, 
            {"cluster", "default.cluster", "string", "failover", "forking", "", "", "", "", ""}, 
            {"filter", "", "string", "", "", "", "", "", "", ""}, 
            {"listener", "", "string", "", "", "", "", "", "", ""}, 
//            {"", "", "", "", "", "", "", "", "", ""}, 
        }; 
    
    // ======================================================
    //   test Start
    // ====================================================== 
    
    @BeforeClass
    public static void start(){
        
        //RegistryController.startRegistryIfAbsence(1);
    }
    
    
    @Before
    public void setUp(){
        
        initServConf();
        initRefConf();
        
        return;
    }
    
    @After()
    public void teardown() {

        //RegistryServer.reloadCache();
    }
    
    
    @Test
    public void consumerConfUrlTest(){
        verifyInvokerUrlGeneration(consumerConf, consumerConfTable);
    }
    
    @Test
    public void refConfUrlTest(){
        verifyInvokerUrlGeneration(refConf, refConfTable);
    }
    
    @Ignore
    @Test //注册中心的参数不会在与consumer的query merge
    public void regConfForConsumerUrlTest(){
        
        verifyInvokerUrlGeneration(regConfForConsumer, regConfForConsumerTable);
        
    }
    
    // ======================================================
    //   private helper
    // ====================================================== 
    private void initRefConf(){
        
        appConfForConsumer      = new ApplicationConfig();
        appConfForReference     = new ApplicationConfig();
        regConfForConsumer      = new RegistryConfig();
        regConfForReference     = new RegistryConfig();
        methodConfForReference  = new MethodConfig();
        
        refConf                 = new ReferenceConfig<DemoService>();
        consumerConf            = new ConsumerConfig();

        methodConfForReference.setName("sayName");
        regConfForReference.setAddress("127.0.0.1:9090");
        regConfForReference.setProtocol("mockregistry");
        appConfForReference.setName("ConfigTests");
        refConf.setInterface("com.alibaba.dubbo.config.api.DemoService");
        
        refConf.setApplication(appConfForReference);
        consumerConf.setApplication(appConfForConsumer);
        
        refConf.setRegistry(regConfForReference);
        consumerConf.setRegistry(regConfForConsumer);
        
        refConf.setConsumer(consumerConf);
        
        refConf.setMethods(Arrays.asList(new MethodConfig[]{methodConfForReference}));
    }
    
    private <T> void verifyInvokerUrlGeneration(T config, Object[][] dataTable){
        servConf.export();
        
        fillConfigs(config, dataTable, TESTVALUE1);
        refConf.get();
        
        String subScribedUrlStr = getSubscribedUrlString();
        
        System.out.println("url string=========:"+subScribedUrlStr);
        String configName = config.getClass().getName();
        int column = TESTVALUE1;
        
        assertUrlStringWithLocalTable(subScribedUrlStr, dataTable, configName, column);
        
        //重新refer会判断如果已经订阅过，不再重新订阅。
        try {
            refConf.destroy();
        } catch (Exception e) {
        }
    }

    private String getSubscribedUrlString() {
        return MockRegistry.getSubscribedUrl().toString();
    }
}