1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. 7 * 8 * This code is distributed in the hope that it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 11 * version 2 for more details (a copy is included in the LICENSE file that 12 * accompanied this code). 13 * 14 * You should have received a copy of the GNU General Public License version 15 * 2 along with this work; if not, write to the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 17 * 18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 19 * or visit www.oracle.com if you need additional information or have any 20 * questions. 21 */ 22 23 /* 24 * This file is available under and governed by the GNU General Public 25 * License version 2 only, as published by the Free Software Foundation. 26 * However, the following notice accompanied the original version of this 27 * file: 28 * 29 * Written by Doug Lea with assistance from members of JCP JSR-166 30 * Expert Group and released to the public domain, as explained at 31 * http://creativecommons.org/publicdomain/zero/1.0/ 32 * Other contributors include Andrew Wright, Jeffrey Hayes, 33 * Pat Fisher, Mike Judd. 34 */ 35 36 import static java.util.concurrent.TimeUnit.DAYS; 37 import static java.util.concurrent.TimeUnit.HOURS; 38 import static java.util.concurrent.TimeUnit.MICROSECONDS; 39 import static java.util.concurrent.TimeUnit.MILLISECONDS; 40 import static java.util.concurrent.TimeUnit.MINUTES; 41 import static java.util.concurrent.TimeUnit.NANOSECONDS; 42 import static java.util.concurrent.TimeUnit.SECONDS; 43 44 import java.util.concurrent.CountDownLatch; 45 import java.util.concurrent.TimeUnit; 46 47 import junit.framework.Test; 48 import junit.framework.TestSuite; 49 50 public class TimeUnitTest extends JSR166TestCase { 51 public static void main(String[] args) { 52 main(suite(), args); 53 } 54 55 public static Test suite() { 56 return new TestSuite(TimeUnitTest.class); 57 } 58 59 // (loops to 88888 check increments at all time divisions.) 60 61 /** 62 * convert correctly converts sample values across the units 63 */ 64 public void testConvert() { 65 for (long t = 0; t < 88888; ++t) { 66 assertEquals(t*60*60*24, 67 SECONDS.convert(t, DAYS)); 68 assertEquals(t*60*60, 69 SECONDS.convert(t, HOURS)); 70 assertEquals(t*60, 71 SECONDS.convert(t, MINUTES)); 72 assertEquals(t, 73 SECONDS.convert(t, SECONDS)); 74 assertEquals(t, 75 SECONDS.convert(1000L*t, MILLISECONDS)); 76 assertEquals(t, 77 SECONDS.convert(1000000L*t, MICROSECONDS)); 78 assertEquals(t, 79 SECONDS.convert(1000000000L*t, NANOSECONDS)); 80 81 assertEquals(1000L*t*60*60*24, 82 MILLISECONDS.convert(t, DAYS)); 83 assertEquals(1000L*t*60*60, 84 MILLISECONDS.convert(t, HOURS)); 85 assertEquals(1000L*t*60, 86 MILLISECONDS.convert(t, MINUTES)); 87 assertEquals(1000L*t, 88 MILLISECONDS.convert(t, SECONDS)); 89 assertEquals(t, 90 MILLISECONDS.convert(t, MILLISECONDS)); 91 assertEquals(t, 92 MILLISECONDS.convert(1000L*t, MICROSECONDS)); 93 assertEquals(t, 94 MILLISECONDS.convert(1000000L*t, NANOSECONDS)); 95 96 assertEquals(1000000L*t*60*60*24, 97 MICROSECONDS.convert(t, DAYS)); 98 assertEquals(1000000L*t*60*60, 99 MICROSECONDS.convert(t, HOURS)); 100 assertEquals(1000000L*t*60, 101 MICROSECONDS.convert(t, MINUTES)); 102 assertEquals(1000000L*t, 103 MICROSECONDS.convert(t, SECONDS)); 104 assertEquals(1000L*t, 105 MICROSECONDS.convert(t, MILLISECONDS)); 106 assertEquals(t, 107 MICROSECONDS.convert(t, MICROSECONDS)); 108 assertEquals(t, 109 MICROSECONDS.convert(1000L*t, NANOSECONDS)); 110 111 assertEquals(1000000000L*t*60*60*24, 112 NANOSECONDS.convert(t, DAYS)); 113 assertEquals(1000000000L*t*60*60, 114 NANOSECONDS.convert(t, HOURS)); 115 assertEquals(1000000000L*t*60, 116 NANOSECONDS.convert(t, MINUTES)); 117 assertEquals(1000000000L*t, 118 NANOSECONDS.convert(t, SECONDS)); 119 assertEquals(1000000L*t, 120 NANOSECONDS.convert(t, MILLISECONDS)); 121 assertEquals(1000L*t, 122 NANOSECONDS.convert(t, MICROSECONDS)); 123 assertEquals(t, 124 NANOSECONDS.convert(t, NANOSECONDS)); 125 } 126 127 for (TimeUnit x : TimeUnit.values()) { 128 long[] zs = { 129 0, 1, -1, 130 Integer.MAX_VALUE, Integer.MIN_VALUE, 131 Long.MAX_VALUE, Long.MIN_VALUE, 132 }; 133 for (long z : zs) assertEquals(z, x.convert(z, x)); 134 } 135 } 136 137 /** 138 * toNanos correctly converts sample values in different units to 139 * nanoseconds 140 */ 141 public void testToNanos() { 142 for (long t = 0; t < 88888; ++t) { 143 assertEquals(t*1000000000L*60*60*24, 144 DAYS.toNanos(t)); 145 assertEquals(t*1000000000L*60*60, 146 HOURS.toNanos(t)); 147 assertEquals(t*1000000000L*60, 148 MINUTES.toNanos(t)); 149 assertEquals(1000000000L*t, 150 SECONDS.toNanos(t)); 151 assertEquals(1000000L*t, 152 MILLISECONDS.toNanos(t)); 153 assertEquals(1000L*t, 154 MICROSECONDS.toNanos(t)); 155 assertEquals(t, 156 NANOSECONDS.toNanos(t)); 157 } 158 } 159 160 /** 161 * toMicros correctly converts sample values in different units to 162 * microseconds 163 */ 164 public void testToMicros() { 165 for (long t = 0; t < 88888; ++t) { 166 assertEquals(t*1000000L*60*60*24, 167 DAYS.toMicros(t)); 168 assertEquals(t*1000000L*60*60, 169 HOURS.toMicros(t)); 170 assertEquals(t*1000000L*60, 171 MINUTES.toMicros(t)); 172 assertEquals(1000000L*t, 173 SECONDS.toMicros(t)); 174 assertEquals(1000L*t, 175 MILLISECONDS.toMicros(t)); 176 assertEquals(t, 177 MICROSECONDS.toMicros(t)); 178 assertEquals(t, 179 NANOSECONDS.toMicros(t*1000L)); 180 } 181 } 182 183 /** 184 * toMillis correctly converts sample values in different units to 185 * milliseconds 186 */ 187 public void testToMillis() { 188 for (long t = 0; t < 88888; ++t) { 189 assertEquals(t*1000L*60*60*24, 190 DAYS.toMillis(t)); 191 assertEquals(t*1000L*60*60, 192 HOURS.toMillis(t)); 193 assertEquals(t*1000L*60, 194 MINUTES.toMillis(t)); 195 assertEquals(1000L*t, 196 SECONDS.toMillis(t)); 197 assertEquals(t, 198 MILLISECONDS.toMillis(t)); 199 assertEquals(t, 200 MICROSECONDS.toMillis(t*1000L)); 201 assertEquals(t, 202 NANOSECONDS.toMillis(t*1000000L)); 203 } 204 } 205 206 /** 207 * toSeconds correctly converts sample values in different units to 208 * seconds 209 */ 210 public void testToSeconds() { 211 for (long t = 0; t < 88888; ++t) { 212 assertEquals(t*60*60*24, 213 DAYS.toSeconds(t)); 214 assertEquals(t*60*60, 215 HOURS.toSeconds(t)); 216 assertEquals(t*60, 217 MINUTES.toSeconds(t)); 218 assertEquals(t, 219 SECONDS.toSeconds(t)); 220 assertEquals(t, 221 MILLISECONDS.toSeconds(t*1000L)); 222 assertEquals(t, 223 MICROSECONDS.toSeconds(t*1000000L)); 224 assertEquals(t, 225 NANOSECONDS.toSeconds(t*1000000000L)); 226 } 227 } 228 229 /** 230 * toMinutes correctly converts sample values in different units to 231 * minutes 232 */ 233 public void testToMinutes() { 234 for (long t = 0; t < 88888; ++t) { 235 assertEquals(t*60*24, 236 DAYS.toMinutes(t)); 237 assertEquals(t*60, 238 HOURS.toMinutes(t)); 239 assertEquals(t, 240 MINUTES.toMinutes(t)); 241 assertEquals(t, 242 SECONDS.toMinutes(t*60)); 243 assertEquals(t, 244 MILLISECONDS.toMinutes(t*1000L*60)); 245 assertEquals(t, 246 MICROSECONDS.toMinutes(t*1000000L*60)); 247 assertEquals(t, 248 NANOSECONDS.toMinutes(t*1000000000L*60)); 249 } 250 } 251 252 /** 253 * toHours correctly converts sample values in different units to 254 * hours 255 */ 256 public void testToHours() { 257 for (long t = 0; t < 88888; ++t) { 258 assertEquals(t*24, 259 DAYS.toHours(t)); 260 assertEquals(t, 261 HOURS.toHours(t)); 262 assertEquals(t, 263 MINUTES.toHours(t*60)); 264 assertEquals(t, 265 SECONDS.toHours(t*60*60)); 266 assertEquals(t, 267 MILLISECONDS.toHours(t*1000L*60*60)); 268 assertEquals(t, 269 MICROSECONDS.toHours(t*1000000L*60*60)); 270 assertEquals(t, 271 NANOSECONDS.toHours(t*1000000000L*60*60)); 272 } 273 } 274 275 /** 276 * toDays correctly converts sample values in different units to 277 * days 278 */ 279 public void testToDays() { 280 for (long t = 0; t < 88888; ++t) { 281 assertEquals(t, 282 DAYS.toDays(t)); 283 assertEquals(t, 284 HOURS.toDays(t*24)); 285 assertEquals(t, 286 MINUTES.toDays(t*60*24)); 287 assertEquals(t, 288 SECONDS.toDays(t*60*60*24)); 289 assertEquals(t, 290 MILLISECONDS.toDays(t*1000L*60*60*24)); 291 assertEquals(t, 292 MICROSECONDS.toDays(t*1000000L*60*60*24)); 293 assertEquals(t, 294 NANOSECONDS.toDays(t*1000000000L*60*60*24)); 295 } 296 } 297 298 /** 299 * convert saturates positive too-large values to Long.MAX_VALUE 300 * and negative to LONG.MIN_VALUE 301 */ 302 public void testConvertSaturate() { 303 assertEquals(Long.MAX_VALUE, 304 NANOSECONDS.convert(Long.MAX_VALUE / 2, SECONDS)); 305 assertEquals(Long.MIN_VALUE, 306 NANOSECONDS.convert(-Long.MAX_VALUE / 4, SECONDS)); 307 assertEquals(Long.MAX_VALUE, 308 NANOSECONDS.convert(Long.MAX_VALUE / 2, MINUTES)); 309 assertEquals(Long.MIN_VALUE, 310 NANOSECONDS.convert(-Long.MAX_VALUE / 4, MINUTES)); 311 assertEquals(Long.MAX_VALUE, 312 NANOSECONDS.convert(Long.MAX_VALUE / 2, HOURS)); 313 assertEquals(Long.MIN_VALUE, 314 NANOSECONDS.convert(-Long.MAX_VALUE / 4, HOURS)); 315 assertEquals(Long.MAX_VALUE, 316 NANOSECONDS.convert(Long.MAX_VALUE / 2, DAYS)); 317 assertEquals(Long.MIN_VALUE, 318 NANOSECONDS.convert(-Long.MAX_VALUE / 4, DAYS)); 319 320 for (TimeUnit x : TimeUnit.values()) 321 for (TimeUnit y : TimeUnit.values()) { 322 long ratio = x.toNanos(1) / y.toNanos(1); 323 if (ratio >= 1) { 324 assertEquals(ratio, y.convert(1, x)); 325 assertEquals(1, x.convert(ratio, y)); 326 long max = Long.MAX_VALUE/ratio; 327 assertEquals(max * ratio, y.convert(max, x)); 328 assertEquals(-max * ratio, y.convert(-max, x)); 329 assertEquals(max, x.convert(max * ratio, y)); 330 assertEquals(-max, x.convert(-max * ratio, y)); 331 if (max < Long.MAX_VALUE) { 332 assertEquals(Long.MAX_VALUE, y.convert(max + 1, x)); 333 assertEquals(Long.MIN_VALUE, y.convert(-max - 1, x)); 334 assertEquals(Long.MIN_VALUE, y.convert(Long.MIN_VALUE + 1, x)); 335 } 336 assertEquals(Long.MAX_VALUE, y.convert(Long.MAX_VALUE, x)); 337 assertEquals(Long.MIN_VALUE, y.convert(Long.MIN_VALUE, x)); 338 } 339 } 340 } 341 342 /** 343 * toNanos saturates positive too-large values to Long.MAX_VALUE 344 * and negative to LONG.MIN_VALUE 345 */ 346 public void testToNanosSaturate() { 347 assertEquals(Long.MAX_VALUE, 348 MILLISECONDS.toNanos(Long.MAX_VALUE / 2)); 349 assertEquals(Long.MIN_VALUE, 350 MILLISECONDS.toNanos(-Long.MAX_VALUE / 3)); 351 352 for (TimeUnit x : TimeUnit.values()) { 353 long ratio = x.toNanos(1) / NANOSECONDS.toNanos(1); 354 if (ratio >= 1) { 355 long max = Long.MAX_VALUE/ratio; 356 for (long z : new long[] {0, 1, -1, max, -max}) 357 assertEquals(z * ratio, x.toNanos(z)); 358 if (max < Long.MAX_VALUE) { 359 assertEquals(Long.MAX_VALUE, x.toNanos(max + 1)); 360 assertEquals(Long.MIN_VALUE, x.toNanos(-max - 1)); 361 assertEquals(Long.MIN_VALUE, x.toNanos(Long.MIN_VALUE + 1)); 362 } 363 assertEquals(Long.MAX_VALUE, x.toNanos(Long.MAX_VALUE)); 364 assertEquals(Long.MIN_VALUE, x.toNanos(Long.MIN_VALUE)); 365 if (max < Integer.MAX_VALUE) { 366 assertEquals(Long.MAX_VALUE, x.toNanos(Integer.MAX_VALUE)); 367 assertEquals(Long.MIN_VALUE, x.toNanos(Integer.MIN_VALUE)); 368 } 369 } 370 } 371 } 372 373 /** 374 * toMicros saturates positive too-large values to Long.MAX_VALUE 375 * and negative to LONG.MIN_VALUE 376 */ 377 public void testToMicrosSaturate() { 378 for (TimeUnit x : TimeUnit.values()) { 379 long ratio = x.toNanos(1) / MICROSECONDS.toNanos(1); 380 if (ratio >= 1) { 381 long max = Long.MAX_VALUE/ratio; 382 for (long z : new long[] {0, 1, -1, max, -max}) 383 assertEquals(z * ratio, x.toMicros(z)); 384 if (max < Long.MAX_VALUE) { 385 assertEquals(Long.MAX_VALUE, x.toMicros(max + 1)); 386 assertEquals(Long.MIN_VALUE, x.toMicros(-max - 1)); 387 assertEquals(Long.MIN_VALUE, x.toMicros(Long.MIN_VALUE + 1)); 388 } 389 assertEquals(Long.MAX_VALUE, x.toMicros(Long.MAX_VALUE)); 390 assertEquals(Long.MIN_VALUE, x.toMicros(Long.MIN_VALUE)); 391 if (max < Integer.MAX_VALUE) { 392 assertEquals(Long.MAX_VALUE, x.toMicros(Integer.MAX_VALUE)); 393 assertEquals(Long.MIN_VALUE, x.toMicros(Integer.MIN_VALUE)); 394 } 395 } 396 } 397 } 398 399 /** 400 * toMillis saturates positive too-large values to Long.MAX_VALUE 401 * and negative to LONG.MIN_VALUE 402 */ 403 public void testToMillisSaturate() { 404 for (TimeUnit x : TimeUnit.values()) { 405 long ratio = x.toNanos(1) / MILLISECONDS.toNanos(1); 406 if (ratio >= 1) { 407 long max = Long.MAX_VALUE/ratio; 408 for (long z : new long[] {0, 1, -1, max, -max}) 409 assertEquals(z * ratio, x.toMillis(z)); 410 if (max < Long.MAX_VALUE) { 411 assertEquals(Long.MAX_VALUE, x.toMillis(max + 1)); 412 assertEquals(Long.MIN_VALUE, x.toMillis(-max - 1)); 413 assertEquals(Long.MIN_VALUE, x.toMillis(Long.MIN_VALUE + 1)); 414 } 415 assertEquals(Long.MAX_VALUE, x.toMillis(Long.MAX_VALUE)); 416 assertEquals(Long.MIN_VALUE, x.toMillis(Long.MIN_VALUE)); 417 if (max < Integer.MAX_VALUE) { 418 assertEquals(Long.MAX_VALUE, x.toMillis(Integer.MAX_VALUE)); 419 assertEquals(Long.MIN_VALUE, x.toMillis(Integer.MIN_VALUE)); 420 } 421 } 422 } 423 } 424 425 /** 426 * toSeconds saturates positive too-large values to Long.MAX_VALUE 427 * and negative to LONG.MIN_VALUE 428 */ 429 public void testToSecondsSaturate() { 430 for (TimeUnit x : TimeUnit.values()) { 431 long ratio = x.toNanos(1) / SECONDS.toNanos(1); 432 if (ratio >= 1) { 433 long max = Long.MAX_VALUE/ratio; 434 for (long z : new long[] {0, 1, -1, max, -max}) 435 assertEquals(z * ratio, x.toSeconds(z)); 436 if (max < Long.MAX_VALUE) { 437 assertEquals(Long.MAX_VALUE, x.toSeconds(max + 1)); 438 assertEquals(Long.MIN_VALUE, x.toSeconds(-max - 1)); 439 assertEquals(Long.MIN_VALUE, x.toSeconds(Long.MIN_VALUE + 1)); 440 } 441 assertEquals(Long.MAX_VALUE, x.toSeconds(Long.MAX_VALUE)); 442 assertEquals(Long.MIN_VALUE, x.toSeconds(Long.MIN_VALUE)); 443 if (max < Integer.MAX_VALUE) { 444 assertEquals(Long.MAX_VALUE, x.toSeconds(Integer.MAX_VALUE)); 445 assertEquals(Long.MIN_VALUE, x.toSeconds(Integer.MIN_VALUE)); 446 } 447 } 448 } 449 } 450 451 /** 452 * toMinutes saturates positive too-large values to Long.MAX_VALUE 453 * and negative to LONG.MIN_VALUE 454 */ 455 public void testToMinutesSaturate() { 456 for (TimeUnit x : TimeUnit.values()) { 457 long ratio = x.toNanos(1) / MINUTES.toNanos(1); 458 if (ratio > 1) { 459 long max = Long.MAX_VALUE/ratio; 460 for (long z : new long[] {0, 1, -1, max, -max}) 461 assertEquals(z * ratio, x.toMinutes(z)); 462 assertEquals(Long.MAX_VALUE, x.toMinutes(max + 1)); 463 assertEquals(Long.MIN_VALUE, x.toMinutes(-max - 1)); 464 assertEquals(Long.MAX_VALUE, x.toMinutes(Long.MAX_VALUE)); 465 assertEquals(Long.MIN_VALUE, x.toMinutes(Long.MIN_VALUE)); 466 assertEquals(Long.MIN_VALUE, x.toMinutes(Long.MIN_VALUE + 1)); 467 } 468 } 469 } 470 471 /** 472 * toHours saturates positive too-large values to Long.MAX_VALUE 473 * and negative to LONG.MIN_VALUE 474 */ 475 public void testToHoursSaturate() { 476 for (TimeUnit x : TimeUnit.values()) { 477 long ratio = x.toNanos(1) / HOURS.toNanos(1); 478 if (ratio >= 1) { 479 long max = Long.MAX_VALUE/ratio; 480 for (long z : new long[] {0, 1, -1, max, -max}) 481 assertEquals(z * ratio, x.toHours(z)); 482 if (max < Long.MAX_VALUE) { 483 assertEquals(Long.MAX_VALUE, x.toHours(max + 1)); 484 assertEquals(Long.MIN_VALUE, x.toHours(-max - 1)); 485 assertEquals(Long.MIN_VALUE, x.toHours(Long.MIN_VALUE + 1)); 486 } 487 assertEquals(Long.MAX_VALUE, x.toHours(Long.MAX_VALUE)); 488 assertEquals(Long.MIN_VALUE, x.toHours(Long.MIN_VALUE)); 489 } 490 } 491 } 492 493 /** 494 * toString returns name of unit 495 */ 496 public void testToString() { 497 assertEquals("SECONDS", SECONDS.toString()); 498 } 499 500 /** 501 * name returns name of unit 502 */ 503 public void testName() { 504 assertEquals("SECONDS", SECONDS.name()); 505 } 506 507 /** 508 * Timed wait without holding lock throws 509 * IllegalMonitorStateException 510 */ 511 public void testTimedWait_IllegalMonitorException() { 512 Thread t = newStartedThread(new CheckedRunnable() { 513 public void realRun() throws InterruptedException { 514 Object o = new Object(); 515 TimeUnit tu = MILLISECONDS; 516 517 try { 518 tu.timedWait(o, LONG_DELAY_MS); 519 threadShouldThrow(); 520 } catch (IllegalMonitorStateException success) {} 521 }}); 522 523 awaitTermination(t); 524 } 525 526 /** 527 * timedWait throws InterruptedException when interrupted 528 */ 529 public void testTimedWait_Interruptible() { 530 final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 531 Thread t = newStartedThread(new CheckedRunnable() { 532 public void realRun() throws InterruptedException { 533 Object o = new Object(); 534 TimeUnit tu = MILLISECONDS; 535 536 Thread.currentThread().interrupt(); 537 try { 538 synchronized (o) { 539 tu.timedWait(o, LONG_DELAY_MS); 540 } 541 shouldThrow(); 542 } catch (InterruptedException success) {} 543 assertFalse(Thread.interrupted()); 544 545 pleaseInterrupt.countDown(); 546 try { 547 synchronized (o) { 548 tu.timedWait(o, LONG_DELAY_MS); 549 } 550 shouldThrow(); 551 } catch (InterruptedException success) {} 552 assertFalse(Thread.interrupted()); 553 }}); 554 555 await(pleaseInterrupt); 556 assertThreadBlocks(t, Thread.State.TIMED_WAITING); 557 t.interrupt(); 558 awaitTermination(t); 559 } 560 561 /** 562 * timedJoin throws InterruptedException when interrupted 563 */ 564 public void testTimedJoin_Interruptible() { 565 final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 566 final Thread s = newStartedThread(new CheckedInterruptedRunnable() { 567 public void realRun() throws InterruptedException { 568 Thread.sleep(LONG_DELAY_MS); 569 }}); 570 final Thread t = newStartedThread(new CheckedRunnable() { 571 public void realRun() throws InterruptedException { 572 TimeUnit tu = MILLISECONDS; 573 Thread.currentThread().interrupt(); 574 try { 575 tu.timedJoin(s, LONG_DELAY_MS); 576 shouldThrow(); 577 } catch (InterruptedException success) {} 578 assertFalse(Thread.interrupted()); 579 580 pleaseInterrupt.countDown(); 581 try { 582 tu.timedJoin(s, LONG_DELAY_MS); 583 shouldThrow(); 584 } catch (InterruptedException success) {} 585 assertFalse(Thread.interrupted()); 586 }}); 587 588 await(pleaseInterrupt); 589 assertThreadBlocks(t, Thread.State.TIMED_WAITING); 590 t.interrupt(); 591 awaitTermination(t); 592 s.interrupt(); 593 awaitTermination(s); 594 } 595 596 /** 597 * timedSleep throws InterruptedException when interrupted 598 */ 599 public void testTimedSleep_Interruptible() { 600 final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 601 Thread t = newStartedThread(new CheckedRunnable() { 602 public void realRun() throws InterruptedException { 603 TimeUnit tu = MILLISECONDS; 604 Thread.currentThread().interrupt(); 605 try { 606 tu.sleep(LONG_DELAY_MS); 607 shouldThrow(); 608 } catch (InterruptedException success) {} 609 assertFalse(Thread.interrupted()); 610 611 pleaseInterrupt.countDown(); 612 try { 613 tu.sleep(LONG_DELAY_MS); 614 shouldThrow(); 615 } catch (InterruptedException success) {} 616 assertFalse(Thread.interrupted()); 617 }}); 618 619 await(pleaseInterrupt); 620 assertThreadBlocks(t, Thread.State.TIMED_WAITING); 621 t.interrupt(); 622 awaitTermination(t); 623 } 624 625 /** 626 * a deserialized/reserialized unit is the same instance 627 */ 628 public void testSerialization() throws Exception { 629 for (TimeUnit x : TimeUnit.values()) 630 assertSame(x, serialClone(x)); 631 } 632 633 }