/*******************************************************************************
* Copyright (c) 2015 QNX Software Systems
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Alena Laskavaia - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.valgrind.core.tests;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import org.junit.Rule;
import org.junit.rules.TemporaryFolder;
import org.junit.rules.TestName;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
/**
* This is abstract class for juni4 test classes that use line method comments to extract test data.
* Test plugin must have "src" folder on its bundle class path.
*/
public abstract class AbstractInlineDataTest {
public static final String UTF_8 = "UTF-8"; //$NON-NLS-1$
public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8);
@Rule public TemporaryFolder tmpfiles = new TemporaryFolder();
@Rule public TestName testName = new TestName();
/**
* Gets last comment section (comments that use //) above current test method
* @return comment section without leading // and leading whitespaces
*/
protected String getAboveComment() {
return getAboveComment(getName());
}
/**
* @return current test method name
*/
protected String getName() {
return testName.getMethodName();
}
/**
* Gets last comment section (comments that use //) above method with a given name
* @param name method name
* @return comment section without leading // and leading whitespaces
*/
protected String getAboveComment(String name) {
return getContents(1, name)[0].toString();
}
/**
* Saves comment above test method in the named file in temp dir, if fileName is null it will get a random name.
* File will be auto-removed after test is finished
* @param fileName - base file name of the temp file or null
* @return temp file
* @throws IOException if failed to write file
*/
protected File getAboveCommentAndSaveFile(String fileName) throws IOException {
String value = getAboveComment(getName());
File file = fileName == null ? tmpfiles.newFile() : tmpfiles.newFile(fileName);
saveToFile(value, file);
return file;
}
protected void saveToFile(String value, File file) throws IOException, FileNotFoundException {
try (FileOutputStream st = new FileOutputStream(file)) {
st.write(value.getBytes(CHARSET_UTF_8));
}
}
protected StringBuilder[] getContents(int sections, String name) {
try {
return TestSourceReader.getContentsForTest(getBundle(), getSourcePrefix(), getClass(), name, sections);
} catch (IOException e) {
fail(e.getMessage());
return null;
}
}
/**
* Source directory of the test bundle. Can be overriden if source files that are used to pull comments are not in src.
* @return source dir prefix
*/
protected String getSourcePrefix() {
return "src";
}
protected Bundle getBundle() {
return FrameworkUtil.getBundle(getClass());
}
}