/*
 * 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.Constants;
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}));
        
        refConf.setScope(Constants.SCOPE_REMOTE);
    }
    
    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();
    }
}