1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// Copyright 2007 The Android Open Source Project
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Exercise Object.wait(), comparing results against wall clock time.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Main {
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* delays, in milliseconds */
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final static long[] DELAYS = {
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        200, 500, 1000, 2000, 3500, 8000
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    };
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void main(String[] args) {
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean timing = (args.length >= 1) && args[0].equals("--timing");
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        doit(timing);
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void doit(boolean timing) {
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object sleepy = new Object();
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        long start, end;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        synchronized (sleepy) {
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sleepy.wait(-500);
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                System.out.println("HEY: didn't throw on negative arg");
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalArgumentException iae) {
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                System.out.println("Caught expected exception on neg arg");
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (InterruptedException ie) {
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ie.printStackTrace();
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for(long delay : DELAYS) {
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                System.out.println("Waiting for " + delay + "ms...");
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                start = System.currentTimeMillis();
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    sleepy.wait(delay);
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (InterruptedException ie) {
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    ie.printStackTrace();
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                end = System.currentTimeMillis();
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                long elapsed = end - start;
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                boolean showTime = timing;
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (! timing) {
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    long epsilon = delay / 10;
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (epsilon > 50) {
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        epsilon = 50;
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    long min = delay - epsilon;
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    long max = delay + epsilon;
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (elapsed < min) {
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        System.out.println("  Elapsed time was too short");
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        showTime = true;
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else if (elapsed > max) {
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        System.out.println("  Elapsed time was too long: "
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            + "elapsed=" + elapsed + " max=" + max);
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        showTime = true;
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (showTime) {
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    System.out.println("  Wall clock elapsed "
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            + elapsed + "ms");
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73