/** * Copyright (C) 2010 STMicroelectronics * * This file is part of "Mind Compiler" is free software: you can redistribute * it and/or modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Contact: mind@ow2.org * * Authors: Matthieu Leclercq * Contributors: */ package org.ow2.mind; import static org.testng.Assert.assertEquals; import java.io.File; import java.util.Arrays; import org.ow2.mind.compilation.CompilationCommand; import org.ow2.mind.compilation.CompilerCommand; import org.ow2.mind.compilation.CompilerWrapper; import org.ow2.mind.compilation.ExecutionHelper; import org.ow2.mind.compilation.LinkerCommand; import org.ow2.mind.compilation.gcc.GccCompilerWrapper; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class TestLibImpl extends AbstractFunctionalTest { CompilerWrapper compilerWrapper; @Override @BeforeMethod(alwaysRun = true) protected void setup() throws Exception { super.setup(); compilerWrapper = new GccCompilerWrapper(); } @Test(groups = {"functional"}) public void test_myLib_O() throws Exception { initPath(); // compile mylib.c to mylib.o final File inputFile = new File(getClass().getClassLoader() .getResource("libimpl/impl/myLib.c").toURI()); final File objectFile = new File("target/build-libimpl/impl/myLib.o"); objectFile.getParentFile().mkdirs(); final CompilerCommand compilerCommand = compilerWrapper .newCompilerCommand(runner.context); compilerCommand.setInputFile(inputFile).setOutputFile(objectFile); runner.executor.exec(Arrays.asList((CompilationCommand) compilerCommand), runner.context); runner.compileAndRun( "GenericApplication<impl.MyLibTester<impl.MyLibWrapper_O>>", "myLibTester_O"); } @Test(groups = {"functional"}) public void test_myLib_SO() throws Exception { if (isRunningOnWindows()) { // not supported on windows return; } initPath(); // compile mylib.c to mylib.so final File inputFile = new File(getClass().getClassLoader() .getResource("libimpl/impl/myLib.c").toURI()); final File objectFile = new File("target/build-libimpl/impl/myLib.o"); final File soFile = new File("target/build-libimpl/impl/myLib.so"); objectFile.getParentFile().mkdirs(); final CompilerCommand compilerCommand = compilerWrapper .newCompilerCommand(runner.context); compilerCommand.setInputFile(inputFile).setOutputFile(objectFile) .addFlag("-fPIC"); final LinkerCommand linkerCommand = compilerWrapper .newLinkerCommand(runner.context); linkerCommand.addInputFile(objectFile).setOutputFile(soFile) .addFlag("--shared"); runner.executor.exec(Arrays.asList(compilerCommand, linkerCommand), runner.context); runner.compileAndRun( "GenericApplication<impl.MyLibTester<impl.MyLibWrapper_SO>>", "myLibTester_SO"); } @Test(groups = {"functional"}) public void test_myLib_A() throws Exception { if (isRunningOnWindows()) { // not supported on windows return; } initPath(); // compile mylib.c to mylib.so final File inputFile = new File(getClass().getClassLoader() .getResource("libimpl/impl/myLib.c").toURI()); final File objectFile = new File("target/build-libimpl/impl/myLib.o"); final File aFile = new File("target/build-libimpl/impl/myLib.a"); objectFile.getParentFile().mkdirs(); final CompilerCommand compilerCommand = compilerWrapper .newCompilerCommand(runner.context); compilerCommand.setInputFile(inputFile).setOutputFile(objectFile) .addFlag("-fPIC"); runner.executor.exec(Arrays.asList((CompilationCommand) compilerCommand), runner.context); if (aFile.exists()) aFile.delete(); assertEquals( ExecutionHelper.exec( "ar -r " + aFile.getAbsolutePath() + " " + objectFile.getAbsolutePath()).getExitValue(), 0); assertEquals(ExecutionHelper.exec("ranlib " + aFile.getAbsolutePath()) .getExitValue(), 0); runner.compileAndRun( "GenericApplication<impl.MyLibTester<impl.MyLibWrapper_A>>", "myLibTester_A"); } protected void initPath() { final File buildDir = new File("target/build-libimpl").getAbsoluteFile(); buildDir.mkdirs(); initSourcePath(getDepsDir("fractal/api/Component.itf").getAbsolutePath(), "common", "libimpl", buildDir.getPath()); } }