/* * Copyright 2016 the original author or authors. * * 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 io.atomix.manager.options; import io.atomix.catalyst.transport.netty.NettyTransport; import io.atomix.catalyst.transport.Transport; import io.atomix.catalyst.util.PropertiesReader; import io.atomix.copycat.client.CopycatClient; import io.atomix.copycat.server.storage.StorageLevel; import io.atomix.resource.*; import org.testng.annotations.Test; import java.io.File; import java.time.Duration; import java.util.Properties; import static org.testng.Assert.*; /** * Server properties test. * * @author <a href="http://github.com/kuujo>Jordan Halterman</a> */ @Test public class ServerOptionsTest { /** * Tests default server properties. */ public void testPropertyDefaults() { ServerOptions options = new ServerOptions(new Properties()); assertTrue(options.transport() instanceof NettyTransport); assertEquals(options.electionTimeout(), Duration.ofMillis(500)); assertEquals(options.heartbeatInterval(), Duration.ofMillis(250)); assertEquals(options.sessionTimeout(), Duration.ofSeconds(5)); assertEquals(options.storageDirectory(), new File(System.getProperty("user.dir"))); assertEquals(options.storageLevel(), StorageLevel.DISK); assertEquals(options.maxSegmentSize(), 1024 * 1024 * 32); assertEquals(options.maxEntriesPerSegment(), 1024 * 1024); assertFalse(options.retainStaleSnapshots()); assertEquals(options.compactionThreads(), Runtime.getRuntime().availableProcessors() / 2); assertEquals(options.minorCompactionInterval(), Duration.ofMinutes(1)); assertEquals(options.majorCompactionInterval(), Duration.ofHours(1)); assertEquals(options.compactionThreshold(), 0.5); assertFalse(options.serializer().isWhitelistRequired()); } /** * Tests reading properties. */ public void testProperties() { Properties properties = new Properties(); properties.setProperty("server.address", "localhost:5000"); properties.setProperty("cluster.seed.1", "localhost:5000"); properties.setProperty("cluster.seed.2", "localhost:5001"); properties.setProperty("cluster.seed.3", "localhost:5002"); properties.setProperty("server.transport", "io.atomix.catalyst.transport.netty.NettyTransport"); properties.setProperty("server.transport.threads", "1"); properties.setProperty("raft.electionTimeout", "200"); properties.setProperty("raft.heartbeatInterval", "100"); properties.setProperty("raft.sessionTimeout", "1000"); properties.setProperty("storage.directory", "test"); properties.setProperty("storage.level", "MEMORY"); properties.setProperty("storage.maxSegmentSize", "1024"); properties.setProperty("storage.maxEntriesPerSegment", "1024"); properties.setProperty("storage.compaction.maxSnapshotSize", "1024"); properties.setProperty("storage.compaction.retainSnapshots", "true"); properties.setProperty("storage.compaction.threads", "1"); properties.setProperty("storage.compaction.minor", "1000"); properties.setProperty("storage.compaction.major", "10000"); properties.setProperty("storage.compaction.threshold", "0.2"); properties.setProperty("serializer.whitelist", "false"); properties.setProperty("resource.test", "io.atomix.manager.options.ServerOptionsTest$TestResource"); ServerOptions config = new ServerOptions(properties); Transport transport = config.transport(); assertTrue(transport instanceof NettyTransport); assertEquals(((NettyTransport) transport).properties().threads(), 1); assertEquals(config.electionTimeout(), Duration.ofMillis(200)); assertEquals(config.heartbeatInterval(), Duration.ofMillis(100)); assertEquals(config.sessionTimeout(), Duration.ofMillis(1000)); assertEquals(config.storageDirectory(), new File("test")); assertEquals(config.storageLevel(), StorageLevel.MEMORY); assertEquals(config.maxSegmentSize(), 1024); assertEquals(config.maxEntriesPerSegment(), 1024); assertTrue(config.retainStaleSnapshots()); assertEquals(config.compactionThreads(), 1); assertEquals(config.minorCompactionInterval(), Duration.ofSeconds(1)); assertEquals(config.majorCompactionInterval(), Duration.ofSeconds(10)); assertEquals(config.compactionThreshold(), 0.2); assertFalse(config.serializer().isWhitelistRequired()); assertEquals(config.resourceTypes().size(), 1); assertEquals(config.resourceTypes().iterator().next().id(), 1); } /** * Tests reading properties from a file. */ public void testPropertiesFile() { ServerOptions config = new ServerOptions( PropertiesReader.loadFromClasspath("server-test.properties").properties()); assertTrue(config.transport() instanceof NettyTransport); assertEquals(((NettyTransport) config.transport()).properties().threads(), 1); assertEquals(config.electionTimeout(), Duration.ofMillis(200)); assertEquals(config.heartbeatInterval(), Duration.ofMillis(100)); assertEquals(config.sessionTimeout(), Duration.ofMillis(1000)); assertEquals(config.storageDirectory(), new File("test")); assertEquals(config.storageLevel(), StorageLevel.MEMORY); assertEquals(config.maxSegmentSize(), 1024); assertEquals(config.maxEntriesPerSegment(), 1024); assertTrue(config.retainStaleSnapshots()); assertEquals(config.compactionThreads(), 1); assertEquals(config.minorCompactionInterval(), Duration.ofSeconds(1)); assertEquals(config.majorCompactionInterval(), Duration.ofSeconds(10)); assertEquals(config.compactionThreshold(), 0.2); assertFalse(config.serializer().isWhitelistRequired()); assertEquals(config.resourceTypes().size(), 1); assertEquals(config.resourceTypes().iterator().next().id(), 1); } @ResourceTypeInfo(id=1, factory=TestResourceFactory.class) public static class TestResource extends AbstractResource<TestResource> { public TestResource(CopycatClient client, ResourceType type, Properties options) { super(client, type, options); } } public static class TestResourceFactory implements ResourceFactory<TestResource> { @Override public ResourceStateMachine createStateMachine(Properties config) { return null; } @Override public TestResource createInstance(CopycatClient client, Properties options) { return null; } } }