/* Copyright 2012 Google, 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 org.arbeitspferde.groningen.config;
import org.arbeitspferde.groningen.exceptions.InvalidConfigurationException;
import org.arbeitspferde.groningen.proto.GroningenConfigProto.ProgramConfiguration;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import java.io.IOException;
/**
* Tests for {@link ProtoBufConfigManager}.
*/
public class ProtoBufConfigManagerTest extends TestCase {
ProtoBufSource source;
ProtoBufConfigManager.ProtoBufConfigFactory configFactory;
@Override
protected void setUp() throws Exception {
super.setUp();
source = EasyMock.createMock(ProtoBufSource.class);
configFactory = EasyMock.createMock(ProtoBufConfigManager.ProtoBufConfigFactory.class);
}
public void testInitializeWithValidConfig() throws Exception {
ProtoBufConfigManager manager = new ProtoBufConfigManager(source, configFactory);
ProgramConfiguration progConfig = ProgramConfiguration.newBuilder().build();
ProtoBufConfig protoBufConfig = EasyMock.createMock(ProtoBufConfig.class);
source.initialize();
source.register(manager);
EasyMock.expect(source.getConfigData()).andReturn(progConfig);
EasyMock.expect(configFactory.create(progConfig)).andReturn(protoBufConfig);
EasyMock.replay(source);
EasyMock.replay(configFactory);
EasyMock.replay(protoBufConfig);
manager.initialize();
}
public void testInitializeWithSourceInitializeThrowingIOException() throws Exception {
ProtoBufConfigManager manager = new ProtoBufConfigManager(source, configFactory);
source.initialize();
EasyMock.expectLastCall().andThrow(new IOException());
EasyMock.replay(source);
EasyMock.replay(configFactory);
try {
manager.initialize();
fail("failed to propagate exception up");
} catch (IOException expected) {
// correct for this test
}
}
public void testInitializeWithFactoryThrowInvalidConfigurationException() throws Exception {
ProtoBufConfigManager manager = new ProtoBufConfigManager(source, configFactory);
ProgramConfiguration progConfig = ProgramConfiguration.newBuilder().build();
source.initialize();
source.register(manager);
EasyMock.expect(source.getConfigData()).andReturn(progConfig);
EasyMock.expect(configFactory.create(progConfig))
.andThrow(new InvalidConfigurationException());
EasyMock.replay(source);
EasyMock.replay(configFactory);
try {
manager.initialize();
fail("failed to propagate exception up");
} catch (InvalidConfigurationException expected) {
// invalid configuration exceptions should be propagated up and not swallowed on
// initialization only
}
}
public void testShutdown() throws Exception {
ProtoBufConfigManager manager = new ProtoBufConfigManager(source, configFactory);
EasyMock.expect(source.deregister(manager)).andReturn(true);
source.shutdown();
EasyMock.replay(source);
EasyMock.replay(configFactory);
manager.shutdown();
// shouldn't error if we call it again
manager.shutdown();
}
public void testHandleProtoBufUpdateWithMultipleValidProtos() throws Exception {
ProtoBufConfigManager manager = new ProtoBufConfigManager(source, configFactory);
// make a few pairs of ProgramConfigurations and ProtoBufConfig so we can exercise the
// update functionality
ProgramConfiguration progConfig1 = ProgramConfiguration.newBuilder().build();
ProtoBufConfig protoBufConfig1 = EasyMock.createMock(ProtoBufConfig.class);
ProgramConfiguration progConfig2 = ProgramConfiguration.newBuilder().build();
ProtoBufConfig protoBufConfig2 = EasyMock.createMock(ProtoBufConfig.class);
EasyMock.expect(configFactory.create(progConfig1)).andReturn(protoBufConfig1);
EasyMock.expect(configFactory.create(progConfig2)).andReturn(protoBufConfig2);
EasyMock.replay(source);
EasyMock.replay(configFactory);
EasyMock.replay(protoBufConfig1);
EasyMock.replay(protoBufConfig2);
manager.handleProtoBufUpdate(progConfig1);
assertEquals("Initial update", protoBufConfig1, manager.queryConfig());
manager.handleProtoBufUpdate(progConfig2);
assertEquals("Second update", protoBufConfig2, manager.queryConfig());
}
public void testHandleProtoBufUpdateWithBothGoodAndBadProto() throws Exception {
ProtoBufConfigManager manager = new ProtoBufConfigManager(source, configFactory);
// make a few pairs of ProgramConfigurations and ProtoBufConfig so we can exercise the
// update functionality
ProgramConfiguration progConfig1 = ProgramConfiguration.newBuilder().build();
ProtoBufConfig protoBufConfig1 = EasyMock.createMock(ProtoBufConfig.class);
ProgramConfiguration progConfig2 = ProgramConfiguration.newBuilder().build();
ProgramConfiguration progConfig3 = ProgramConfiguration.newBuilder().build();
ProtoBufConfig protoBufConfig3 = EasyMock.createMock(ProtoBufConfig.class);
EasyMock.expect(configFactory.create(progConfig1)).andReturn(protoBufConfig1);
EasyMock.expect(configFactory.create(progConfig2))
.andThrow(new InvalidConfigurationException());
EasyMock.expect(configFactory.create(progConfig3)).andReturn(protoBufConfig3);
EasyMock.replay(source);
EasyMock.replay(configFactory);
EasyMock.replay(protoBufConfig1);
EasyMock.replay(protoBufConfig3);
manager.handleProtoBufUpdate(progConfig1);
assertEquals("Initial update", protoBufConfig1, manager.queryConfig());
// this should generate some noise in the logs
manager.handleProtoBufUpdate(progConfig2);
assertEquals("Second update", protoBufConfig1, manager.queryConfig());
manager.handleProtoBufUpdate(progConfig3);
assertEquals("Second update", protoBufConfig3, manager.queryConfig());
}
}