blob: 00da9ca75d7f305a07da1a64de49fda9cff8871d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.ignite.internal.processors.hadoop.impl;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import org.apache.ignite.internal.processors.hadoop.HadoopClasspathUtils;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.junit.Test;
/**
* Tests for user libs parsing.
*/
public class HadoopUserLibsSelfTest extends GridCommonAbstractTest {
/** Directory 1. */
private static final File DIR_1 = HadoopTestUtils.testDir("dir1");
/** File 1 in directory 1. */
private static final File FILE_1_1 = new File(DIR_1, "file1.jar");
/** File 2 in directory 1. */
private static final File FILE_1_2 = new File(DIR_1, "file2.jar");
/** Directory 2. */
private static final File DIR_2 = HadoopTestUtils.testDir("dir2");
/** File 1 in directory 2. */
private static final File FILE_2_1 = new File(DIR_2, "file1.jar");
/** File 2 in directory 2. */
private static final File FILE_2_2 = new File(DIR_2, "file2.jar");
/** Missing directory. */
private static final File MISSING_DIR = HadoopTestUtils.testDir("missing_dir");
/** Missing file. */
private static final File MISSING_FILE = new File(MISSING_DIR, "file.jar");
/** {@inheritDoc} */
@Override protected void beforeTestsStarted() throws Exception {
HadoopTestUtils.clearBaseTestDir();
assert DIR_1.mkdirs();
assert DIR_2.mkdirs();
assert FILE_1_1.createNewFile();
assert FILE_1_2.createNewFile();
assert FILE_2_1.createNewFile();
assert FILE_2_2.createNewFile();
}
/** {@inheritDoc} */
@Override protected void beforeTest() throws Exception {
// Sanity checks before test start.
ensureExists(FILE_1_1);
ensureExists(FILE_1_2);
ensureExists(FILE_2_1);
ensureExists(FILE_2_2);
ensureNotExists(MISSING_DIR);
ensureNotExists(MISSING_FILE);
}
/** {@inheritDoc} */
@Override protected void afterTestsStopped() throws Exception {
HadoopTestUtils.clearBaseTestDir();
}
/**
* Test null or empty user libs.
*
* @throws Exception If failed.
*/
@Test
public void testNullOrEmptyUserLibs() throws Exception {
assert parse(null).isEmpty();
assert parse("").isEmpty();
}
/**
* Test single file.
*
* @throws Exception If failed.
*/
@Test
public void testSingle() throws Exception {
Collection<File> res = parse(single(FILE_1_1));
assert res.size() == 1;
assert res.contains(FILE_1_1);
res = parse(single(MISSING_FILE));
assert res.size() == 0;
}
/**
* Test multiple files.
*
* @throws Exception If failed.
*/
@Test
public void testMultiple() throws Exception {
Collection<File> res =
parse(merge(single(FILE_1_1), single(FILE_1_2), single(FILE_2_1), single(FILE_2_2), single(MISSING_FILE)));
assert res.size() == 4;
assert res.contains(FILE_1_1);
assert res.contains(FILE_1_2);
assert res.contains(FILE_2_1);
assert res.contains(FILE_2_2);
}
/**
* Test single wildcard.
*
* @throws Exception If failed.
*/
@Test
public void testSingleWildcard() throws Exception {
Collection<File> res = parse(wildcard(DIR_1));
assert res.size() == 2;
assert res.contains(FILE_1_1);
assert res.contains(FILE_1_2);
res = parse(wildcard(MISSING_DIR));
assert res.size() == 0;
}
/**
* Test multiple wildcards.
*
* @throws Exception If failed.
*/
@Test
public void testMultipleWildcards() throws Exception {
Collection<File> res = parse(merge(wildcard(DIR_1), wildcard(DIR_2), wildcard(MISSING_DIR)));
assert res.size() == 4;
assert res.contains(FILE_1_1);
assert res.contains(FILE_1_2);
assert res.contains(FILE_2_1);
assert res.contains(FILE_2_2);
}
/**
* Test mixed tokens.
*
* @throws Exception If failed.
*/
@Test
public void testMixed() throws Exception {
String str = merge(
single(FILE_1_1),
wildcard(DIR_2),
single(MISSING_FILE),
wildcard(MISSING_DIR)
);
Collection<File> res = parse(str);
assert res.size() == 3;
assert res.contains(FILE_1_1);
assert res.contains(FILE_2_1);
assert res.contains(FILE_2_2);
}
/**
* Ensure provided file exists.
*
* @param file File.
*/
private static void ensureExists(File file) {
assert file.exists();
}
/**
* Ensure provided file doesn't exist.
*
* @param file File.
*/
private static void ensureNotExists(File file) {
assert !file.exists();
}
/**
* Merge string using path separator.
*
* @param vals Values.
* @return Result.
*/
private static String merge(String... vals) {
StringBuilder res = new StringBuilder();
if (vals != null) {
boolean first = true;
for (String val : vals) {
if (first)
first = false;
else
res.append(File.pathSeparatorChar);
res.append(val);
}
}
return res.toString();
}
/**
* Parse string.
*
* @param str String.
* @return Files.
* @throws IOException If failed.
*/
Collection<File> parse(String str) throws IOException {
Collection<HadoopClasspathUtils.SearchDirectory> dirs = HadoopClasspathUtils.parseUserLibs(str);
Collection<File> res = new HashSet<>();
for (HadoopClasspathUtils.SearchDirectory dir : dirs)
Collections.addAll(res, dir.files());
return res;
}
/**
* Get absolute path to a single file.
*
* @param file File.
* @return Path.
*/
private static String single(File file) {
return file.getAbsolutePath();
}
/**
* Create a wildcard.
*
* @param file File.
* @return Wildcard.
*/
private static String wildcard(File file) {
return file.getAbsolutePath() + File.separatorChar + "*";
}
}