1 | /* |
2 | * Copyright (c) 2001-2009, Jean Tessier |
3 | * All rights reserved. |
4 | * |
5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions |
7 | * are met: |
8 | * |
9 | * * Redistributions of source code must retain the above copyright |
10 | * notice, this list of conditions and the following disclaimer. |
11 | * |
12 | * * Redistributions in binary form must reproduce the above copyright |
13 | * notice, this list of conditions and the following disclaimer in the |
14 | * documentation and/or other materials provided with the distribution. |
15 | * |
16 | * * Neither the name of Jean Tessier nor the names of his contributors |
17 | * may be used to endorse or promote products derived from this software |
18 | * without specific prior written permission. |
19 | * |
20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
21 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
22 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
23 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR |
24 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
25 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
26 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
27 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
28 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
29 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
30 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
31 | */ |
32 | |
33 | package com.jeantessier.dependency; |
34 | |
35 | import java.io.*; |
36 | import java.util.*; |
37 | |
38 | import junit.framework.*; |
39 | |
40 | import org.apache.log4j.*; |
41 | |
42 | import com.jeantessier.classreader.*; |
43 | |
44 | public class TestDependencyExtractor extends TestCase { |
45 | public static final String TEST_CLASS = "test"; |
46 | public static final String TEST_FILENAME = "classes" + File.separator + "test.class"; |
47 | |
48 | private NodeFactory factory; |
49 | |
50 | private Node _package; |
51 | private Node test_class; |
52 | private Node test_main_feature; |
53 | private Node test_test_feature; |
54 | |
55 | private Node java_io_package; |
56 | private Node java_io_PrintStream_class; |
57 | private Node java_io_PrintStream_println_feature; |
58 | |
59 | private Node java_lang_package; |
60 | private Node java_lang_NullPointerException_class; |
61 | private Node java_lang_Object_class; |
62 | private Node java_lang_Object_Object_feature; |
63 | private Node java_lang_String_class; |
64 | private Node java_lang_System_class; |
65 | private Node java_lang_System_out_feature; |
66 | |
67 | private Node java_util_package; |
68 | private Node java_util_Collections_class; |
69 | private Node java_util_Collections_singleton_feature; |
70 | private Node java_util_Set_class; |
71 | |
72 | private ClassfileLoader loader; |
73 | private NodeFactory testFactory; |
74 | |
75 | protected void setUp() throws Exception { |
76 | Logger.getLogger(getClass()).info("Starting test: " + getName()); |
77 | |
78 | factory = new NodeFactory(); |
79 | |
80 | _package = factory.createPackage(""); |
81 | test_class = factory.createClass("test"); |
82 | test_main_feature = factory.createFeature("test.main(java.lang.String[])"); |
83 | test_test_feature = factory.createFeature("test.test()"); |
84 | |
85 | java_io_package = factory.createPackage("java.io"); |
86 | java_io_PrintStream_class = factory.createClass("java.io.PrintStream"); |
87 | java_io_PrintStream_println_feature = factory.createFeature("java.io.PrintStream.println(java.lang.Object)"); |
88 | |
89 | java_lang_package = factory.createPackage("java.lang"); |
90 | java_lang_NullPointerException_class = factory.createClass("java.lang.NullPointerException"); |
91 | java_lang_Object_class = factory.createClass("java.lang.Object"); |
92 | java_lang_Object_Object_feature = factory.createFeature("java.lang.Object.Object()"); |
93 | java_lang_String_class = factory.createClass("java.lang.String"); |
94 | java_lang_System_class = factory.createClass("java.lang.System"); |
95 | java_lang_System_out_feature = factory.createFeature("java.lang.System.out"); |
96 | |
97 | java_util_package = factory.createPackage("java.util"); |
98 | java_util_Collections_class = factory.createClass("java.util.Collections"); |
99 | java_util_Collections_singleton_feature = factory.createFeature("java.util.Collections.singleton(java.lang.Object)"); |
100 | java_util_Set_class = factory.createClass("java.util.Set"); |
101 | |
102 | test_class.addDependency(java_lang_Object_class); |
103 | test_main_feature.addDependency(java_io_PrintStream_class); |
104 | test_main_feature.addDependency(java_io_PrintStream_println_feature); |
105 | test_main_feature.addDependency(java_lang_NullPointerException_class); |
106 | test_main_feature.addDependency(java_lang_Object_class); |
107 | test_main_feature.addDependency(java_lang_Object_Object_feature); |
108 | test_main_feature.addDependency(java_lang_String_class); |
109 | test_main_feature.addDependency(java_lang_System_out_feature); |
110 | test_main_feature.addDependency(java_util_Collections_singleton_feature); |
111 | test_main_feature.addDependency(java_util_Set_class); |
112 | test_test_feature.addDependency(java_lang_Object_Object_feature); |
113 | |
114 | loader = new AggregatingClassfileLoader(); |
115 | loader.load(Collections.singleton(TEST_FILENAME)); |
116 | |
117 | testFactory = new NodeFactory(); |
118 | loader.getClassfile(TEST_CLASS).accept(new CodeDependencyCollector(testFactory)); |
119 | } |
120 | |
121 | protected void tearDown() throws Exception { |
122 | Logger.getLogger(getClass()).info("End of " + getName()); |
123 | } |
124 | |
125 | public void testPackageList() { |
126 | assertEquals("Different list of packages", |
127 | factory.getPackages().keySet(), |
128 | testFactory.getPackages().keySet()); |
129 | } |
130 | |
131 | public void testClassList() { |
132 | assertEquals("Different list of classes", |
133 | factory.getClasses().keySet(), |
134 | testFactory.getClasses().keySet()); |
135 | } |
136 | |
137 | public void testFeatureList() { |
138 | assertEquals("Different list of features", |
139 | factory.getFeatures().keySet(), |
140 | testFactory.getFeatures().keySet()); |
141 | } |
142 | |
143 | public void testPackages() { |
144 | for (String key : factory.getPackages().keySet()) { |
145 | assertEquals(factory.getPackages().get(key), testFactory.getPackages().get(key)); |
146 | assertTrue(key + " is same", factory.getPackages().get(key) != testFactory.getPackages().get(key)); |
147 | assertEquals(key + " inbounds", |
148 | factory.getPackages().get(key).getInboundDependencies().size(), |
149 | testFactory.getPackages().get(key).getInboundDependencies().size()); |
150 | assertEquals(key + " outbounds", |
151 | factory.getPackages().get(key).getOutboundDependencies().size(), |
152 | testFactory.getPackages().get(key).getOutboundDependencies().size()); |
153 | } |
154 | } |
155 | |
156 | public void testClasses() { |
157 | for (String key : factory.getClasses().keySet()) { |
158 | assertEquals(factory.getClasses().get(key), testFactory.getClasses().get(key)); |
159 | assertTrue(key + " is same", factory.getClasses().get(key) != testFactory.getClasses().get(key)); |
160 | assertEquals(key + " inbounds", |
161 | factory.getClasses().get(key).getInboundDependencies().size(), |
162 | testFactory.getClasses().get(key).getInboundDependencies().size()); |
163 | assertEquals(key + " outbounds", |
164 | factory.getClasses().get(key).getOutboundDependencies().size(), |
165 | testFactory.getClasses().get(key).getOutboundDependencies().size()); |
166 | } |
167 | } |
168 | |
169 | public void testFeatures() { |
170 | for (String key : factory.getFeatures().keySet()) { |
171 | assertEquals(factory.getFeatures().get(key), testFactory.getFeatures().get(key)); |
172 | assertTrue(key + " is same", factory.getFeatures().get(key) != testFactory.getFeatures().get(key)); |
173 | assertEquals(key + " inbounds", |
174 | factory.getFeatures().get(key).getInboundDependencies().size(), |
175 | testFactory.getFeatures().get(key).getInboundDependencies().size()); |
176 | assertEquals(key + " outbounds", |
177 | factory.getFeatures().get(key).getOutboundDependencies().size(), |
178 | testFactory.getFeatures().get(key).getOutboundDependencies().size()); |
179 | } |
180 | } |
181 | |
182 | public void testStaticInitializer() { |
183 | ClassfileLoader loader = new AggregatingClassfileLoader(); |
184 | NodeFactory factory = new NodeFactory(); |
185 | |
186 | loader.load(Collections.singleton("classes" + File.separator + "StaticInitializerTest.class")); |
187 | |
188 | Classfile classfile = loader.getClassfile("StaticInitializerTest"); |
189 | classfile.accept(new CodeDependencyCollector(factory)); |
190 | |
191 | Collection featureNames = factory.getFeatures().keySet(); |
192 | |
193 | for (Method_info method : classfile.getAllMethods()) { |
194 | assertTrue("Missing method " + method.getFullSignature(), featureNames.contains(method.getFullSignature())); |
195 | } |
196 | } |
197 | } |