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