/** * Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com) * * 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.linkedin.pinot.common.utils; import java.io.File; import java.io.IOException; import java.nio.file.Files; import org.apache.commons.compress.archivers.ArchiveException; import org.apache.commons.io.FileUtils; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class TarGzCompressionUtilsTest { private static final String SEGMENT_NAME = "mysegment"; private File TEST_DIR; private File dataDir; private File tarDir; private File untarDir; private File segmentDir; @BeforeMethod public void setUpTest() throws IOException { TEST_DIR = Files.createTempDirectory(TarGzCompressionUtils.class.getName()).toFile(); TEST_DIR.deleteOnExit(); dataDir = new File(TEST_DIR, "dataDir"); tarDir = new File(TEST_DIR, "tarDir"); untarDir = new File(TEST_DIR, "untarDir"); segmentDir = new File(dataDir, SEGMENT_NAME); FileUtils.forceMkdir(dataDir); FileUtils.forceMkdir(tarDir); FileUtils.forceMkdir(untarDir); FileUtils.forceMkdir(segmentDir); } @AfterMethod public void tearDownTest() { if (TEST_DIR != null) { FileUtils.deleteQuietly(TEST_DIR); } } @Test public void testBasic() throws IOException, InterruptedException, ArchiveException { File metaFile = new File(segmentDir, "metadata.properties"); metaFile.createNewFile(); File tarGzPath = new File(tarDir, SEGMENT_NAME + ".tar.gz"); TarGzCompressionUtils.createTarGzOfDirectory(segmentDir.getPath(), tarGzPath.getPath(), "segmentId_"); TarGzCompressionUtils.unTar(tarGzPath, untarDir); File[] files = untarDir.listFiles(); Assert.assertNotNull(files); Assert.assertEquals(files.length, 1); File[] subFiles = files[0].listFiles(); Assert.assertNotNull(subFiles); Assert.assertEquals(subFiles.length, 1); Assert.assertEquals(subFiles[0].getName(), "metadata.properties"); } @Test public void testSubDirectories() throws IOException, ArchiveException, InterruptedException { new File(segmentDir, "metadata.properties").createNewFile(); File v3Dir = new File(segmentDir, "v3"); FileUtils.forceMkdir(v3Dir); new File(v3Dir, "creation.meta").createNewFile(); File tarGzPath = new File(tarDir, SEGMENT_NAME + ".tar.gz"); TarGzCompressionUtils.createTarGzOfDirectory(segmentDir.getPath(), tarGzPath.getPath()); TarGzCompressionUtils.unTar(tarGzPath, untarDir); File[] segments = untarDir.listFiles(); Assert.assertNotNull(segments); Assert.assertEquals(segments.length, 1); File[] segmentFiles = segments[0].listFiles(); Assert.assertNotNull(segmentFiles); Assert.assertEquals(segmentFiles.length, 2); for (File segmentFile : segmentFiles) { String name = segmentFile.getName(); Assert.assertTrue(name.equals("v3") || name.equals("metadata.properties")); if (name.equals("v3")) { Assert.assertTrue(segmentFile.isDirectory()); File[] v3Files = v3Dir.listFiles(); Assert.assertNotNull(v3Files); Assert.assertEquals(v3Files.length, 1); Assert.assertEquals(v3Files[0].getName(), "creation.meta"); } } } @Test public void testEmptyDirectory() throws IOException, ArchiveException { File tarGzPath = new File(tarDir, SEGMENT_NAME + ".tar.gz"); TarGzCompressionUtils.createTarGzOfDirectory(segmentDir.getPath(), tarGzPath.getPath()); TarGzCompressionUtils.unTar(tarGzPath, untarDir); File[] segments = untarDir.listFiles(); Assert.assertNotNull(segments); Assert.assertEquals(segments.length, 1); File[] segmentFiles = segments[0].listFiles(); Assert.assertNotNull(segmentFiles); Assert.assertEquals(segmentFiles.length, 0); } }