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