From f422db2a851896082ccb139a66dbc72c2849fed8 Mon Sep 17 00:00:00 2001 From: "Bruno T. de Melo" Date: Sat, 20 Dec 2014 12:39:59 -0300 Subject: [PATCH] Testes Grupo 4 --- README-Grupo4.txt | 25 ++++ example-apps/cqueue.jar | Bin 0 -> 3184 bytes example-apps/database.jar | Bin 0 -> 5384 bytes example-apps/forest.jar | Bin 0 -> 3330 bytes example-apps/pgproj.jar | Bin 0 -> 14680 bytes src-tests/rwsets/AllTestsGrupo4.java | 17 +++ src-tests/rwsets/cqueue/TestCqueue.java | 76 ++++++++++ .../rwsets/cqueue/TestCqueue.testpop.data | 10 ++ .../rwsets/cqueue/TestCqueue.testqueue.data | 15 ++ src-tests/rwsets/database/TestDatabase.java | 130 ++++++++++++++++++ .../rwsets/database/TestDatabase.testAdd.data | 27 ++++ ...Database.testAnalysisWithLineContents.data | 13 ++ .../database/TestDatabase.testFSearch.data | 16 +++ src-tests/rwsets/forest/TestForest.java | 129 +++++++++++++++++ .../rwsets/forest/TestForest.testPrint.data | 23 ++++ .../TestForest.testPrintWithLineContents.data | 15 ++ .../rwsets/forest/TestForest.testSearch.data | 23 ++++ src-tests/rwsets/pgproj/TestPgProj.test0.data | 0 src-tests/rwsets/pgproj/TestPgProj.test1.data | 0 src-tests/rwsets/pgproj/TestPgproj.java | 87 ++++++++++++ 20 files changed, 606 insertions(+) create mode 100644 README-Grupo4.txt create mode 100644 example-apps/cqueue.jar create mode 100644 example-apps/database.jar create mode 100644 example-apps/forest.jar create mode 100644 example-apps/pgproj.jar create mode 100644 src-tests/rwsets/AllTestsGrupo4.java create mode 100644 src-tests/rwsets/cqueue/TestCqueue.java create mode 100644 src-tests/rwsets/cqueue/TestCqueue.testpop.data create mode 100644 src-tests/rwsets/cqueue/TestCqueue.testqueue.data create mode 100644 src-tests/rwsets/database/TestDatabase.java create mode 100644 src-tests/rwsets/database/TestDatabase.testAdd.data create mode 100644 src-tests/rwsets/database/TestDatabase.testAnalysisWithLineContents.data create mode 100644 src-tests/rwsets/database/TestDatabase.testFSearch.data create mode 100644 src-tests/rwsets/forest/TestForest.java create mode 100644 src-tests/rwsets/forest/TestForest.testPrint.data create mode 100644 src-tests/rwsets/forest/TestForest.testPrintWithLineContents.data create mode 100644 src-tests/rwsets/forest/TestForest.testSearch.data create mode 100644 src-tests/rwsets/pgproj/TestPgProj.test0.data create mode 100644 src-tests/rwsets/pgproj/TestPgProj.test1.data create mode 100644 src-tests/rwsets/pgproj/TestPgproj.java diff --git a/README-Grupo4.txt b/README-Grupo4.txt new file mode 100644 index 0000000..34f0408 --- /dev/null +++ b/README-Grupo4.txt @@ -0,0 +1,25 @@ +Readme + +Localização dos arquivos: +Seguimos os paths originais, ou seja, + os testes estão em src-tests(rwsets.database, rwsets.cqueue, rwsets.forest e rwsets.pgproj), + os jars estão em example-apps(database.jar, cqueue.jar, forest.jar e pgproj.jar) e + as fontes estão em example-apps/src, em pastas com os mesmos nomes dos jars. + +---------------------------------------------------- +Testes: + Nossos testes se encontram no AllTestsGrupo4 + +#### known-bug #####################################################33 +-Ao rodar os testes no pgproj encontramos uma possível falha no rwsets. + +No primeiro teste(test0), o JUnit retorna um NullPointerException + -Para analisar este erro adicionamos um System.out + na linha 318 do arquivo src/depend/MethodDependencyAnalysis.java + ->System.out.println(fr.getDeclaringClass()); + -Esse System.out visa retornar o nome da classe que será passado para a chamada onde está ocorrendo a exceção. + -Com vários testes diferentes percebemos que a execução sempre para quando o rwsets tenta encontrar a classe Ponto dentro de projpg. + +Fizemos então um segundo teste (test1) que, ao ser rodado, evidencia o erro com um RuntimeException decorrente de não conseguir encontrar a classe. + -O erro não deveria ocorrer pois a classe Lprojpg/Ponto existe. + (apesar de termos usado pgproj no nome das pastas, o nome da package do projeto é projpg) diff --git a/example-apps/cqueue.jar b/example-apps/cqueue.jar new file mode 100644 index 0000000000000000000000000000000000000000..f4a9cd55ffe5f10c6a9ca221389c7ce476e290ad GIT binary patch literal 3184 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 nKl6`o$q`w9m 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 literal 0 HcmV?d00001 diff --git a/src-tests/rwsets/AllTestsGrupo4.java b/src-tests/rwsets/AllTestsGrupo4.java new file mode 100644 index 0000000..5b3186b --- /dev/null +++ b/src-tests/rwsets/AllTestsGrupo4.java @@ -0,0 +1,17 @@ +package rwsets; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + + rwsets.database.TestDatabase.class, + rwsets.cqueue.TestCqueue.class, + rwsets.forest.TestForest.class, + rwsets.pgproj.TestPgproj.class + +}) + + +public class AllTestsGrupo4 {} diff --git a/src-tests/rwsets/cqueue/TestCqueue.java b/src-tests/rwsets/cqueue/TestCqueue.java new file mode 100644 index 0000000..9c8a914 --- /dev/null +++ b/src-tests/rwsets/cqueue/TestCqueue.java @@ -0,0 +1,76 @@ +package rwsets.cqueue; + + +import japa.parser.ParseException; + +import java.io.File; +import java.io.IOException; +import java.util.Properties; + +import org.junit.Assert; +import org.junit.Test; + +import rwsets.Helper; + +import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.shrikeCT.InvalidClassFileException; +import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; +import com.ibm.wala.util.io.CommandLine; +import com.ibm.wala.util.warnings.Warnings; + +import depend.MethodDependencyAnalysis; +import depend.util.Util; +import depend.util.graph.SimpleGraph; + +public class TestCqueue { + + String USER_DIR = System.getProperty("user.dir"); + String SEP = System.getProperty("file.separator"); + String EXAMPLES = USER_DIR + SEP + "example-apps"; + String TEST_DIR = USER_DIR + SEP + "src-tests"; + String EXAMPLES_SRC = EXAMPLES + SEP + "src"; + String EXAMPLES_JAR = EXAMPLES; + String RESOURCES_DIR = USER_DIR + SEP + "dat"; + String cqueuejar = EXAMPLES_JAR + SEP + "cqueue.jar"; + + @Test + public void testPopDependency() throws IOException, WalaException, CancelException, ParseException, InvalidClassFileException { + + String strCompUnit = EXAMPLES_SRC + SEP + "cqueue/Pile.java"; + //filter vê se tem este nome na package + String filter = "comp2"; + + Assert.assertTrue((new File(strCompUnit)).exists()); + Assert.assertTrue((new File(cqueuejar)).exists()); + + //line e de onde a análise e iniciada + String line = "if(this.next == null) return new Pile();"; + SimpleGraph sg = depend.Main.analyze(cqueuejar, filter, strCompUnit, line); + + String expectedResultFile = TEST_DIR + SEP + "rwsets/cqueue/TestCqueue.testpop.data"; + Assert.assertEquals(Helper.readFile(expectedResultFile), sg.toDotString()); + } + + @Test + public void testPushbackDependency() throws IOException, WalaException, CancelException, ParseException, InvalidClassFileException { + + + String strCompUnit = EXAMPLES_SRC + SEP + "cqueue/Queue.java"; + //filter vê se tem este nome na package + String filter = "comp2"; + + Assert.assertTrue((new File(strCompUnit)).exists()); + Assert.assertTrue((new File(cqueuejar)).exists()); + + //line e de onde a análise e iniciada + String line = "if (this.n == -1) {"; + SimpleGraph sg = depend.Main.analyze(cqueuejar, filter, strCompUnit, line); + + String expectedResultFile = TEST_DIR + SEP + "rwsets/cqueue/TestCqueue.testqueue.data"; + Assert.assertEquals(Helper.readFile(expectedResultFile), sg.toDotString()); + + } + +} diff --git a/src-tests/rwsets/cqueue/TestCqueue.testpop.data b/src-tests/rwsets/cqueue/TestCqueue.testpop.data new file mode 100644 index 0000000..55cc7de --- /dev/null +++ b/src-tests/rwsets/cqueue/TestCqueue.testpop.data @@ -0,0 +1,10 @@ +digraph "DirectedGraph" { + graph [concentrate = true]; + center=true; + fontsize=6; + node [ color=blue,shape="box"fontsize=6,fontcolor=black,fontname=Arial]; + edge [ color=black,fontsize=6,fontcolor=black,fontname=Arial]; +"comp2/Pile comp2/Pile.pop()"[color="red", fontsize="6", fontname="Arial"]; +"comp2/Pile comp2/Pile.push(int)" -> "comp2/Pile comp2/Pile.pop()" [label="comp2/Pile comp2/Pile.next : 20" ] +"void comp2/Pile.()" -> "comp2/Pile comp2/Pile.pop()" [label="comp2/Pile comp2/Pile.next : 10" ] +} \ No newline at end of file diff --git a/src-tests/rwsets/cqueue/TestCqueue.testqueue.data b/src-tests/rwsets/cqueue/TestCqueue.testqueue.data new file mode 100644 index 0000000..5e1087b --- /dev/null +++ b/src-tests/rwsets/cqueue/TestCqueue.testqueue.data @@ -0,0 +1,15 @@ +digraph "DirectedGraph" { + graph [concentrate = true]; + center=true; + fontsize=6; + node [ color=blue,shape="box"fontsize=6,fontcolor=black,fontname=Arial]; + edge [ color=black,fontsize=6,fontcolor=black,fontname=Arial]; +"comp2/Queue comp2/Queue.pushback(int)"[color="red", fontsize="6", fontname="Arial"]; +"comp2/Queue comp2/Queue.pop()" -> "comp2/Queue comp2/Queue.pushback(int)" [label="comp2/Queue comp2/Queue.last : 35" ] +"comp2/Queue comp2/Queue.pushback(int)" -> "comp2/Queue comp2/Queue.pushback(int)" [label="comp2/Queue comp2/Queue.last : 18" ] +"comp2/Queue comp2/Queue.pushback(int)" -> "comp2/Queue comp2/Queue.pushback(int)" [label="comp2/Queue comp2/Queue.last : 24" ] +"comp2/Queue comp2/Queue.pushback(int)" -> "comp2/Queue comp2/Queue.pushback(int)" [label="int comp2/Queue.n : 17" ] +"comp2/Queue comp2/Queue.pushback(int)" -> "comp2/Queue comp2/Queue.pushback(int)" [label="int comp2/Queue.n : 22" ] +"void comp2/Queue.()" -> "comp2/Queue comp2/Queue.pushback(int)" [label="comp2/Queue comp2/Queue.last : 12" ] +"void comp2/Queue.()" -> "comp2/Queue comp2/Queue.pushback(int)" [label="int comp2/Queue.n : 10" ] +} \ No newline at end of file diff --git a/src-tests/rwsets/database/TestDatabase.java b/src-tests/rwsets/database/TestDatabase.java new file mode 100644 index 0000000..f59ecba --- /dev/null +++ b/src-tests/rwsets/database/TestDatabase.java @@ -0,0 +1,130 @@ +package rwsets.database; + + + +import japa.parser.ParseException; + +import java.io.File; +import java.io.IOException; +import java.util.Properties; + +import org.junit.Assert; +import org.junit.Test; + +import rwsets.Helper; + +import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.shrikeCT.InvalidClassFileException; +import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; +import com.ibm.wala.util.io.CommandLine; +import com.ibm.wala.util.warnings.Warnings; + +import depend.MethodDependencyAnalysis; +import depend.util.Util; +import depend.util.graph.SimpleGraph; + +public class TestDatabase { + + String USER_DIR = System.getProperty("user.dir"); + String SEP = System.getProperty("file.separator"); + String EXAMPLES = USER_DIR + SEP + "example-apps"; + String TEST_DIR = USER_DIR + SEP + "src-tests"; + String EXAMPLES_SRC = EXAMPLES + SEP + "src"; + String EXAMPLES_JAR = EXAMPLES; + String RESOURCES_DIR = USER_DIR + SEP + "dat"; + String databasejar = EXAMPLES_JAR + SEP + "database.jar"; + + @Test + public void testAddDependency() throws IOException, WalaException, CancelException, ParseException, InvalidClassFileException { + + String strCompUnit = EXAMPLES_SRC + SEP + "database/RepFunc.java"; + + //filter vê se tem este nome na package + String filter = "comp"; + + Assert.assertTrue((new File(strCompUnit)).exists()); + Assert.assertTrue((new File(databasejar)).exists()); + + //line e de onde a análise e iniciada + String line = " if (repList.insertCheck(repList, f)) {"; + SimpleGraph sg = depend.Main.analyze(databasejar, filter, strCompUnit, line); + + String expectedResultFile = TEST_DIR + SEP + "rwsets/database/TestDatabase.testAdd.data"; + Assert.assertEquals(Helper.readFile(expectedResultFile), sg.toDotString()); + } + + @Test + public void testAnalysisWithLineContents() throws Exception { + String strCompUnit = EXAMPLES_SRC + SEP + "database/RepFunc.java"; + String exclusionFile = RESOURCES_DIR + SEP + "ExclusionAllJava.txt"; + String exclusionFileForCallGraph = RESOURCES_DIR + SEP + "ExclusionForCallGraph.txt"; + String databasejar = EXAMPLES_JAR + SEP + "database.jar"; + String targetClass = "Lcomp/RepFunc"; + String targetMethod = "addFuncRepLista(Lcomp/Funcionario;)Z"; + + // checks + Assert.assertTrue((new File(strCompUnit)).exists()); + Assert.assertTrue((new File(exclusionFile)).exists()); + Assert.assertTrue((new File(exclusionFileForCallGraph)).exists()); + Assert.assertTrue((new File(databasejar)).exists()); + + + String[] args = new String[] { + "-appJar=" + databasejar, + "-printWalaWarnings=" + false, + "-exclusionFile=" + exclusionFile, + "-exclusionFileForCallGraph=" + exclusionFileForCallGraph, + "-dotPath=" + "/usr/bin/dot", + "-appPrefix=" + "comp", + "-listAppClasses=" + false, + "-listAllClasses=" + false, + "-listAppMethods=" + false, + "-genCallGraph=" + false, + "-measureTime=" + false, + "-reportType=" + "list", + "-targetClass=" + targetClass, + "-targetMethod=" + targetMethod, + "-targetLine=33"}; + + // reading and saving command-line properties + Properties p = CommandLine.parse(args); + Util.setProperties(p); + + // clearing warnings from WALA + Warnings.clear(); + + MethodDependencyAnalysis mda = new MethodDependencyAnalysis(p); + + // find informed class + IClass clazz = depend.Main.findClass(mda); + // find informed method + IMethod method = depend.Main.findMethod(clazz); + SimpleGraph sg = depend.Main.run(mda, method); + + String expectedResultFile = TEST_DIR + SEP + "rwsets/database/TestDatabase.testAnalysisWithLineContents.data"; + Assert.assertEquals(Helper.readFile(expectedResultFile), sg.toString()); + } + + @Test + public void testFSearchDepedency() throws IOException, WalaException, CancelException, ParseException, InvalidClassFileException { + + String strCompUnit = EXAMPLES_SRC + SEP + "database/List.java"; + + //filter vê se tem este nome na package + String filter = "comp"; + + Assert.assertTrue((new File(strCompUnit)).exists()); + Assert.assertTrue((new File(databasejar)).exists()); + + //line e de onde a análise e iniciada + String line = " if (lista == null || lista.func == null) {"; + SimpleGraph sg = depend.Main.analyze(databasejar, filter, strCompUnit, line); + + String expectedResultFile = TEST_DIR + SEP + "rwsets/database/TestDatabase.testFSearch.data"; + Assert.assertEquals(Helper.readFile(expectedResultFile), sg.toDotString()); + } + + +} diff --git a/src-tests/rwsets/database/TestDatabase.testAdd.data b/src-tests/rwsets/database/TestDatabase.testAdd.data new file mode 100644 index 0000000..afb32d5 --- /dev/null +++ b/src-tests/rwsets/database/TestDatabase.testAdd.data @@ -0,0 +1,27 @@ +digraph "DirectedGraph" { + graph [concentrate = true]; + center=true; + fontsize=6; + node [ color=blue,shape="box"fontsize=6,fontcolor=black,fontname=Arial]; + edge [ color=black,fontsize=6,fontcolor=black,fontname=Arial]; +"boolean comp/RepFunc.addFuncRepLista(comp/Funcionario)"[color="red", fontsize="6", fontname="Arial"]; +"boolean comp/RepFunc.addFuncRepLista(comp/Funcionario)" -> "boolean comp/RepFunc.addFuncRepLista(comp/Funcionario)" [label="comp/List comp/RepFunc.repList : 34" ] +"comp/List comp/List.insert(comp/List,comp/Funcionario)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/Funcionario comp/List.func : 23" ] +"comp/List comp/List.insert(comp/List,comp/Funcionario)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/Funcionario comp/List.func : 26" ] +"comp/List comp/List.insert(comp/List,comp/Funcionario)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/List comp/List.next : 29" ] +"comp/List comp/List.insert(comp/List,comp/Funcionario)" -> "comp/List comp/List.insert(comp/List,comp/Funcionario)" [label="comp/Funcionario comp/List.func : 23" ] +"comp/List comp/List.insert(comp/List,comp/Funcionario)" -> "comp/List comp/List.insert(comp/List,comp/Funcionario)" [label="comp/Funcionario comp/List.func : 26" ] +"comp/List comp/List.insert(comp/List,comp/Funcionario)" -> "comp/List comp/List.insert(comp/List,comp/Funcionario)" [label="comp/List comp/List.next : 29" ] +"comp/List comp/List.remove(comp/List,java/lang/String)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/List comp/List.next : 42" ] +"comp/List comp/List.remove(comp/List,java/lang/String)" -> "comp/List comp/List.insert(comp/List,comp/Funcionario)" [label="comp/List comp/List.next : 42" ] +"void comp/Funcionario.(java/lang/String,java/lang/String,java/lang/String,int)" -> "boolean comp/List.insertCheck(comp/List,comp/Funcionario)" [label="java/lang/String comp/Funcionario.cpf : 11" ] +"void comp/Funcionario.(java/lang/String,java/lang/String,java/lang/String,int)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="java/lang/String comp/Funcionario.cpf : 11" ] +"void comp/Funcionario.setCpf(java/lang/String)" -> "boolean comp/List.insertCheck(comp/List,comp/Funcionario)" [label="java/lang/String comp/Funcionario.cpf : 41" ] +"void comp/Funcionario.setCpf(java/lang/String)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="java/lang/String comp/Funcionario.cpf : 41" ] +"void comp/List.()" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/Funcionario comp/List.func : 9" ] +"void comp/List.()" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/List comp/List.next : 10" ] +"void comp/List.()" -> "comp/List comp/List.insert(comp/List,comp/Funcionario)" [label="comp/Funcionario comp/List.func : 9" ] +"void comp/List.()" -> "comp/List comp/List.insert(comp/List,comp/Funcionario)" [label="comp/List comp/List.next : 10" ] +"void comp/RepFunc.()" -> "boolean comp/RepFunc.addFuncRepLista(comp/Funcionario)" [label="comp/List comp/RepFunc.repList : 10" ] +"void comp/RepFunc.removeFuncRepLista(java/lang/String)" -> "boolean comp/RepFunc.addFuncRepLista(comp/Funcionario)" [label="comp/List comp/RepFunc.repList : 51" ] +} \ No newline at end of file diff --git a/src-tests/rwsets/database/TestDatabase.testAnalysisWithLineContents.data b/src-tests/rwsets/database/TestDatabase.testAnalysisWithLineContents.data new file mode 100644 index 0000000..800d80d --- /dev/null +++ b/src-tests/rwsets/database/TestDatabase.testAnalysisWithLineContents.data @@ -0,0 +1,13 @@ +"boolean comp/RepFunc.addFuncRepLista(comp/Funcionario)" -> "boolean comp/RepFunc.addFuncRepLista(comp/Funcionario)" [label="comp/List comp/RepFunc.repList : 34" ] +"comp/List comp/List.insert(comp/List,comp/Funcionario)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/Funcionario comp/List.func : 23" ] +"comp/List comp/List.insert(comp/List,comp/Funcionario)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/Funcionario comp/List.func : 26" ] +"comp/List comp/List.insert(comp/List,comp/Funcionario)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/List comp/List.next : 29" ] +"comp/List comp/List.remove(comp/List,java/lang/String)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/List comp/List.next : 42" ] +"void comp/Funcionario.(java/lang/String,java/lang/String,java/lang/String,int)" -> "boolean comp/List.insertCheck(comp/List,comp/Funcionario)" [label="java/lang/String comp/Funcionario.cpf : 11" ] +"void comp/Funcionario.(java/lang/String,java/lang/String,java/lang/String,int)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="java/lang/String comp/Funcionario.cpf : 11" ] +"void comp/Funcionario.setCpf(java/lang/String)" -> "boolean comp/List.insertCheck(comp/List,comp/Funcionario)" [label="java/lang/String comp/Funcionario.cpf : 41" ] +"void comp/Funcionario.setCpf(java/lang/String)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="java/lang/String comp/Funcionario.cpf : 41" ] +"void comp/List.()" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/Funcionario comp/List.func : 9" ] +"void comp/List.()" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/List comp/List.next : 10" ] +"void comp/RepFunc.()" -> "boolean comp/RepFunc.addFuncRepLista(comp/Funcionario)" [label="comp/List comp/RepFunc.repList : 10" ] +"void comp/RepFunc.removeFuncRepLista(java/lang/String)" -> "boolean comp/RepFunc.addFuncRepLista(comp/Funcionario)" [label="comp/List comp/RepFunc.repList : 51" ] \ No newline at end of file diff --git a/src-tests/rwsets/database/TestDatabase.testFSearch.data b/src-tests/rwsets/database/TestDatabase.testFSearch.data new file mode 100644 index 0000000..16e50c1 --- /dev/null +++ b/src-tests/rwsets/database/TestDatabase.testFSearch.data @@ -0,0 +1,16 @@ +digraph "DirectedGraph" { + graph [concentrate = true]; + center=true; + fontsize=6; + node [ color=blue,shape="box"fontsize=6,fontcolor=black,fontname=Arial]; + edge [ color=black,fontsize=6,fontcolor=black,fontname=Arial]; +"comp/Funcionario comp/List.search(comp/List,java/lang/String)"[color="red", fontsize="6", fontname="Arial"]; +"comp/List comp/List.insert(comp/List,comp/Funcionario)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/Funcionario comp/List.func : 23" ] +"comp/List comp/List.insert(comp/List,comp/Funcionario)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/Funcionario comp/List.func : 26" ] +"comp/List comp/List.insert(comp/List,comp/Funcionario)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/List comp/List.next : 29" ] +"comp/List comp/List.remove(comp/List,java/lang/String)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/List comp/List.next : 42" ] +"void comp/Funcionario.(java/lang/String,java/lang/String,java/lang/String,int)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="java/lang/String comp/Funcionario.cpf : 11" ] +"void comp/Funcionario.setCpf(java/lang/String)" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="java/lang/String comp/Funcionario.cpf : 41" ] +"void comp/List.()" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/Funcionario comp/List.func : 9" ] +"void comp/List.()" -> "comp/Funcionario comp/List.search(comp/List,java/lang/String)" [label="comp/List comp/List.next : 10" ] +} \ No newline at end of file diff --git a/src-tests/rwsets/forest/TestForest.java b/src-tests/rwsets/forest/TestForest.java new file mode 100644 index 0000000..c02ed9c --- /dev/null +++ b/src-tests/rwsets/forest/TestForest.java @@ -0,0 +1,129 @@ +package rwsets.forest; + +import japa.parser.ParseException; + +import java.io.File; +import java.io.IOException; +import java.util.Properties; + +import org.junit.Assert; +import org.junit.Test; + +import rwsets.Helper; + +import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.shrikeCT.InvalidClassFileException; +import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; +import com.ibm.wala.util.io.CommandLine; +import com.ibm.wala.util.warnings.Warnings; + +import depend.MethodDependencyAnalysis; +import depend.util.Util; +import depend.util.graph.SimpleGraph; + + +public class TestForest { + + String USER_DIR = System.getProperty("user.dir"); + String SEP = System.getProperty("file.separator"); + String EXAMPLES = USER_DIR + SEP + "example-apps"; + String TEST_DIR = USER_DIR + SEP + "src-tests"; + String EXAMPLES_SRC = EXAMPLES + SEP + "src"; + String EXAMPLES_JAR = EXAMPLES; + String RESOURCES_DIR = USER_DIR + SEP + "dat"; + String forestjar = EXAMPLES_JAR + SEP + "forest.jar"; + + @Test + public void testPrintDepedency() throws IOException, WalaException, CancelException, ParseException, InvalidClassFileException { + + String strCompUnit = EXAMPLES_SRC + SEP + "forest/Bst.java"; + + //filter vê se tem este nome na package + String filter = "comp3"; + + Assert.assertTrue((new File(strCompUnit)).exists()); + Assert.assertTrue((new File(forestjar)).exists()); + + //line e de onde a análise e iniciada + String line = "if (node.left != null) printInOrder(node.left);"; + SimpleGraph sg = depend.Main.analyze(forestjar, filter, strCompUnit, line); + + String expectedResultFile = TEST_DIR + SEP + "rwsets/forest/TestForest.testPrint.data"; + Assert.assertEquals(Helper.readFile(expectedResultFile), sg.toDotString()); + } + + + @Test + public void testPrintWithLineContents() throws Exception { + String strCompUnit = EXAMPLES_SRC + SEP + "forest/Bst.java"; + String exclusionFile = RESOURCES_DIR + SEP + "ExclusionAllJava.txt"; + String exclusionFileForCallGraph = RESOURCES_DIR + SEP + "ExclusionForCallGraph.txt"; + String targetClass = "Lcomp3/Bst"; + String targetMethod = "printInOrder(Lcomp3/Bst;)V"; + + // checks + Assert.assertTrue((new File(strCompUnit)).exists()); + Assert.assertTrue((new File(exclusionFile)).exists()); + Assert.assertTrue((new File(exclusionFileForCallGraph)).exists()); + Assert.assertTrue((new File(forestjar)).exists()); + + + String[] args = new String[] { + "-appJar=" + forestjar, + "-printWalaWarnings=" + false, + "-exclusionFile=" + exclusionFile, + "-exclusionFileForCallGraph=" + exclusionFileForCallGraph, + "-dotPath=" + "/usr/bin/dot", + "-appPrefix=" + "comp3", + "-listAppClasses=" + false, + "-listAllClasses=" + false, + "-listAppMethods=" + false, + "-genCallGraph=" + false, + "-measureTime=" + false, + "-reportType=" + "list", + "-targetClass=" + targetClass, + "-targetMethod=" + targetMethod, + "-targetLine=75"}; + + // reading and saving command-line properties + Properties p = CommandLine.parse(args); + Util.setProperties(p); + + // clearing warnings from WALA + Warnings.clear(); + + MethodDependencyAnalysis mda = new MethodDependencyAnalysis(p); + + // find informed class + IClass clazz = depend.Main.findClass(mda); + // find informed method + IMethod method = depend.Main.findMethod(clazz); + SimpleGraph sg = depend.Main.run(mda, method); + + String expectedResultFile = TEST_DIR + SEP + "rwsets/forest/TestForest.testPrintWithLineContents.data"; + Assert.assertEquals(Helper.readFile(expectedResultFile), sg.toString()); + } + + @Test + public void testSearchDepedency() throws IOException, WalaException, CancelException, ParseException, InvalidClassFileException { + + String strCompUnit = EXAMPLES_SRC + SEP + "forest/Bst.java"; + + //filter vê se tem este nome na package + String filter = "comp3"; + + Assert.assertTrue((new File(strCompUnit)).exists()); + Assert.assertTrue((new File(forestjar)).exists()); + + //line e de onde a análise e iniciada + //String line = " if (node == null) {"; + String line = "return search(node.left, n);"; + SimpleGraph sg = depend.Main.analyze(forestjar, filter, strCompUnit, line); + + String expectedResultFile = TEST_DIR + SEP + "rwsets/forest/TestForest.testSearch.data"; + Assert.assertEquals(Helper.readFile(expectedResultFile), sg.toDotString()); + } + +} diff --git a/src-tests/rwsets/forest/TestForest.testPrint.data b/src-tests/rwsets/forest/TestForest.testPrint.data new file mode 100644 index 0000000..2f69891 --- /dev/null +++ b/src-tests/rwsets/forest/TestForest.testPrint.data @@ -0,0 +1,23 @@ +digraph "DirectedGraph" { + graph [concentrate = true]; + center=true; + fontsize=6; + node [ color=blue,shape="box"fontsize=6,fontcolor=black,fontname=Arial]; + edge [ color=black,fontsize=6,fontcolor=black,fontname=Arial]; +"void comp3/Bst.printInOrder(comp3/Bst)"[color="red", fontsize="6", fontname="Arial"]; +"comp3/Bst comp3/Bst.insert(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.left : 23" ] +"comp3/Bst comp3/Bst.insert(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.right : 26" ] +"comp3/Bst comp3/Bst.insert(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="int comp3/Bst.n : 17" ] +"comp3/Bst comp3/Bst.insert(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="int comp3/Bst.n : 20" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.left : 36" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.left : 50" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.left : 56" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.right : 39" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.right : 51" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.right : 55" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="int comp3/Bst.n : 49" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="int comp3/Bst.n : 54" ] +"void comp3/Bst.()" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.left : 10" ] +"void comp3/Bst.()" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.right : 11" ] +"void comp3/Bst.()" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="int comp3/Bst.n : 9" ] +} \ No newline at end of file diff --git a/src-tests/rwsets/forest/TestForest.testPrintWithLineContents.data b/src-tests/rwsets/forest/TestForest.testPrintWithLineContents.data new file mode 100644 index 0000000..540963a --- /dev/null +++ b/src-tests/rwsets/forest/TestForest.testPrintWithLineContents.data @@ -0,0 +1,15 @@ +"comp3/Bst comp3/Bst.insert(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.left : 23" ] +"comp3/Bst comp3/Bst.insert(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.right : 26" ] +"comp3/Bst comp3/Bst.insert(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="int comp3/Bst.n : 17" ] +"comp3/Bst comp3/Bst.insert(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="int comp3/Bst.n : 20" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.left : 36" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.left : 50" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.left : 56" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.right : 39" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.right : 51" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.right : 55" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="int comp3/Bst.n : 49" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="int comp3/Bst.n : 54" ] +"void comp3/Bst.()" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.left : 10" ] +"void comp3/Bst.()" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="comp3/Bst comp3/Bst.right : 11" ] +"void comp3/Bst.()" -> "void comp3/Bst.printInOrder(comp3/Bst)" [label="int comp3/Bst.n : 9" ] \ No newline at end of file diff --git a/src-tests/rwsets/forest/TestForest.testSearch.data b/src-tests/rwsets/forest/TestForest.testSearch.data new file mode 100644 index 0000000..4d2d1e9 --- /dev/null +++ b/src-tests/rwsets/forest/TestForest.testSearch.data @@ -0,0 +1,23 @@ +digraph "DirectedGraph" { + graph [concentrate = true]; + center=true; + fontsize=6; + node [ color=blue,shape="box"fontsize=6,fontcolor=black,fontname=Arial]; + edge [ color=black,fontsize=6,fontcolor=black,fontname=Arial]; +"boolean comp3/Bst.search(comp3/Bst,int)"[color="red", fontsize="6", fontname="Arial"]; +"comp3/Bst comp3/Bst.insert(comp3/Bst,int)" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="comp3/Bst comp3/Bst.left : 23" ] +"comp3/Bst comp3/Bst.insert(comp3/Bst,int)" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="comp3/Bst comp3/Bst.right : 26" ] +"comp3/Bst comp3/Bst.insert(comp3/Bst,int)" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="int comp3/Bst.n : 17" ] +"comp3/Bst comp3/Bst.insert(comp3/Bst,int)" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="int comp3/Bst.n : 20" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="comp3/Bst comp3/Bst.left : 36" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="comp3/Bst comp3/Bst.left : 50" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="comp3/Bst comp3/Bst.left : 56" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="comp3/Bst comp3/Bst.right : 39" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="comp3/Bst comp3/Bst.right : 51" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="comp3/Bst comp3/Bst.right : 55" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="int comp3/Bst.n : 49" ] +"comp3/Bst comp3/Bst.remove(comp3/Bst,int)" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="int comp3/Bst.n : 54" ] +"void comp3/Bst.()" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="comp3/Bst comp3/Bst.left : 10" ] +"void comp3/Bst.()" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="comp3/Bst comp3/Bst.right : 11" ] +"void comp3/Bst.()" -> "boolean comp3/Bst.search(comp3/Bst,int)" [label="int comp3/Bst.n : 9" ] +} \ No newline at end of file diff --git a/src-tests/rwsets/pgproj/TestPgProj.test0.data b/src-tests/rwsets/pgproj/TestPgProj.test0.data new file mode 100644 index 0000000..e69de29 diff --git a/src-tests/rwsets/pgproj/TestPgProj.test1.data b/src-tests/rwsets/pgproj/TestPgProj.test1.data new file mode 100644 index 0000000..e69de29 diff --git a/src-tests/rwsets/pgproj/TestPgproj.java b/src-tests/rwsets/pgproj/TestPgproj.java new file mode 100644 index 0000000..1d4cae5 --- /dev/null +++ b/src-tests/rwsets/pgproj/TestPgproj.java @@ -0,0 +1,87 @@ +package rwsets.pgproj; + + + + + + +import japa.parser.ParseException; + +import java.io.File; +import java.io.IOException; +import java.util.Properties; +import java.util.Vector; + +import org.junit.Assert; +import org.junit.Test; + +import rwsets.Helper; + +import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.classLoader.IMethod; +import com.ibm.wala.shrikeCT.InvalidClassFileException; +import com.ibm.wala.util.CancelException; +import com.ibm.wala.util.WalaException; +import com.ibm.wala.util.io.CommandLine; +import com.ibm.wala.util.warnings.Warnings; + +import depend.MethodDependencyAnalysis; +import depend.util.Util; +import depend.util.graph.SimpleGraph; + + +public class TestPgproj { + String USER_DIR = System.getProperty("user.dir"); + String SEP = System.getProperty("file.separator"); + String EXAMPLES = USER_DIR + SEP + "example-apps"; + String TEST_DIR = USER_DIR + SEP + "src-tests"; + String EXAMPLES_SRC = EXAMPLES + SEP + "src"; + String EXAMPLES_JAR = EXAMPLES; + String RESOURCES_DIR = USER_DIR + SEP + "dat"; + + //@Test(expected=NullPointerException.class) + @Test + public void test0() throws IOException, WalaException, CancelException, ParseException, InvalidClassFileException { + + String strCompUnit = EXAMPLES_SRC + SEP + "pgproj/AlgoritmoDeCasteljau.java"; + String pgprojjar = EXAMPLES_JAR + SEP + "pgproj.jar"; + //filter vê se tem este nome na package + String filter = "projpg"; + + Assert.assertTrue((new File(strCompUnit)).exists()); + Assert.assertTrue((new File(pgprojjar)).exists()); + + //line e de onde a análise e iniciada + String line = "this.pontosCasteljau.add((Ponto)pontos.get(0));"; + SimpleGraph sg = depend.Main.analyze(pgprojjar, filter, strCompUnit, line); + + String expectedResultFile = TEST_DIR + SEP + "rwsets/pgproj/TestPgProj.test0.data"; + Assert.assertEquals(Helper.readFile(expectedResultFile), sg.toDotString()); + } + //teste acima da erro por motivo desconhecido + + @Test + public void test1() throws IOException, WalaException, CancelException, ParseException, InvalidClassFileException { + + String strCompUnit = EXAMPLES_SRC + SEP + "pgproj/Ponto.java"; + String pgprojjar = EXAMPLES_JAR + SEP + "pgproj.jar"; + //filter vê se tem este nome na package + String filter = "projpg"; + + Assert.assertTrue((new File(strCompUnit)).exists()); + Assert.assertTrue((new File(pgprojjar)).exists()); + + //line e de onde a análise e iniciada + String line = "boolean colidiu = false;"; + SimpleGraph sg = depend.Main.analyze(pgprojjar, filter, strCompUnit, line); + + String expectedResultFile = TEST_DIR + SEP + "rwsets/pgproj/TestPgProj.test1.data"; + Assert.assertEquals(Helper.readFile(expectedResultFile), sg.toDotString()); + } + + + + + + +}