]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_2_1-src/src/com/ibm/icu/dev/test/serializable/CompatibilityTest.java
icu4jsrc
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / dev / test / serializable / CompatibilityTest.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1996-2008, 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.File;\r
12 import java.io.FileInputStream;\r
13 import java.io.FileNotFoundException;\r
14 import java.io.InputStream;\r
15 import java.io.ObjectInputStream;\r
16 import java.net.JarURLConnection;\r
17 import java.net.URL;\r
18 import java.util.Enumeration;\r
19 import java.util.MissingResourceException;\r
20 import java.util.jar.JarEntry;\r
21 import java.util.jar.JarFile;\r
22 \r
23 import com.ibm.icu.dev.test.TestFmwk;\r
24 //import com.ibm.icu.dev.test.serializable.SerializableTest;\r
25 \r
26 /**\r
27  * @author emader\r
28  */\r
29 public class CompatibilityTest extends TestFmwk\r
30 {\r
31     public class FolderTarget extends Target\r
32     {\r
33         private Target head = new Target(null);\r
34         private Target tail = head;\r
35         \r
36         public FolderTarget(String name)\r
37         {\r
38             super(name);\r
39         }\r
40         \r
41         public void add(String className, InputStream is)\r
42         {\r
43             HandlerTarget newTarget = new HandlerTarget(className, is);\r
44             \r
45             tail.setNext(newTarget);\r
46             tail = newTarget;\r
47         }\r
48         \r
49         protected boolean validate()\r
50         {\r
51             return true;\r
52         }\r
53         \r
54         protected void execute() throws Exception\r
55         {\r
56             params.indentLevel += 1;\r
57             \r
58             for (Target target = head.getNext(); target != null; target = target.getNext())\r
59             {\r
60                 target.run();\r
61             }\r
62             \r
63             params.indentLevel -= 1;\r
64         }\r
65     }\r
66 \r
67     public class HandlerTarget extends Target\r
68     {\r
69         protected SerializableTest.Handler handler = null;\r
70         protected InputStream inputStream = null;\r
71         \r
72         public HandlerTarget(String name, InputStream is)\r
73         {\r
74             super(name);\r
75             inputStream = is;\r
76         }\r
77         \r
78         protected boolean validate()\r
79         {\r
80             handler = SerializableTest.getHandler(name);\r
81             \r
82             return handler != null;\r
83         }\r
84         \r
85         protected void execute() throws Exception\r
86         {\r
87             if (params.inDocMode()) {\r
88                 // nothing to execute\r
89             } else if (!params.stack.included) {\r
90                 ++params.invalidCount;\r
91             } else {\r
92                 params.testCount += 1;\r
93 \r
94                 try {\r
95                     ObjectInputStream in = new ObjectInputStream(inputStream);\r
96                     Object inputObjects[] = (Object[]) in.readObject();\r
97                     Object testObjects[] = handler.getTestObjects();\r
98                     \r
99                     in.close();\r
100                     inputStream.close();\r
101                     \r
102                     // TODO: add equality test...\r
103                     // The commented out code below does that,\r
104                     // but some test objects don't define an equals() method,\r
105                     // and the default method is the same as the "==" operator...\r
106                     for (int i = 0; i < testObjects.length; i += 1) {\r
107     //                    if (! inputObjects[i].equals(testObjects[i])) {\r
108     //                        errln("Input object " + i + " failed equality test.");\r
109     //                    }\r
110                         \r
111                         if (! handler.hasSameBehavior(inputObjects[i], testObjects[i])) {\r
112                             warnln("Input object " + i + " failed behavior test.");\r
113                         }\r
114                     }\r
115                 }catch (MissingResourceException e){\r
116                     warnln("Could not load the data. "+e.getMessage());\r
117                 } catch (Exception e) {\r
118                   e.printStackTrace();\r
119                     errln("Exception: " + e.toString());\r
120                     \r
121                 }\r
122             }\r
123         }\r
124     }\r
125 \r
126     private static final String[][] SKIP_CASES = {\r
127         {"ICU_3.8.1",   "com.ibm.icu.text.PluralFormat.dat"},\r
128         {"ICU_3.8.1",   "com.ibm.icu.text.PluralRules.dat"},\r
129         // The case below actually works OK with 4.2M1 on JRE5, but not on JRE1.4.2.\r
130         // It looks the use of anonymous inner class is the root cause.  If we want\r
131         // to fix the root cause, it will likely break the backward compatibility.\r
132         // For now, we're skipping this case even it works OK on JRE5.  See ticket#6550.\r
133         {"ICU_4.0",     "com.ibm.icu.text.PluralRules.dat"},\r
134         {"ICU_3.6",     "com.ibm.icu.text.RuleBasedNumberFormat.dat"},\r
135         {"ICU_3.8.1",     "com.ibm.icu.text.RuleBasedNumberFormat.dat"},\r
136         {"ICU_4.0",     "com.ibm.icu.text.RuleBasedNumberFormat.dat"},\r
137     };\r
138 \r
139     private Target getFileTargets(URL fileURL)\r
140     {\r
141         File topDir = new File(fileURL.getPath());\r
142         File dataDirs[] = topDir.listFiles();\r
143         FolderTarget target = null;\r
144         \r
145         for (int d = 0; d < dataDirs.length; d += 1) {\r
146             File dataDir = dataDirs[d];\r
147             \r
148             if (dataDir.isDirectory()) {\r
149                 FolderTarget newTarget = new FolderTarget(dataDir.getName());\r
150                 File files[] = dataDir.listFiles();\r
151 \r
152                 newTarget.setNext(target);\r
153                 target = newTarget;\r
154 \r
155                 String dataDirName = dataDir.getName();\r
156 \r
157                 element_loop:\r
158                 for (int i = 0; i < files.length; i += 1) {\r
159                     File file = files[i];\r
160                     String filename = file.getName();\r
161                     int ix = filename.indexOf(".dat");\r
162 \r
163                     if (ix > 0) {\r
164                         String className = filename.substring(0, ix);\r
165 \r
166                         // Skip some cases which do not work well\r
167                         for (int j = 0; j < SKIP_CASES.length; j++) {\r
168                             if (dataDirName.equals(SKIP_CASES[j][0]) && filename.equals(SKIP_CASES[j][1])) {\r
169                                 logln("Skipping test case - " + dataDirName + "/" + className);\r
170                                 continue element_loop;\r
171                             }\r
172                         }\r
173 \r
174                         InputStream is;\r
175 \r
176                         try {\r
177                             is = new FileInputStream(file);\r
178                             target.add(className, is);\r
179                         } catch (FileNotFoundException e) {\r
180                             errln("Exception: " + e.toString());\r
181                         }\r
182                         \r
183                     }\r
184                 }\r
185             }\r
186         }\r
187             \r
188         return target;\r
189     }\r
190     \r
191     private Target getJarTargets(URL jarURL)\r
192     {\r
193         String prefix = jarURL.getPath();\r
194         String currentDir = null;\r
195         int ix = prefix.indexOf("!/");\r
196         JarFile jarFile;\r
197         FolderTarget target = null;\r
198 \r
199         if (ix >= 0) {\r
200             prefix = prefix.substring(ix + 2);\r
201         }\r
202 \r
203         try {\r
204             JarURLConnection conn = (JarURLConnection) jarURL.openConnection();\r
205 \r
206             jarFile = conn.getJarFile();\r
207 \r
208             Enumeration entries = jarFile.entries();\r
209 \r
210             element_loop:\r
211             while (entries.hasMoreElements()) {\r
212                 JarEntry entry = (JarEntry)entries.nextElement();\r
213                 String name = entry.getName();\r
214                 \r
215                 if (name.startsWith(prefix)) {\r
216                     name = name.substring(prefix.length());\r
217 \r
218                     if (! entry.isDirectory()) {\r
219                         int dx = name.lastIndexOf("/");\r
220                         String dirName  = name.substring(1, dx);\r
221                         String filename = name.substring(dx + 1);\r
222 \r
223                         if (! dirName.equals(currentDir)) {\r
224                             currentDir = dirName;\r
225 \r
226                             FolderTarget newTarget = new FolderTarget(currentDir);\r
227 \r
228                             newTarget.setNext(target);\r
229                             target = newTarget;\r
230                         }\r
231 \r
232                         int xx = filename.indexOf(".dat");\r
233                         \r
234                         if (xx > 0) {\r
235                             String className = filename.substring(0, xx);\r
236 \r
237                             // Skip some cases which do not work well\r
238                             for (int i = 0; i < SKIP_CASES.length; i++) {\r
239                                 if (dirName.equals(SKIP_CASES[i][0]) && filename.equals(SKIP_CASES[i][1])) {\r
240                                     logln("Skipping test case - " + dirName + "/" + className);\r
241                                     continue element_loop;\r
242                                 }\r
243                             }\r
244 \r
245                             target.add(className, jarFile.getInputStream(entry));\r
246                         }\r
247                     }\r
248                 }\r
249             }\r
250         } catch (Exception e) {\r
251             errln("jar error: " + e.getMessage());\r
252         }\r
253         \r
254         return target;\r
255     }\r
256     \r
257     protected Target getTargets(String targetName)\r
258     {\r
259         URL dataURL = getClass().getResource("data");\r
260         String protocol = dataURL.getProtocol();\r
261         \r
262         if (protocol.equals("jar")) {\r
263             return getJarTargets(dataURL);\r
264         } else if (protocol.equals("file")) {\r
265             return getFileTargets(dataURL);\r
266         } else {\r
267             errln("Don't know how to test " + dataURL.getPath());\r
268             return null;\r
269         }\r
270     }\r
271 \r
272     public static void main(String[] args)\r
273     {\r
274         CompatibilityTest test = new CompatibilityTest();\r
275         \r
276         test.run(args);\r
277     }\r
278 }\r