1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one or more
3  *  contributor license agreements.  See the NOTICE file distributed with
4  *  this work for additional information regarding copyright ownership.
5  *  The ASF licenses this file to You under the Apache License, Version 2.0
6  *  (the "License"); you may not use this file except in compliance with
7  *  the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */
17 package org.apache.harmony.tests.java.lang.ref;
18 
19 import java.lang.ref.Reference;
20 import java.lang.ref.ReferenceQueue;
21 import java.lang.ref.SoftReference;
22 import java.util.Vector;
23 import libcore.java.lang.ref.FinalizationTester;
24 
25 public class SoftReferenceTest extends junit.framework.TestCase {
26     static Boolean bool;
27     SoftReference r;
28 
doneSuite()29     protected void doneSuite() {
30         bool = null;
31     }
32 
33     /**
34      * java.lang.ref.SoftReference#SoftReference(java.lang.Object,
35      *        java.lang.ref.ReferenceQueue)
36      */
test_ConstructorLjava_lang_ObjectLjava_lang_ref_ReferenceQueue()37     public void test_ConstructorLjava_lang_ObjectLjava_lang_ref_ReferenceQueue() {
38         ReferenceQueue rq = new ReferenceQueue();
39         bool = new Boolean(true);
40         try {
41             SoftReference sr = new SoftReference(bool, rq);
42             assertTrue("Initialization failed.", ((Boolean) sr.get())
43                     .booleanValue());
44         } catch (Exception e) {
45             fail("Exception during test : " + e.getMessage());
46         }
47 
48         boolean exception = false;
49         try {
50             new SoftReference(bool, null);
51         } catch (NullPointerException e) {
52             exception = true;
53         }
54         assertTrue("Should not throw NullPointerException", !exception);
55     }
56 
57     /**
58      * java.lang.ref.SoftReference#SoftReference(java.lang.Object)
59      */
test_ConstructorLjava_lang_Object()60     public void test_ConstructorLjava_lang_Object() {
61         bool = new Boolean(true);
62         try {
63             SoftReference sr = new SoftReference(bool);
64             assertTrue("Initialization failed.", ((Boolean) sr.get())
65                     .booleanValue());
66         } catch (Exception e) {
67             fail("Exception during test : " + e.getMessage());
68         }
69     }
70 
71     /**
72      * java.lang.ref.SoftReference#get()
73      */
test_get()74     public void test_get() {
75         bool = new Boolean(false);
76         SoftReference sr = new SoftReference(bool);
77         assertTrue("Same object not returned.", bool == sr.get());
78     }
79 
80     // SideEffect: Causes OutOfMemoryError to test finalization
test_get_SoftReference()81     public void test_get_SoftReference() {
82 
83         class TestObject {
84             public boolean finalized;
85                 public TestObject() {
86                     finalized = false;
87                 }
88 
89                 protected void finalize() {
90                     finalized = true;
91                 }
92         }
93 
94         final ReferenceQueue rq = new ReferenceQueue();
95 
96         class TestThread extends Thread {
97             public void run() {
98                 Object testObj = new TestObject();
99                 r = new SoftReference(testObj, rq);
100             }
101         }
102         Reference ref;
103         try {
104             TestThread t = new TestThread();
105             t.start();
106             t.join();
107             Vector<StringBuffer> v = new Vector<StringBuffer>();
108             try {
109                 while(true) {
110                     v.add(new StringBuffer(10000));
111                 }
112             } catch(OutOfMemoryError ofme) {
113                 v = null;
114             }
115         } catch (InterruptedException e) {
116             fail("InterruptedException : " + e.getMessage());
117         }
118 
119         assertNull("get() should return null " +
120                 "if OutOfMemoryError is thrown.", r.get());
121 
122         try {
123             TestThread t = new TestThread();
124             t.start();
125             t.join();
126             FinalizationTester.induceFinalization();
127             ref = rq.poll();
128             assertNotNull("Object not garbage collected.", ref);
129             assertNull("Object is not null.", ref.get());
130             assertNotNull("Object could not be reclaimed.", r.get());
131         } catch (Exception e) {
132             fail("Exception : " + e.getMessage());
133         }
134     }
135 
setUp()136     protected void setUp() {
137     }
138 
tearDown()139     protected void tearDown() {
140     }
141 }
142