Project: components-ness-jmx
/**
 * Copyright (C) 2012 Ness Computing, Inc. 
 * 
 * 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.nesscomputing.jmx.starter.guice; 
 
import java.net.InetAddress; 
 
import javax.management.MBeanServer; 
 
import org.junit.Assert; 
import org.junit.Test; 
import org.weakref.jmx.testing.TestingMBeanServer; 
 
import com.google.inject.Binder; 
import com.google.inject.Guice; 
import com.google.inject.Inject; 
import com.google.inject.Injector; 
import com.google.inject.Module; 
import com.google.inject.Scopes; 
import com.google.inject.Stage; 
import com.nesscomputing.config.Config; 
import com.nesscomputing.config.ConfigModule; 
import com.nesscomputing.galaxy.GalaxyConfigModule; 
import com.nesscomputing.jmx.starter.JmxExporterConfig; 
import com.nesscomputing.testing.lessio.AllowNetworkListen; 
 
@AllowNetworkListen(ports={0}) 
    @Inject 
    private IOExceptionProvider<JmxExporterConfig> configProvider = null
 
    @Test 
    public void testNoConfig() throws Exception 
    { 
        final Config config = Config.getEmptyConfig(); 
        prepareGuice(config); 
 
        final JmxExporterConfig jmxConfig = configProvider.get(); 
        Assert.assertEquals(InetAddress.getByName("127.0.0.1"), jmxConfig.getHostname()); 
        Assert.assertTrue(jmxConfig.getRmiRegistryPort() > 0); 
        Assert.assertTrue(jmxConfig.getRmiServerPort() > 0); 
    } 
 
    @Test 
    public void testExplictConfig() throws Exception 
    { 
        final Config config = Config.getFixedConfig("ness.jmx.bind-address""1.2.3.4"
                                                    "ness.jmx.bind-port""65432"); 
        prepareGuice(config); 
 
        final JmxExporterConfig jmxConfig = configProvider.get(); 
        Assert.assertEquals(InetAddress.getByName("1.2.3.4"), jmxConfig.getHostname()); 
        Assert.assertEquals(65432, jmxConfig.getRmiRegistryPort().intValue()); 
        Assert.assertTrue(jmxConfig.getRmiServerPort() > 0); 
    } 
 
    @Test 
    public void testGalaxyConfig() throws Exception 
    { 
        final Config config = Config.getFixedConfig("galaxy.internal.ip""4.8.15.16"
                                                    "galaxy.private.port.jmx""2342"); 
        prepareGuice(config, new GalaxyConfigModule()); 
 
        final JmxExporterConfig jmxConfig = configProvider.get(); 
        Assert.assertEquals(InetAddress.getByName("4.8.15.16"), jmxConfig.getHostname()); 
        Assert.assertEquals(2342, jmxConfig.getRmiRegistryPort().intValue()); 
        Assert.assertTrue(jmxConfig.getRmiServerPort() > 0); 
    } 
 
    @Test 
    public void testGalaxyConfigWins() throws Exception 
    { 
        final Config config = Config.getFixedConfig("galaxy.internal.ip""4.8.15.16"
                                                    "galaxy.private.port.jmx""2342"
                                                    "ness.jmx.bind-address""1.2.3.4"
                                                    "ness.jmx.bind-port""65432"); 
        prepareGuice(config, new GalaxyConfigModule()); 
 
        final JmxExporterConfig jmxConfig = configProvider.get(); 
        Assert.assertEquals(InetAddress.getByName("4.8.15.16"), jmxConfig.getHostname()); 
        Assert.assertEquals(2342, jmxConfig.getRmiRegistryPort().intValue()); 
        Assert.assertTrue(jmxConfig.getRmiServerPort() > 0); 
    } 
 
 
    private void prepareGuice(final Config config, final Module ... modules) 
    { 
        final Injector inj = Guice.createInjector(Stage.PRODUCTION, 
                                                  new ConfigModule(config), 
                                                  new JmxStarterModule(config), 
                                                  new Module() { 
                                                      @Override 
                                                      public void configure(final Binder binder) { 
                                                          binder.disableCircularProxies(); 
                                                          binder.requireExplicitBindings(); 
                                                          binder.bind(MBeanServer.class).to(TestingMBeanServer.class).in(Scopes.SINGLETON); 
                                                          for (final Module module : modules) { 
                                                              binder.install(module); 
                                                          } 
                                                      } 
                                                  }); 
 
        inj.injectMembers(this); 
    } 
}