package io.eguan.configuration;
/*
* #%L
* Project eguan
* %%
* Copyright (C) 2012 - 2017 Oodrive
* %%
* 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.
* #L%
*/
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import io.eguan.configuration.AbstractConfigKey;
import io.eguan.configuration.FileConfigKey;
import io.eguan.configuration.ValidationError;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;
import org.junit.Test;
/**
* Implementation of {@link TestAbstractConfigKeys} for testing {@link FileConfigKey}s.
*
* @author oodrive
* @author pwehrle
*
*/
public final class TestFileConfigKey extends TestAbstractConfigKeys {
private static final class TestableFileConfigKey extends FileConfigKey {
private final boolean hasDefault;
private final boolean required;
protected TestableFileConfigKey(final boolean required, final boolean hasDefault, final boolean checkDirectory,
final boolean checkExistence, final boolean checkWritable) {
super("test.file.key", checkDirectory, checkExistence, checkWritable);
this.hasDefault = hasDefault;
this.required = required;
}
@Override
protected Object getDefaultValue() {
return hasDefault ? new File("/tmp") : null;
}
@Override
public boolean isRequired() {
return required;
}
}
@Override
protected final AbstractConfigKey getTestKey(final boolean required, final boolean hasDefault) {
return new TestableFileConfigKey(required, hasDefault, false, false, false);
}
/**
* Tests selective failure of additional checks for existence, directory and writable state.
*/
@Test
public final void testCheckValueFailOptionalChecks() throws IOException {
TestableFileConfigKey checkingKey = null;
Path validFile = null;
Path invalidFile = null;
final String tmpFilePrefix = this.getClass().getSimpleName();
final Set<PosixFilePermission> writablePermissions = PosixFilePermissions.fromString("rwxr-x---");
final Set<PosixFilePermission> unwritablePermissions = PosixFilePermissions.fromString("r-xr-x---");
for (int i = 1; i < 8; i++) {
final boolean isDirectory = (i & 1) != 0;
final boolean exists = (i & 2) != 0;
final boolean isWritable = (i & 4) != 0;
checkingKey = new TestableFileConfigKey(false, false, isDirectory, exists, isWritable);
try {
validFile = isDirectory ? Files.createTempDirectory(tmpFilePrefix) : Files.createTempFile(
tmpFilePrefix, null);
assertTrue(Files.exists(validFile));
invalidFile = !isDirectory ? Files.createTempDirectory(tmpFilePrefix) : Files.createTempFile(
tmpFilePrefix, null);
assertTrue(Files.exists(invalidFile));
Files.setPosixFilePermissions(validFile, (isWritable ? writablePermissions : unwritablePermissions));
Files.setPosixFilePermissions(invalidFile, (!isWritable ? writablePermissions : unwritablePermissions));
if (exists) {
Files.delete(invalidFile);
}
final ValidationError reportInvalid = checkingKey.checkValue(invalidFile.toFile());
assertEquals(ValidationError.ErrorType.VALUE_INVALID, reportInvalid.getType());
final ValidationError reportValid = checkingKey.checkValue(validFile.toFile());
assertEquals(ValidationError.NO_ERROR, reportValid);
}
finally {
if (Files.exists(invalidFile)) {
Files.setPosixFilePermissions(invalidFile, writablePermissions);
Files.delete(invalidFile);
}
if (Files.exists(validFile)) {
Files.setPosixFilePermissions(validFile, writablePermissions);
Files.delete(validFile);
}
}
}
}
}