package io.eguan.utils.mapper; /* * #%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 io.eguan.configuration.ConfigValidationException; import io.eguan.configuration.MetaConfiguration; import io.eguan.utils.UuidCharSequence; import io.eguan.utils.mapper.DeepFileMapper; import io.eguan.utils.mapper.DirPrefixLengthConfigKey; import io.eguan.utils.mapper.DirStructureDepthConfigKey; import io.eguan.utils.mapper.FileMapper; import io.eguan.utils.mapper.FileMapperConfigurationContext; import java.io.ByteArrayInputStream; import java.io.File; import java.util.UUID; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.google.common.io.Files; /** * Tests for {@link FileMapper} implementations. * * @author oodrive * @author llambert * */ public final class TestFileMappers { /** Base dir */ private File tempBaseDir; /** Default configuration */ private MetaConfiguration defaultConfiguration; @Before public void createConfig() throws Exception { // Default config file mapper tempBaseDir = Files.createTempDir(); defaultConfiguration = MetaConfiguration.newConfiguration(new ByteArrayInputStream(new byte[0]), FileMapperConfigurationContext.getInstance()); } @After public void cleanConfig() throws Exception { if (tempBaseDir != null) { io.eguan.utils.Files.deleteRecursive(tempBaseDir.toPath()); } } @Test public void testFlatMapper() { final FileMapper fileMapper = FileMapper.Type.FLAT.newInstance(tempBaseDir, 32, defaultConfiguration); final UUID uuid = new UUID(2378821352914714605L, 3607550935519964895L); final CharSequence id = new UuidCharSequence(uuid); Assert.assertEquals(tempBaseDir.getAbsolutePath() + File.separator + "2103456abc987fed3210987654cbaedf", fileMapper.mapIdToFile(id).getAbsolutePath()); } @Test public void testDefaultDeepMapper() { final FileMapper fileMapper = FileMapper.Type.DEEP.newInstance(tempBaseDir, 32, defaultConfiguration); final UUID uuid = new UUID(2378821352914714605L, 3607550935519964895L); final CharSequence id = new UuidCharSequence(uuid); final MetaConfiguration config = defaultConfiguration; // compute the expected result from config parameters final String uuidString = uuid.toString().replaceAll("-", ""); final int prefixLength = DirPrefixLengthConfigKey.getInstance().getTypedValue(config).intValue(); final int dirDepth = DirStructureDepthConfigKey.getInstance().getTypedValue(config).intValue(); final String sub = uuidString.substring(0, prefixLength * dirDepth); final String rep = sub.replaceAll("([0-9a-fA-F]{" + prefixLength + "})", "$1" + File.separator); Assert.assertEquals(tempBaseDir.getAbsolutePath() + File.separator + uuidString.replaceFirst(sub, rep), fileMapper.mapIdToFile(id).getAbsolutePath()); } @Test public void testDeepMapper6x5() { final FileMapper fileMapper = new DeepFileMapper(tempBaseDir, 32, 6, 5); final UUID uuid = new UUID(2378821352914714605L, 3607550935519964895L); final CharSequence id = new UuidCharSequence(uuid); Assert.assertEquals(tempBaseDir.getAbsolutePath() + File.separator + "210345" + File.separator + "6abc98" + File.separator + "7fed32" + File.separator + "109876" + File.separator + "54cbae" + File.separator + "df", fileMapper.mapIdToFile(id).getAbsolutePath()); } @Test public void testDeepMapper1x5() { final FileMapper fileMapper = new DeepFileMapper(tempBaseDir, 32, 1, 5); final UUID uuid = new UUID(2378821352914714605L, 3607550935519964895L); final CharSequence id = new UuidCharSequence(uuid); Assert.assertEquals(tempBaseDir.getAbsolutePath() + File.separator + "2" + File.separator + "1" + File.separator + "0" + File.separator + "3" + File.separator + "4" + File.separator + "56abc987fed3210987654cbaedf", fileMapper.mapIdToFile(id).getAbsolutePath()); } @Test public void testDeepMapper5x1() { final FileMapper fileMapper = new DeepFileMapper(tempBaseDir, 32, 5, 1); final UUID uuid = new UUID(2378821352914714605L, 3607550935519964895L); final CharSequence id = new UuidCharSequence(uuid); Assert.assertEquals(tempBaseDir.getAbsolutePath() + File.separator + "21034" + File.separator + "56abc987fed3210987654cbaedf", fileMapper.mapIdToFile(id).getAbsolutePath()); } @Test(expected = IllegalArgumentException.class) public void testDeepMapper4x8() { new DeepFileMapper(tempBaseDir, 32, 4, 8); } @Test public void testConfig6x5() throws Exception { final String config = "io.eguan.filemapping.dir.prefix.length=6\nio.eguan.filemapping.dir.structure.depth=5"; final MetaConfiguration configuration = MetaConfiguration.newConfiguration( new ByteArrayInputStream(config.getBytes()), FileMapperConfigurationContext.getInstance()); final FileMapper fileMapper = FileMapper.Type.DEEP.newInstance(tempBaseDir, 32, configuration); final UUID uuid = new UUID(2378821352914714605L, 3607550935519964895L); final CharSequence id = new UuidCharSequence(uuid); Assert.assertEquals(tempBaseDir.getAbsolutePath() + File.separator + "210345" + File.separator + "6abc98" + File.separator + "7fed32" + File.separator + "109876" + File.separator + "54cbae" + File.separator + "df", fileMapper.mapIdToFile(id).getAbsolutePath()); } @Test public void testConfig1x5() throws Exception { final String config = "io.eguan.filemapping.dir.prefix.length=1\nio.eguan.filemapping.dir.structure.depth=5"; final MetaConfiguration configuration = MetaConfiguration.newConfiguration( new ByteArrayInputStream(config.getBytes()), FileMapperConfigurationContext.getInstance()); final FileMapper fileMapper = FileMapper.Type.DEEP.newInstance(tempBaseDir, 32, configuration); final UUID uuid = new UUID(2378821352914714605L, 3607550935519964895L); final CharSequence id = new UuidCharSequence(uuid); Assert.assertEquals(tempBaseDir.getAbsolutePath() + File.separator + "2" + File.separator + "1" + File.separator + "0" + File.separator + "3" + File.separator + "4" + File.separator + "56abc987fed3210987654cbaedf", fileMapper.mapIdToFile(id).getAbsolutePath()); } @Test public void testConfig5x1() throws Exception { final String config = "io.eguan.filemapping.dir.prefix.length=5\nio.eguan.filemapping.dir.structure.depth=1"; final MetaConfiguration configuration = MetaConfiguration.newConfiguration( new ByteArrayInputStream(config.getBytes()), FileMapperConfigurationContext.getInstance()); final FileMapper fileMapper = FileMapper.Type.DEEP.newInstance(tempBaseDir, 32, configuration); final UUID uuid = new UUID(2378821352914714605L, 3607550935519964895L); final CharSequence id = new UuidCharSequence(uuid); Assert.assertEquals(tempBaseDir.getAbsolutePath() + File.separator + "21034" + File.separator + "56abc987fed3210987654cbaedf", fileMapper.mapIdToFile(id).getAbsolutePath()); } @Test(expected = ConfigValidationException.class) public void testConfig4x8() throws Exception { final String config = "io.eguan.filemapping.dir.prefix.length=4\nio.eguan.filemapping.dir.structure.depth=8"; MetaConfiguration.newConfiguration(new ByteArrayInputStream(config.getBytes()), FileMapperConfigurationContext.getInstance()); } }