/**
* 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.mahout.common;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.lang.reflect.Field;
import com.google.common.base.Charsets;
import com.google.common.io.Closeables;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
public abstract class MahoutTestCase extends org.apache.mahout.math.MahoutTestCase {
/** "Close enough" value for floating-point comparisons. */
public static final double EPSILON = 0.000001;
private Path testTempDirPath;
private FileSystem fs;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
RandomUtils.useTestSeed();
testTempDirPath = null;
fs = null;
}
@Override
@After
public void tearDown() throws Exception {
if (testTempDirPath != null) {
try {
fs.delete(testTempDirPath, true);
} catch (IOException e) {
throw new IllegalStateException("Test file not found");
}
testTempDirPath = null;
fs = null;
}
super.tearDown();
}
protected final Path getTestTempDirPath() throws IOException {
if (testTempDirPath == null) {
fs = FileSystem.get(new Configuration());
long simpleRandomLong = (long) (Long.MAX_VALUE * Math.random());
testTempDirPath = fs.makeQualified(
new Path("/tmp/mahout-" + getClass().getSimpleName() + '-' + simpleRandomLong));
if (!fs.mkdirs(testTempDirPath)) {
throw new IOException("Could not create " + testTempDirPath);
}
fs.deleteOnExit(testTempDirPath);
}
return testTempDirPath;
}
protected final Path getTestTempFilePath(String name) throws IOException {
return getTestTempFileOrDirPath(name, false);
}
protected final Path getTestTempDirPath(String name) throws IOException {
return getTestTempFileOrDirPath(name, true);
}
private Path getTestTempFileOrDirPath(String name, boolean dir) throws IOException {
Path testTempDirPath = getTestTempDirPath();
Path tempFileOrDir = fs.makeQualified(new Path(testTempDirPath, name));
fs.deleteOnExit(tempFileOrDir);
if (dir && !fs.mkdirs(tempFileOrDir)) {
throw new IOException("Could not create " + tempFileOrDir);
}
return tempFileOrDir;
}
/**
* Try to directly set a (possibly private) field on an Object
*/
protected static void setField(Object target, String fieldname, Object value)
throws NoSuchFieldException, IllegalAccessException {
Field field = findDeclaredField(target.getClass(), fieldname);
field.setAccessible(true);
field.set(target, value);
}
/**
* Find a declared field in a class or one of it's super classes
*/
private static Field findDeclaredField(Class<?> inClass, String fieldname) throws NoSuchFieldException {
while (!Object.class.equals(inClass)) {
for (Field field : inClass.getDeclaredFields()) {
if (field.getName().equalsIgnoreCase(fieldname)) {
return field;
}
}
inClass = inClass.getSuperclass();
}
throw new NoSuchFieldException();
}
/**
* @return a job option key string (--name) from the given option name
*/
protected static String optKey(String optionName) {
return AbstractJob.keyFor(optionName);
}
protected static void writeLines(File file, String... lines) throws IOException {
Writer writer = new OutputStreamWriter(new FileOutputStream(file), Charsets.UTF_8);
try {
for (String line : lines) {
writer.write(line);
writer.write('\n');
}
} finally {
Closeables.closeQuietly(writer);
}
}
}