2 *******************************************************************************
3 * Copyright (C) 2007-2011, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 *******************************************************************************
8 package com.ibm.icu.dev.test.collator;
10 import java.util.Arrays;
11 import java.util.Locale;
12 import java.util.Random;
14 import com.ibm.icu.dev.test.TestFmwk;
15 import com.ibm.icu.text.Collator;
17 public class CollationThreadTest extends TestFmwk {
18 public static void main(String[] args) throws Exception {
19 new CollationThreadTest().run(args);
22 private static final String[] threadTestData;
24 final Collator collator = Collator.getInstance(new Locale("pl", "", ""));
25 final String[] temporaryData = {
26 "Banc Se\u00F3kdyaaouq Pfuymjec",
29 "G\u00F3kpo Adhdoetpwtx Twxma, qm. Ilnudx",
30 "G\u00F3bjh Zcgopqmjidw Dyhlu, ky. Npyamr",
31 "G\u00F3dxb Slfduvgdwfi Qhreu, ao. Adyfqx",
32 "G\u00F3ten Emrmbmttgne Rtpir, rx. Mgmpjy",
33 "G\u00F3kjo Hciqkymfcds Jpudo, ti. Ueceedbm (tkvyj vplrnpoq)",
34 "Przjrpnbhrflnoo Dbiccp Lnmikfhsuo\u00F3s Tgfhlpqoso / ZAD ENR",
35 "Bang Nbygmoyc Nd\u00F3nipcryjtzm",
36 "Citjk\u00EBd Qgmgvr Er. w u.x.",
37 "Dyrscywp Kvoifmyxo Ivv\u00F3r Lbyxtrwnzp",
38 "G\u00E9awk Ssqenl Pk. c r.g.",
39 "Nesdo\u00E9 Ilwbay Z.U.",
41 "Pocafu Tgbmpn - wwg zo Mpespnzdllqk",
45 "Poleeaw-Rqzghgnnj R.W.",
47 "Polixj Tyfc\u00F3vcga Gbkjxf\u00F3f Tuogcybbbkyd C.U.",
50 "Polrfdk K\u00F3nvyrfot Xuzbzzn f Ujmfwkdbnzh E.U. Wxkfiwss",
51 "Polxtcf Hfowus Zzobblfm N.I.",
58 "Prowwyq & Relnda Hxkvauksnn Znyord Tz. w t.o.",
62 "Propgi Lutgumnj X.W. BL",
64 "Progiyvzr Erejqk T.W.",
65 "Prooxwq-Ydglovgk J.J.",
66 "PTU Ntcw Lwkxjk S.M. UYF",
70 "PZU ioii A.T. Yqkknryu - bipdq badtg 500/9",
73 "Railoggeqd Aewy Fwlmsp K.S. Ybrqjgyr",
75 "Renafwp Sapnqr io v z.n.",
78 "Rocqz Mvwftutxozs VQ",
81 "Samgtzg Fkbulcjaaqv Ollllq Ad. l l.v.",
82 "Schelrlw Fu. t z.x.",
83 "Schemxgoc Axvufoeuh",
86 "Sobcwssf Oy. q o.s. Kwaxj",
87 "Sobpxpoc Fb. w q.h. Elftx",
88 "Soblqeqs Kpvppc RH - tbknhjubw siyaenc Njsjbpx Buyshpgyv",
90 "Stacyok Qurqjw Hw. f c.h.",
92 "Stopjhmq Prxhkakjmalkvdt Weqxejbyig Wgfplnvk D.C.",
93 "STRHAEI Clydqr Ha. d z.j.",
96 "Tchukm Rhwcpcvj Cc. v y.a.",
97 "Teco Nyxm Rsvzkx pm. J a.t.",
99 "Telruaet Nmyzaz Twwwuf",
100 "Tellrwihv Xvtjle N.U.",
101 "Telesjedc Boewsx A.F",
102 "tellqfwiqkv dinjlrnyit yktdhlqquihzxr (ohvso)",
103 "Tetft Kna Ab. j l.z.",
105 "Totqucvhcpm Gejxkgrz Is. e k.i.",
106 "Towajgixetj Ngaayjitwm fj csxm Mxebfj Sbocok X.H.",
107 "Toyfon Meesp Neeban Jdsjmrn sz v z.w.",
108 "TRAJQ NZHTA Li. n x.e. - Vghfmngh",
111 "TU ENZISOP ZFYIPF V.U.",
115 "Unibjqxv rdnbsn - ZJQNJ XCG / Wslqfrk",
116 "Unilcs - hopef ps 20 nixi",
117 "UPC Gwwmru Ds. g o.r.",
119 "Vatyqzcgqh Kjnnsy GQ WT",
121 "Vos Jviggogjt Iyqhlm Ih. w j.y. (fbshoihdnb)",
130 "Zakja Tziaboysenum Squlslpp - Diifw V.D.",
131 "Zakgat Meqivadj Nrpxlekmodx s Bbymjozge W.Y.",
132 "Zjetxpbkpgj Mmhhgohasjtpkjd Uwucubbpdj K.N.",
135 sort(temporaryData, collator);
136 threadTestData = temporaryData;
139 private static void scramble(String[] data, Random r) {
140 for (int i = 0; i < data.length; ++i) {
141 int ix = r.nextInt(data.length);
148 private static void sort(String[] data, Collator collator) {
149 Arrays.sort(data, collator);
152 private static boolean verifySort(String[] data) {
153 for (int i = 0; i < data.length; i++) {
154 if (!data[i].equals(threadTestData[i])) {
161 public void testThreads() {
162 final Collator theCollator = Collator.getInstance(new Locale("pl", "", ""));
163 final String[] theData = threadTestData;
164 final Random r = new Random();
170 synchronized void start() {
175 synchronized void stop() {
184 void fail(String msg) {
190 final Control control = new Control();
192 class Test implements Runnable {
193 private String[] data;
194 private Collator collator;
201 data = (String[]) theData.clone();
202 collator = (Collator) theCollator.clone();
203 } catch (CloneNotSupportedException e) {
204 // should not happen, if it does we'll get an exception right away
205 errln("could not clone");
213 synchronized (control) {
214 while (!control.go()) {
219 while (control.go()) {
220 scramble(this.data, r);
221 sort(this.data, this.collator);
222 if (!verifySort(this.data)) {
223 control.fail(name + ": incorrect sort");
226 } catch (InterruptedException e) {
228 } catch (IndexOutOfBoundsException e) {
229 control.fail(name + " " + e.getMessage());
234 Thread[] threads = new Thread[10];
235 for (int i = 0; i < threads.length; ++i) {
236 threads[i] = new Thread(new Test("test " + i));
243 long stopTime = System.currentTimeMillis() + 5000;
246 } while (control.go() && System.currentTimeMillis() < stopTime);
250 for (int i = 0; i < threads.length; ++i) {
253 } catch (InterruptedException e) {
257 if (control.fail != null) {
263 class FrozenCollatorTest implements Runnable {
264 private final String name;
265 private final Collator collator;
266 private final String[] data;
267 private final Random r;
269 public FrozenCollatorTest(String name, Collator collator, String[] data, Random r) {
271 this.collator = collator;
279 scramble(this.data, r);
280 sort(this.data, this.collator);
281 if (!verifySort(this.data)) {
282 errln("Error in frozen collation test: thread (" + this.name + ") incorrect sort");
284 } catch (Exception e) {
285 errln("Error in frozen collation test: thread (" + this.name + ") exception = " + e);
291 public void testFrozenThreads() throws Exception {
292 final Collator theCollator = Collator.getInstance(new Locale("pl", "", ""));
293 theCollator.freeze();
294 final Random r = new Random();
296 Thread[] threads = new Thread[10];
297 for (int i = 0; i < threads.length; ++i) {
298 threads[i] = new Thread(new FrozenCollatorTest("test " + i, theCollator, threadTestData.clone(), r));
301 for (int i = 0; i < threads.length; ++i) {
305 for (int i = 0; i < threads.length; ++i) {
306 threads[i].join(500);