/* * Copyright 2013 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 org.springframework.data.hadoop.fs; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertTrue; import java.io.IOException; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.core.io.Resource; import org.springframework.data.hadoop.HadoopSystemConstants; import org.springframework.data.hadoop.TestUtils; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * Test for interacting with Hadoop HDFS with {@code HdfsResourceLoader}. * * @author Janne Valkealahti * */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class HdfsResourceLoaderTests { @javax.annotation.Resource(name = HadoopSystemConstants.DEFAULT_ID_RESOURCE_LOADER) private HdfsResourceLoader loader; @javax.annotation.Resource(name = "loaderWithUser") private HdfsResourceLoader loaderWithUser; @javax.annotation.Resource(name = "loaderHandleNoprefix") private HdfsResourceLoader loaderHandleNoprefix; @Test public void testFilesWithDifferentUsers() throws Exception { String userFileName1 = "HdfsResourceLoaderTests-testFilesWithDifferentUsers1.txt"; String userFileName2 = "HdfsResourceLoaderTests-testFilesWithDifferentUsers2.txt"; // files should end up on different user directories TestUtils.writeToFS(loader, userFileName1); TestUtils.writeToFS(loaderWithUser, userFileName2); assertFileViaLoader(loader, userFileName1, true); assertFileViaLoader(loader, userFileName2, false); assertFileViaLoader(loaderWithUser, userFileName1, false); assertFileViaLoader(loaderWithUser, userFileName2, true); } @Test public void testFilesWithPaths() throws Exception { String fileName1 = "HdfsResourceLoaderTests-testFilesWithPaths1.txt"; TestUtils.writeToFS(loader, "/test/" + fileName1); assertFileViaLoader(loader, "/test/" + fileName1, true); } @Test public void testFilesWithTilde() throws Exception { String userFileName1 = "HdfsResourceLoaderTests-testFilesWithTilde1.txt"; TestUtils.writeToFS(loader, userFileName1); assertFileViaLoaderWithPatter(loader, "~/" + userFileName1 + "*", true); assertFileViaLoader(loader, "~/" + userFileName1, true); } @Test public void testFilesWithComplexPaths() throws Exception { String filePath1 = "/test/HdfsResourceLoaderTests/file1.txt"; String filePath2 = "/test/HdfsResourceLoaderTests/dir1/file1.txt"; String filePath3 = "/test/HdfsResourceLoaderTests/dir1/dir2/file1.txt"; String filePath4 = "/test/HdfsResourceLoaderTests/file2.txt"; String filePath5 = "/test/HdfsResourceLoaderTests/dir2/file2.txt"; String filePath6 = "/test/HdfsResourceLoaderTests/dir2/dir2/file2.txt"; TestUtils.writeToFS(loader, filePath1); TestUtils.writeToFS(loader, filePath2); TestUtils.writeToFS(loader, filePath3); TestUtils.writeToFS(loader, filePath4); TestUtils.writeToFS(loader, filePath5); TestUtils.writeToFS(loader, filePath6); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/file1*.txt", 1); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/*.txt", 2); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/*", 4); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/*txt", 2); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/**/*", 10); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/dir1/*", 2); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/dir1/file1.txt", 1); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/dir1/file?.txt", 1); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/dir1/?ile?.txt", 1); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/dir1/ile?.txt", 0); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/dir1/*.*", 1); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/dir1/foo*", 0); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/dir1/**/*", 3); assertFileCountViaLoaderWithPatter(loader, "/test/HdfsResourceLoaderTests/????/*", 4); } @Test public void testFilesNoprefix() throws Exception { String fileName1 = "HdfsResourceLoaderTests-testFilesNoprefix1.txt"; Resource resource = loaderHandleNoprefix.getResource(fileName1); assertThat(resource, not(instanceOf(HdfsResource.class))); Resource[] resources = loaderHandleNoprefix.getResources(fileName1 + "*"); assertThat(resources.length, is(0)); resources = loaderHandleNoprefix.getResources("*"); assertTrue(resources.length > 0); for (Resource r : resources) { assertThat(r, not(instanceOf(HdfsResource.class))); } } private static void assertFileCountViaLoaderWithPatter(HdfsResourceLoader loader, String path, int count) throws IOException { Resource[] resources = loader.getResources(path); assertThat(resources, notNullValue()); assertThat(resources.length, is(count)); } private static void assertFileViaLoader(HdfsResourceLoader loader, String path, boolean shouldExist) throws IOException { Resource[] resources = loader.getResources(path); assertThat(resources, notNullValue()); assertThat(resources.length, is(1)); assertThat(resources[0].exists(), is(shouldExist)); Resource resource = loader.getResource(path); assertThat(resource, notNullValue()); assertThat(resource.exists(), is(shouldExist)); } private static void assertFileViaLoaderWithPatter(HdfsResourceLoader loader, String path, boolean shouldExist) throws IOException { Resource[] resources = loader.getResources(path); assertThat(resources, notNullValue()); assertThat(resources[0].exists(), is(shouldExist)); } }