/* * Copyright 2011-2014 Proofpoint, 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.proofpoint.event.collector; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.proofpoint.configuration.testing.ConfigAssertions; import com.proofpoint.units.DataSize; import com.proofpoint.units.Duration; import org.testng.annotations.Test; import javax.validation.constraints.AssertTrue; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; import java.io.File; import java.util.Map; import java.util.concurrent.TimeUnit; import static com.proofpoint.testing.ValidationAssertions.assertFailsValidation; import static com.proofpoint.testing.ValidationAssertions.assertValidates; public class TestServerConfig { @Test public void testDefaults() { ConfigAssertions.assertRecordedDefaults(ConfigAssertions.recordDefaults(ServerConfig.class) .setAcceptedEventTypes("") .setMaxBufferTime(new Duration(1, TimeUnit.MINUTES)) .setTargetFileSize(new DataSize(512, DataSize.Unit.MEGABYTE)) .setLocalStagingDirectory(new File("staging")) .setCombinerMetadataDirectory(new File("combiner-metadata")) .setMaxUploadThreads(10) .setAwsAccessKey(null) .setAwsSecretKey(null) .setS3StagingLocation(null) .setS3DataLocation(null) .setS3MetadataLocation(null) .setCombinerEnabled(false) .setCombinerStartDaysAgo(14) .setCombinerEndDaysAgo(-1) .setCombinerDateRangeLimitDisabled(false) .setCombinerThreadCount(5) .setCombinerHighPriorityEventTypes("") .setCombinerLowPriorityEventTypes("") .setRetryPeriod(new Duration(5, TimeUnit.MINUTES)) .setRetryDelay(new Duration(0, TimeUnit.MINUTES)) .setCombinerGroupId("default") .setServiceType("collector") ); } @Test public void testExplicitPropertyMappings() { Map<String, String> properties = new ImmutableMap.Builder<String, String>() .put("collector.accepted-event-types", "Foo,Bar") .put("collector.max-buffer-time", "2h") .put("collector.target-file-size", "768MB") .put("collector.local-staging-directory", "testdir") .put("collector.combiner.metadata-directory", "test-combiner") .put("collector.max-upload-threads", "42") .put("collector.aws-access-key", "my-access-key") .put("collector.aws-secret-key", "my-secret-key") .put("collector.s3-staging-location", "s3://example-staging/") .put("collector.s3-data-location", "s3://example-data/") .put("collector.s3-metadata-location", "s3://example-metadata/") .put("collector.combiner.enabled", "true") .put("collector.combiner.days-ago-to-start", "10") .put("collector.combiner.days-ago-to-end", "1") .put("collector.combiner.disable-date-range-limit", "true") .put("collector.combiner.thread-count", "10") .put("collector.combiner.high-priority-event-types", ", TypeA , , TypeB,TypeB,") .put("collector.combiner.low-priority-event-types", ", TypeC , ,TypeD,") .put("collector.retry-period", "10m") .put("collector.retry-delay", "4m") .put("collector.combiner.group-id", "someGroupId") .put("collector.service-type", "collector-at1") .build(); ServerConfig expected = new ServerConfig() .setAcceptedEventTypes(ImmutableSet.of("Foo", "Bar")) .setMaxBufferTime(new Duration(2, TimeUnit.HOURS)) .setTargetFileSize(new DataSize(768, DataSize.Unit.MEGABYTE)) .setLocalStagingDirectory(new File("testdir")) .setCombinerMetadataDirectory(new File("test-combiner")) .setMaxUploadThreads(42) .setAwsAccessKey("my-access-key") .setAwsSecretKey("my-secret-key") .setS3StagingLocation("s3://example-staging/") .setS3DataLocation("s3://example-data/") .setS3MetadataLocation("s3://example-metadata/") .setCombinerEnabled(true) .setCombinerStartDaysAgo(10) .setCombinerEndDaysAgo(1) .setCombinerDateRangeLimitDisabled(true) .setCombinerThreadCount(10) .setCombinerHighPriorityEventTypes(ImmutableSet.of("TypeA", "TypeB")) .setCombinerLowPriorityEventTypes(ImmutableSet.of("TypeC", "TypeD")) .setRetryPeriod(new Duration(10, TimeUnit.MINUTES)) .setRetryDelay(new Duration(4, TimeUnit.MINUTES)) .setCombinerGroupId("someGroupId") .setServiceType("collector-at1"); ConfigAssertions.assertFullMapping(properties, expected); } @Test public void testDeprecatedProperties() { Map<String, String> currentProperties = new ImmutableMap.Builder<String, String>() .put("collector.accepted-event-types", "Foo,Bar") .put("collector.max-buffer-time", "2h") .put("collector.target-file-size", "768MB") .put("collector.local-staging-directory", "testdir") .put("collector.combiner.metadata-directory", "test-combiner") .put("collector.max-upload-threads", "42") .put("collector.aws-access-key", "my-access-key") .put("collector.aws-secret-key", "my-secret-key") .put("collector.s3-staging-location", "s3://example-staging/") .put("collector.s3-data-location", "s3://example-data/") .put("collector.s3-metadata-location", "s3://example-metadata/") .put("collector.combiner.enabled", "true") .put("collector.combiner.days-ago-to-start", "10") .put("collector.combiner.days-ago-to-end", "1") .put("collector.combiner.disable-date-range-limit", "true") .put("collector.retry-period", "10m") .put("collector.retry-delay", "4m") .put("collector.combiner.group-id", "someGroupId") .build(); Map<String, String> oldProperties = new ImmutableMap.Builder<String, String>() .put("collector.accepted-event-types", "Foo,Bar") .put("collector.max-buffer-time", "2h") .put("collector.target-file-size", "768MB") .put("collector.local-staging-directory", "testdir") .put("collector.combiner.metadata-directory", "test-combiner") .put("collector.max-upload-threads", "42") .put("collector.aws-access-key", "my-access-key") .put("collector.aws-secret-key", "my-secret-key") .put("collector.s3-staging-location", "s3://example-staging/") .put("collector.s3-data-location", "s3://example-data/") .put("collector.s3-metadata-location", "s3://example-metadata/") .put("collector.combiner.enabled", "true") .put("collector.combiner.max-days-back", "10") .put("collector.combiner.days-ago-to-end", "1") .put("collector.combiner.disable-date-range-limit", "true") .put("collector.retry-period", "10m") .put("collector.retry-delay", "4m") .put("collector.combiner.group-id", "someGroupId") .build(); ConfigAssertions.assertLegacyEquivalence(ServerConfig.class, currentProperties, oldProperties); } @Test public void testValidations() { assertFailsValidation(new ServerConfig().setCombinerStartDaysAgo(1).setCombinerEndDaysAgo(1), "combinerStartEndDaysSane", "must be true", AssertTrue.class); assertFailsValidation(new ServerConfig().setCombinerGroupId(null), "combinerGroupId", "may not be null", NotNull.class); assertFailsValidation(new ServerConfig().setCombinerGroupId(""), "combinerGroupId", "must be non-empty", Size.class); assertFailsValidation(new ServerConfig().setCombinerThreadCount(0), "combinerThreadCount", "must be greater than or equal to 1", Min.class); assertFailsValidation(new ServerConfig().setCombinerHighPriorityEventTypes(ImmutableSet.of("TypeA", "TypeB")).setCombinerLowPriorityEventTypes(ImmutableSet.of("TypeB", "TypeC")), "highAndLowPriorityEventTypesDisjoint", "High- and Low-Priority event type lists must be disjoint.", AssertTrue.class); assertValidates(new ServerConfig() .setLocalStagingDirectory(new File("testdir")) .setAwsAccessKey("my-access-key") .setAwsSecretKey("my-secret-key") .setS3StagingLocation("s3://example-staging/") .setS3DataLocation("s3://example-data/") .setS3MetadataLocation("s3://example-metadata/") .setCombinerGroupId("someGroupId")); } @Test public void testS3LocationValidation() { // TODO: make these tests work // assertS3LocationValidates("s3://example-location/"); // assertS3LocationValidates("s3://example/foo/"); // assertS3LocationValidates("s3://example/foo/bar/"); // assertS3LocationValidates("s3://example/foo/bar/blah/"); assertS3LocationFailsValidation("s3://example-location"); assertS3LocationFailsValidation("s3://example!/"); assertS3LocationFailsValidation("s3://example/foo_bar/"); assertS3LocationFailsValidation("s3://example/foo//bar/"); assertS3LocationFailsValidation("s3://example/foo.bar/"); } private static void assertS3LocationValidates(String location) { assertValidates(new ServerConfig().setS3StagingLocation(location)); assertValidates(new ServerConfig().setS3DataLocation(location)); } private static void assertS3LocationFailsValidation(String location) { assertFailsValidation(new ServerConfig().setS3StagingLocation(location), "s3StagingLocation", "is malformed", Pattern.class); assertFailsValidation(new ServerConfig().setS3DataLocation(location), "s3DataLocation", "is malformed", Pattern.class); } }