1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package dot.junit.opcodes.iput_object;
18 
19 import dot.junit.DxTestCase;
20 import dot.junit.DxUtil;
21 import dot.junit.opcodes.iput_object.d.T_iput_object_1;
22 import dot.junit.opcodes.iput_object.d.T_iput_object_10;
23 import dot.junit.opcodes.iput_object.d.T_iput_object_11;
24 import dot.junit.opcodes.iput_object.d.T_iput_object_12;
25 import dot.junit.opcodes.iput_object.d.T_iput_object_13;
26 import dot.junit.opcodes.iput_object.d.T_iput_object_14;
27 import dot.junit.opcodes.iput_object.d.T_iput_object_15;
28 import dot.junit.opcodes.iput_object.d.T_iput_object_17;
29 import dot.junit.opcodes.iput_object.d.T_iput_object_7;
30 import dot.junit.opcodes.iput_object.d.T_iput_object_8;
31 import dot.junit.opcodes.iput_object.d.T_iput_object_9;
32 
33 public class Test_iput_object extends DxTestCase {
34     /**
35      * @title put reference into field
36      */
testN1()37     public void testN1() {
38         T_iput_object_1 t = new T_iput_object_1();
39         assertEquals(null, t.st_i1);
40         t.run();
41         assertEquals(t, t.st_i1);
42     }
43 
44 
45     /**
46      * @title modification of final field
47      */
testN2()48     public void testN2() {
49         T_iput_object_12 t = new T_iput_object_12();
50         assertEquals(null, t.st_i1);
51         t.run();
52         assertEquals(t, t.st_i1);
53     }
54 
55     /**
56      * @title modification of protected field from subclass
57      */
testN4()58     public void testN4() {
59         //@uses dot.junit.opcodes.iput_object.d.T_iput_object_1
60         //@uses dot.junit.opcodes.iput_object.d.T_iput_object_14
61         T_iput_object_14 t = new T_iput_object_14();
62         assertEquals(null, t.getProtectedField());
63         t.run();
64         assertEquals(t, t.getProtectedField());
65     }
66 
67     /**
68      * @title expected NullPointerException
69      */
testE2()70     public void testE2() {
71         loadAndRun("dot.junit.opcodes.iput_object.d.T_iput_object_13", NullPointerException.class);
72     }
73 
74 
75     /**
76      * @constraint A11
77      * @title constant pool index
78      */
testVFE1()79     public void testVFE1() {
80         load("dot.junit.opcodes.iput_object.d.T_iput_object_3", VerifyError.class);
81     }
82 
83     /**
84      *
85      * @constraint A23
86      * @title number of registers
87      */
testVFE2()88     public void testVFE2() {
89         load("dot.junit.opcodes.iput_object.d.T_iput_object_4", VerifyError.class);
90     }
91 
92 
93     /**
94      *
95      * @constraint B14
96      * @title put object into long field - only field with same name but
97      * different type exists
98      */
testVFE5()99     public void testVFE5() {
100         loadAndRun("dot.junit.opcodes.iput_object.d.T_iput_object_17", NoSuchFieldError.class);
101     }
102 
103 
104     /**
105      *
106      * @constraint B14
107      * @title type of field doesn't match opcode - attempt to modify double
108      * field with single-width register
109      */
testVFE7()110     public void testVFE7() {
111         load("dot.junit.opcodes.iput_object.d.T_iput_object_18", VerifyError.class);
112     }
113 
114     /**
115      *
116      * @constraint A11
117      * @title Attempt to set non-static field.
118      */
testVFE8()119     public void testVFE8() {
120         loadAndRun("dot.junit.opcodes.iput_object.d.T_iput_object_7",
121                    IncompatibleClassChangeError.class);
122     }
123 
124     /**
125      * @constraint B12
126      * @title Attempt to modify inaccessible protected field.
127      */
testVFE9()128     public void testVFE9() {
129         //@uses dot.junit.opcodes.iput_object.TestStubs
130         loadAndRun("dot.junit.opcodes.iput_object.d.T_iput_object_8", IllegalAccessError.class);
131     }
132 
133     /**
134      * @constraint n/a
135      * @title Attempt to modify field of undefined class.
136      */
testVFE10()137     public void testVFE10() {
138         loadAndRun("dot.junit.opcodes.iput_object.d.T_iput_object_9", NoClassDefFoundError.class);
139     }
140 
141     /**
142      * @constraint n/a
143      * @title Attempt to modify undefined field.
144      */
testVFE11()145     public void testVFE11() {
146         loadAndRun("dot.junit.opcodes.iput_object.d.T_iput_object_10", NoSuchFieldError.class);
147     }
148 
149 
150 
151     /**
152      * @constraint n/a
153      * @title Attempt to modify superclass' private field from subclass.
154      */
testVFE12()155     public void testVFE12() {
156         //@uses dot.junit.opcodes.iput_object.d.T_iput_object_1
157         loadAndRun("dot.junit.opcodes.iput_object.d.T_iput_object_15", IllegalAccessError.class);
158     }
159 
160 
161     /**
162      * @constraint B1
163      * @title iput-object shall not work for wide numbers
164      */
testVFE13()165     public void testVFE13() {
166         load("dot.junit.opcodes.iput_object.d.T_iput_object_2", VerifyError.class);
167     }
168 
169     /**
170      *
171      * @constraint B13
172      * @title assignment incompatible references
173      */
testVFE14()174     public void testVFE14() {
175         load("dot.junit.opcodes.iput_object.d.T_iput_object_20", VerifyError.class);
176     }
177 
178     /**
179      *
180      * @constraint B1
181      * @title iput-object shall not work for char fields
182      */
testVFE15()183     public void testVFE15() {
184         load("dot.junit.opcodes.iput_object.d.T_iput_object_21", VerifyError.class);
185     }
186 
187     /**
188      *
189      * @constraint B1
190      * @title iput-object shall not work for int fields
191      */
testVFE16()192     public void testVFE16() {
193         load("dot.junit.opcodes.iput_object.d.T_iput_object_22", VerifyError.class);
194     }
195 
196     /**
197      *
198      * @constraint B1
199      * @title iput-object shall not work for byte fields
200      */
testVFE17()201     public void testVFE17() {
202         load("dot.junit.opcodes.iput_object.d.T_iput_object_23", VerifyError.class);
203     }
204 
205     /**
206      *
207      * @constraint B1
208      * @title iput-object shall not work for boolean fields
209      */
testVFE18()210     public void testVFE18() {
211         load("dot.junit.opcodes.iput_object.d.T_iput_object_24", VerifyError.class);
212     }
213 
214     /**
215      *
216      * @constraint B1
217      * @title iput-object shall not work for short fields
218      */
testVFE6()219     public void testVFE6() {
220         load("dot.junit.opcodes.iput_object.d.T_iput_object_6", VerifyError.class);
221     }
222 
223     /**
224      * @constraint B6
225      * @title instance fields may only be accessed on already initialized instances.
226      */
testVFE30()227     public void testVFE30() {
228         load("dot.junit.opcodes.iput_object.d.T_iput_object_30", VerifyError.class);
229     }
230 
231     /**
232      * @constraint N/A
233      * @title instance fields may only be accessed on reference registers.
234      */
testVFE31()235     public void testVFE31() {
236         load("dot.junit.opcodes.iput_object.d.T_iput_object_31", VerifyError.class);
237     }
238 
239     /**
240      * @constraint n/a
241      * @title Modification of final field in other class
242      */
testVFE19()243     public void testVFE19() {
244         //@uses dot.junit.opcodes.iput_object.TestStubs
245         loadAndRun("dot.junit.opcodes.iput_object.d.T_iput_object_11", IllegalAccessError.class);
246     }
247 }
248 
249