]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/core/src/com/ibm/icu/dev/test/serializable/CoverageTest.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / core / src / com / ibm / icu / dev / test / serializable / CoverageTest.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 2005-2010, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  *\r
7  */\r
8 \r
9 package com.ibm.icu.dev.test.serializable;\r
10 \r
11 import java.io.ByteArrayInputStream;\r
12 import java.io.ByteArrayOutputStream;\r
13 import java.io.File;\r
14 import java.io.FileOutputStream;\r
15 import java.io.IOException;\r
16 import java.io.ObjectOutputStream;\r
17 import java.lang.reflect.Modifier;\r
18 import java.net.URL;\r
19 import java.util.Enumeration;\r
20 \r
21 import com.ibm.icu.impl.URLHandler;\r
22 \r
23 /**\r
24  * @author emader\r
25  *\r
26  * TODO To change the template for this generated type comment go to\r
27  * Window - Preferences - Java - Code Style - Code Templates\r
28  */\r
29 public class CoverageTest extends CompatibilityTest implements URLHandler.URLVisitor\r
30 {\r
31 \r
32     private static Class serializable;\r
33 \r
34     public void init() {\r
35         try {    \r
36             serializable = Class.forName("java.io.Serializable");\r
37         } catch (Exception e) {\r
38             // we're in deep trouble...\r
39             warnln("Woops! Can't get class info for Serializable.");\r
40         }\r
41     }\r
42 \r
43     private Target head = new Target(null);\r
44     private Target tail = head;\r
45     \r
46     private String path;\r
47     \r
48     public CoverageTest()\r
49     {\r
50         this(null);\r
51     }\r
52     \r
53     public CoverageTest(String path)\r
54     {\r
55         this.path = path;\r
56         \r
57         if (path != null) {\r
58             File dir = new File(path);\r
59             \r
60             if (!dir.exists()) {\r
61                 dir.mkdirs();\r
62             }\r
63         }\r
64     }\r
65     \r
66     private void writeFile(String className, byte bytes[])\r
67     {\r
68         File file = new File(path + File.separator + className + ".dat");\r
69         FileOutputStream stream;\r
70         \r
71         try {\r
72             stream = new FileOutputStream(file);\r
73             \r
74             stream.write(bytes);\r
75             stream.close();\r
76         } catch (Exception e) {\r
77             System.out.print(" - can't write file!");\r
78         }\r
79     }\r
80     \r
81     private void add(String className, int classModifiers, byte bytes[])\r
82     {\r
83         CoverageTarget newTarget = new CoverageTarget(className, classModifiers, bytes);\r
84         \r
85         tail.setNext(newTarget);\r
86         tail = newTarget;\r
87     }\r
88     \r
89     public class CoverageTarget extends HandlerTarget\r
90     {\r
91         private byte bytes[];\r
92         private int modifiers;\r
93         \r
94         public CoverageTarget(String className, int classModifiers, byte bytes[])\r
95         {\r
96             super(className, bytes == null? null : new ByteArrayInputStream(bytes));\r
97             \r
98             this.bytes = bytes;\r
99             modifiers = classModifiers;\r
100         }\r
101         \r
102         public boolean validate()\r
103         {\r
104             return super.validate() || Modifier.isAbstract(modifiers);\r
105         }\r
106         \r
107         public void execute() throws Exception\r
108         {\r
109             Class c = Class.forName(name);\r
110             try {\r
111                 /*Field uid = */c.getDeclaredField("serialVersionUID");\r
112             } catch (Exception e) {\r
113                 errln("No serialVersionUID");\r
114             }\r
115             \r
116             if (inputStream == null) {\r
117                 params.testCount += 1;\r
118             } else {\r
119                if (path != null) {\r
120                     writeFile(name, bytes);\r
121                 }\r
122                 \r
123                 super.execute();\r
124             }\r
125         }\r
126     }\r
127     \r
128     public void visit(String str)\r
129     {\r
130         if(serializable==null){\r
131             return;\r
132         }\r
133         int ix = str.lastIndexOf(".class");\r
134         \r
135         if (ix >= 0) {\r
136             String className = "com.ibm.icu" + str.substring(0, ix).replace('/', '.');\r
137             \r
138             // Skip things in com.ibm.icu.dev; they're not relevant.\r
139             if (className.startsWith("com.ibm.icu.dev.")) {\r
140                 return;\r
141             }\r
142             \r
143             try {\r
144                 Class c = Class.forName(className);\r
145                 int   m = c.getModifiers();\r
146                 \r
147                 if (!c.isEnum() && serializable.isAssignableFrom(c)) {\r
148                     if (Modifier.isPublic(m) && !Modifier.isInterface(m)) { \r
149                         SerializableTest.Handler handler = SerializableTest.getHandler(className);\r
150                         \r
151                         if (handler != null) {\r
152                             Object objectsOut[] = handler.getTestObjects();\r
153                             \r
154                             ByteArrayOutputStream byteOut = new ByteArrayOutputStream();\r
155                             ObjectOutputStream out = new ObjectOutputStream(byteOut);\r
156                             \r
157                             try {\r
158                                 out.writeObject(objectsOut);\r
159                                 out.close();\r
160                                 byteOut.close();\r
161                             } catch (IOException e) {\r
162                                 warnln("Error writing test objects: " + e.toString());\r
163                                 return;\r
164                             }\r
165                             \r
166                             add(className, m, byteOut.toByteArray());\r
167                         } else {\r
168                             add(className, m, null);\r
169                         }\r
170                     }\r
171                 }\r
172             } catch (Exception e) {\r
173                 e.printStackTrace();\r
174                 warnln("coverage of " + className + ": " + e.toString());\r
175             } catch (Throwable e) {\r
176                 e.printStackTrace();\r
177                 warnln("coverage of " + className + ": " + e.toString());\r
178             }\r
179         }\r
180     }\r
181     \r
182     protected Target getTargets(String targetName)\r
183     {\r
184         \r
185         if (System.getSecurityManager() != null) {\r
186             // This test won't run under a security manager\r
187 \r
188             // TODO: Is the above statement really true?\r
189             // We probably need to set up the security policy properly\r
190             // for writing/reading serialized data.\r
191 \r
192             return null;\r
193         }\r
194         \r
195         if(serializable==null){\r
196             init();\r
197         }\r
198 \r
199         try {\r
200             Enumeration<URL> urlEnum = getClass().getClassLoader().getResources("com/ibm/icu");\r
201             while (urlEnum.hasMoreElements()) {\r
202                 URL url = urlEnum.nextElement();\r
203                 URLHandler handler  = URLHandler.get(url);\r
204                 handler.guide(this, true, false);\r
205             }\r
206         } catch (IOException e) {\r
207             throw new RuntimeException(e);\r
208         }\r
209 \r
210         return head.getNext();\r
211     }\r
212     \r
213     public static void main(String[] args)\r
214     {\r
215         CoverageTest test = new CoverageTest();\r
216         \r
217         test.run(args);\r
218     }\r
219 }\r