Commit 04d23705 authored by Carlos Galindo's avatar Carlos Galindo
Browse files

Merge branch 'master' into 'JSS_rainbow'

# Conflicts:
#   e-Knife/src/main/java/eknife/EKnife.java
parents 51767fa5 3f239493
Loading
Loading
Loading
Loading
+0 −151
Original line number Diff line number Diff line
package eknife;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Scanner;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class BencherTest {

    private static final String TEST_PKG = "bencher";
    private static final String TEST_PKG_INTRA = "bencher_intraprocedural";
    private static final String DOT_ERLANG = ".erl";
    private static final String EDG_CRITERION = ".edg.criterion";
    private static final String EDG_SLICE = ".edg.sliced";
    private static final String EDG_OUTPUT_SLICE = ".edg.slice.output";
    public static int cont = 1;

    public static void findFiles(File directory, String suffix, Consumer<File> consumer) {
        File[] files = directory.listFiles();
        if (files == null)
            return;
        for (File f : files) {
            if (f.isDirectory())
                findFiles(f, suffix, consumer);
            else if (f.getName().endsWith(suffix))
                consumer.accept(f);
        }
    }

    private static String readFile(File file, Supplier<String> separator) {
        try (Scanner in = new Scanner(file)) {
            StringBuilder builder = new StringBuilder();
            while (in.hasNextLine())
                builder.append(in.nextLine()).append(separator.get());
            return builder.toString();
        } catch (FileNotFoundException e) {
            return "";
        }
    }

    private static String readFile(File file) {
        return readFile(file, () -> "\n");
    }

    private static boolean slicesMatch(File slice, File referenceSlice) {
        return Objects.equals(readFile(slice), readFile(referenceSlice));
    }

    public static void main0(String[] args) {
        new File(EKnife.sliceGenerationCsv).delete();
        new File(EKnife.graphGenerationCsv).delete();
        EKnife.printHeadings(EKnife.graphGenerationCsv, EKnife.sliceGenerationCsv);
        Scanner in = new Scanner(System.in);
        File testFolder = new File("./e-knife-v1.1.0-src/e-Knife/src/test/resources/regression/", TEST_PKG);
        findFiles(testFolder, DOT_ERLANG, file -> {
            File sliceFile = new File(file.getParent(), file.getName() + EDG_CRITERION);
            if (!sliceFile.exists()) {
                int[] counter = new int[] { 1 };
                System.out.printf("%3d", counter[0]++);
                System.out.print(readFile(file, () -> String.format("\n%3d", counter[0]++)));
                System.out.printf("No criterion found for this program (%s), please input one (-1 to skip)\nCriterion: ", file);
                int line = in.nextInt();
                if (line == -1)
                    return;
                while (line <= 0 || line >= counter[0] - 2) {
                    System.out.printf("Your input is out-of-bounds, please try again [1-%d]: ", counter[0] - 2);
                    line = in.nextInt();
                }
                System.out.printf("Saving line %d as slicing criterion for %s... ", line, file);
                try (PrintWriter pw = new PrintWriter(sliceFile)) {
                    pw.write(line + "");
                    System.out.println("DONE");
                } catch (FileNotFoundException e) {
                    System.out.println("ERROR");
                }
            }
            else {
                String[] arguments = {"-i", "", "-o" ,"", "-l", "", "-v", ""};
                File outputDir = testFolder.getAbsoluteFile();

                String inputFileName = testFolder.getAbsolutePath() + File.separator + file.getName();
                String outputFileName = outputDir + File.separator + file.getName() + EDG_OUTPUT_SLICE;
                try (Scanner in2 = new Scanner(sliceFile)) {
                    int lineNumber = in2.nextInt();
                    String var = in2.nextLine();
                    arguments[1] = inputFileName;
                    arguments[3] = outputFileName;
                    arguments[5] = lineNumber+"";
                    arguments[7] = var.trim();

                    System.out.print("Slicing program "+ file.getName() + " " + BencherTest.cont + "/23: ");
                    BencherTest.cont++;

                    EKnife.main(arguments);
                    if (slicesMatch(new File(outputFileName),new File(inputFileName + EDG_SLICE))) {
                        System.out.println("SUCCESS");
                    } else {
                        System.out.println("Failure");
                    }

                } catch (FileNotFoundException | NoSuchElementException e) {
                    System.out.println("Error reading the criterion file");
                }
            }
        });
    }

    public static void main2(String[] args) {
        EKnife.printHeadings(EKnife.graphGenerationCsv, EKnife.sliceGenerationCsv);
        File testFolder = new File("./e-knife-v1.1.0-src/e-Knife/src/test/resources/regression/", TEST_PKG_INTRA);
        findFiles(testFolder, DOT_ERLANG, file -> {
            String[] arguments = {"-i", "", "-o" ,"", "-l", "", "-v", ""};
            File outputDir = testFolder.getAbsoluteFile();

            String inputFileName = testFolder.getAbsolutePath() + File.separator + file.getName();
            String outputFileName = outputDir + File.separator + file.getName() + EDG_OUTPUT_SLICE;
            arguments[1] = inputFileName;
            arguments[3] = outputFileName;
            arguments[5] = "1";
            arguments[7] = "X";

            System.out.println("Slicing program "+ file.getName() + " " + BencherTest.cont + "/13");
            BencherTest.cont++;

            EKnife.main(arguments);
        });
    }

    public static void main(String[] args) {
        TEST_PKG = "SetB";
        File testFolder = new File("./e-knife-v1.1.0-src/e-Knife/src/test/resources/PaperExperiments/", TEST_PKG);
        findFiles(testFolder, DOT_ERLANG, file -> {
            File outputDir = testFolder.getAbsoluteFile();

            String inputFileName = testFolder.getAbsolutePath() + File.separator + file.getName();
            String outputFileName = outputDir + File.separator + file.getName() + EDG_OUTPUT_SLICE;
            String[] arguments = {"-i", inputFileName, "-o", outputFileName, "-l", "1", "-v", "X"};

            System.out.println("Slicing program "+ file.getName() + " " + BencherTest.cont + (TEST_PKG.equals("SetA") ? "/13": "/17"));

            BencherTest.cont++;

            EKnife.generateAllSlices(arguments);
        });
    }

}
+1 −29
Original line number Diff line number Diff line
@@ -35,24 +35,12 @@ import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.*;

public class EKnife
{
	public enum Language { Java, Erlang, Php }

	// TODO: OUTPUT FILES PATH

	// Graph Generation Time
	public static final String graphGenerationCsv = "/Users/serperu/Desktop/SlicerOutput/Times/generationTimeMilliseconds.csv";
	public static final String sliceGenerationCsv = "/Users/serperu/Desktop/SlicerOutput/Times/slicingStatisticsMicroseconds.csv";
	public static final String nodeCounterFile = "/Users/serperu/Desktop/SlicerOutput/Times/programSizes.txt";
	public static final String outputSliceGenerationFolder = "/Users/serperu/Desktop/SlicerOutput/Slices/";


	public static void main(String[] args)
	{
		if (args.length == 0) {
@@ -70,22 +58,6 @@ public class EKnife

	}

	public static void generateAllSlices(String[] args){
		if (args.length == 0) {
			EKnife.printHelp();
			return;
		}

		final Args arguments = EKnife.processArguments(args);

		if (!arguments.isValid()) {
			EKnife.printHelp();
			System.exit(3);
		}

		EKnife.sliceGenerationRun(arguments);
	}

	private static Args processArguments(String[] args)
	{
		Args kArgs = new Args();