/*
 * 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.tamaya.management.internal;

import org.apache.tamaya.management.ConfigManagementSupport;
import org.apache.tamaya.management.ManagedConfig;
import org.apache.tamaya.management.ManagedConfigMBean;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
import java.util.Map;
import java.util.Set;

import static org.junit.Assert.*;

/**
 * Created by Anatole on 20.08.2015.
 */
public class ManagedConfigTest {

    private final ManagedConfigMBean bean = new ManagedConfig();

    @org.junit.Test
    public void testGetJsonConfigurationInfo() throws Exception {
        String info = bean.getJsonConfigurationInfo();
        assertNotNull(info);
        assertTrue(info.contains("java.version"));
        System.out.println(bean.getJsonConfigurationInfo());
    }

    @org.junit.Test
    public void testGetXmlConfigurationInfo() throws Exception {
        String info = bean.getXmlConfigurationInfo();
        assertNotNull(info);
        assertTrue(info.contains("java.version"));
        assertTrue(info.contains("<configuration>"));
        System.out.println(bean.getXmlConfigurationInfo());
    }

    @org.junit.Test
    public void testGetConfiguration() throws Exception {
        Map<String,String> config = bean.getConfiguration();
        assertNotNull(config);
        for(Map.Entry<Object, Object> en:System.getProperties().entrySet()){
            assertEquals(config.get(en.getKey()),en.getValue());
        }
    }

    @org.junit.Test
    public void testGetConfigurationArea() throws Exception {
        Map<String,String> cfg = bean.getSection("java", false);
        for(Map.Entry<String,String> en:cfg.entrySet()){
            assertEquals(System.getProperty(en.getKey()), en.getValue());
        }
    }

    @org.junit.Test
    public void testGetAreas() throws Exception {
        Set<String> sections = (bean.getSections());
        assertNotNull(sections);
        assertTrue(sections.contains("java"));
        assertTrue(sections.contains("file"));
    }

    @org.junit.Test
    public void testGetTransitiveAreas() throws Exception {
        Set<String> sections = (bean.getTransitiveSections());
        Set<String> sectionsNT = (bean.getSections());
        assertNotNull(sections);
        assertTrue(sections.contains("java"));
        assertTrue(sections.contains("sun"));
        assertTrue(sections.contains("sun.os"));
        assertTrue(sectionsNT.size()<sections.size());
    }

    @org.junit.Test
    public void testIsAreaExisting() throws Exception {
        assertTrue(bean.isAreaExisting("java"));
        assertFalse(bean.isAreaExisting("sd.fldsfl.erlwsf"));
    }

    @org.junit.Test
    public void testRegisterMBean() throws Exception {
        ObjectName on = ConfigManagementSupport.registerMBean();
        ConfigManagementSupport.registerMBean();
        // Lookup createObject name
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        assertTrue(mbs.getMBeanInfo(on)!=null);
    }

    @org.junit.Test
    public void testRegisterMBean1() throws Exception {
        ObjectName on1 = ConfigManagementSupport.registerMBean("SubContext1");
        ConfigManagementSupport.registerMBean("SubContext1");
        ObjectName on2 = ConfigManagementSupport.registerMBean("SubContext2");
        // Lookup createObject name
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        assertTrue(mbs.getMBeanInfo(on1)!=null);
        assertTrue(mbs.getMBeanInfo(on2)!=null);
    }
}