1666ea1b28a76aeba74744148b15099254d918671Owen Linpackage com.android.camera.gallery;
2666ea1b28a76aeba74744148b15099254d918671Owen Lin
3666ea1b28a76aeba74744148b15099254d918671Owen Linimport android.test.AndroidTestCase;
4666ea1b28a76aeba74744148b15099254d918671Owen Linimport android.util.Log;
5666ea1b28a76aeba74744148b15099254d918671Owen Lin
6666ea1b28a76aeba74744148b15099254d918671Owen Linpublic class LruCacheUnitTests extends AndroidTestCase {
7666ea1b28a76aeba74744148b15099254d918671Owen Lin
8666ea1b28a76aeba74744148b15099254d918671Owen Lin    public void testPut() {
9666ea1b28a76aeba74744148b15099254d918671Owen Lin        LruCache<Integer, Integer> cache = new LruCache<Integer, Integer>(2);
10666ea1b28a76aeba74744148b15099254d918671Owen Lin        Integer key = Integer.valueOf(1);
11666ea1b28a76aeba74744148b15099254d918671Owen Lin        Integer value = Integer.valueOf(3);
12666ea1b28a76aeba74744148b15099254d918671Owen Lin        cache.put(key, value);
13666ea1b28a76aeba74744148b15099254d918671Owen Lin        assertEquals(value, cache.get(key));
14666ea1b28a76aeba74744148b15099254d918671Owen Lin    }
15666ea1b28a76aeba74744148b15099254d918671Owen Lin
16666ea1b28a76aeba74744148b15099254d918671Owen Lin    public void testTracingInUsedObject() {
17666ea1b28a76aeba74744148b15099254d918671Owen Lin        LruCache<Integer, Integer> cache = new LruCache<Integer, Integer>(2);
18666ea1b28a76aeba74744148b15099254d918671Owen Lin        Integer key = Integer.valueOf(1);
19666ea1b28a76aeba74744148b15099254d918671Owen Lin        Integer value = new Integer(3);
20666ea1b28a76aeba74744148b15099254d918671Owen Lin        cache.put(key, value);
21666ea1b28a76aeba74744148b15099254d918671Owen Lin        for (int i = 0; i < 3; ++i) {
22666ea1b28a76aeba74744148b15099254d918671Owen Lin            cache.put(i + 10, i * i);
23666ea1b28a76aeba74744148b15099254d918671Owen Lin        }
24666ea1b28a76aeba74744148b15099254d918671Owen Lin        System.gc();
25666ea1b28a76aeba74744148b15099254d918671Owen Lin        assertEquals(value, cache.get(key));
26666ea1b28a76aeba74744148b15099254d918671Owen Lin    }
27666ea1b28a76aeba74744148b15099254d918671Owen Lin
28666ea1b28a76aeba74744148b15099254d918671Owen Lin    public void testLruAlgorithm() {
29666ea1b28a76aeba74744148b15099254d918671Owen Lin        LruCache<Integer, Integer> cache = new LruCache<Integer, Integer>(2);
30666ea1b28a76aeba74744148b15099254d918671Owen Lin        cache.put(0, new Integer(0));
31666ea1b28a76aeba74744148b15099254d918671Owen Lin        for (int i = 0; i < 3; ++i) {
32666ea1b28a76aeba74744148b15099254d918671Owen Lin            cache.put(i + 1, i * i);
33666ea1b28a76aeba74744148b15099254d918671Owen Lin            cache.get(0);
34666ea1b28a76aeba74744148b15099254d918671Owen Lin        }
35666ea1b28a76aeba74744148b15099254d918671Owen Lin        System.gc();
36666ea1b28a76aeba74744148b15099254d918671Owen Lin        assertEquals(Integer.valueOf(0), cache.get(0));
37666ea1b28a76aeba74744148b15099254d918671Owen Lin    }
38666ea1b28a76aeba74744148b15099254d918671Owen Lin
39666ea1b28a76aeba74744148b15099254d918671Owen Lin    private static final int TEST_COUNT = 10000;
40666ea1b28a76aeba74744148b15099254d918671Owen Lin
41666ea1b28a76aeba74744148b15099254d918671Owen Lin    static class Accessor extends Thread {
42666ea1b28a76aeba74744148b15099254d918671Owen Lin        private final LruCache<Integer,Integer> mMap;
43666ea1b28a76aeba74744148b15099254d918671Owen Lin
44666ea1b28a76aeba74744148b15099254d918671Owen Lin        public Accessor(LruCache<Integer, Integer> map) {
45666ea1b28a76aeba74744148b15099254d918671Owen Lin            mMap = map;
46666ea1b28a76aeba74744148b15099254d918671Owen Lin        }
47666ea1b28a76aeba74744148b15099254d918671Owen Lin
48666ea1b28a76aeba74744148b15099254d918671Owen Lin        @Override
49666ea1b28a76aeba74744148b15099254d918671Owen Lin        public void run() {
50666ea1b28a76aeba74744148b15099254d918671Owen Lin            Log.v("TAG", "start get " + this);
51666ea1b28a76aeba74744148b15099254d918671Owen Lin            for (int i = 0; i < TEST_COUNT; ++i) {
52666ea1b28a76aeba74744148b15099254d918671Owen Lin                mMap.get(i % 2);
53666ea1b28a76aeba74744148b15099254d918671Owen Lin            }
54666ea1b28a76aeba74744148b15099254d918671Owen Lin            Log.v("TAG", "finish get " + this);
55666ea1b28a76aeba74744148b15099254d918671Owen Lin        }
56666ea1b28a76aeba74744148b15099254d918671Owen Lin    }
57666ea1b28a76aeba74744148b15099254d918671Owen Lin
58666ea1b28a76aeba74744148b15099254d918671Owen Lin    @SuppressWarnings("unchecked")
59666ea1b28a76aeba74744148b15099254d918671Owen Lin    public void testConcurrentAccess() throws Exception {
60666ea1b28a76aeba74744148b15099254d918671Owen Lin        LruCache<Integer, Integer> cache = new LruCache<Integer, Integer>(4);
61666ea1b28a76aeba74744148b15099254d918671Owen Lin        cache.put(0, 0);
62666ea1b28a76aeba74744148b15099254d918671Owen Lin        cache.put(1, 1);
63666ea1b28a76aeba74744148b15099254d918671Owen Lin        Accessor accessor[] = new Accessor[4];
64666ea1b28a76aeba74744148b15099254d918671Owen Lin        for (int i = 0; i < accessor.length; ++i) {
65666ea1b28a76aeba74744148b15099254d918671Owen Lin            accessor[i] = new Accessor(cache);
66666ea1b28a76aeba74744148b15099254d918671Owen Lin        }
67666ea1b28a76aeba74744148b15099254d918671Owen Lin        for (int i = 0; i < accessor.length; ++i) {
68666ea1b28a76aeba74744148b15099254d918671Owen Lin            accessor[i].start();
69666ea1b28a76aeba74744148b15099254d918671Owen Lin        }
70666ea1b28a76aeba74744148b15099254d918671Owen Lin        for (int i = 0; i < accessor.length; ++i) {
71666ea1b28a76aeba74744148b15099254d918671Owen Lin            accessor[i].join();
72666ea1b28a76aeba74744148b15099254d918671Owen Lin        }
73666ea1b28a76aeba74744148b15099254d918671Owen Lin    }
74666ea1b28a76aeba74744148b15099254d918671Owen Lin}
75