Initial import
[jpf-core.git] / src / tests / gov / nasa / jpf / test / mc / threads / ClinitTest.java
1 /*
2  * Copyright (C) 2014, United States Government, as represented by the
3  * Administrator of the National Aeronautics and Space Administration.
4  * All rights reserved.
5  *
6  * The Java Pathfinder core (jpf-core) platform is licensed under the
7  * Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  * 
10  *        http://www.apache.org/licenses/LICENSE-2.0. 
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and 
16  * limitations under the License.
17  */
18 package gov.nasa.jpf.test.mc.threads;
19
20 import org.junit.Test;
21
22 import gov.nasa.jpf.util.test.TestJPF;
23 import gov.nasa.jpf.vm.Verify;
24
25 /**
26  * regression test for concurrent clinit execution
27  */
28 public class ClinitTest extends TestJPF {
29
30   static class X {
31     static int x;
32
33     static {
34       Verify.threadPrintln("initializing X");
35       assertTrue(x == 0);
36       x++;
37     }
38   }
39
40   @Test
41   public void testNoConcurrentClinit() {
42     if (verifyNoPropertyViolation()) {
43
44       Runnable r = new Runnable() {
45         @Override
46         public void run() {
47           int x = X.x;
48         }
49       };
50       Thread t = new Thread(r);
51       t.start();
52
53       int x = X.x;
54       assertTrue("x = " + x, x == 1);
55     }
56   }
57
58
59   static class Y {
60     static long y;
61
62     static {
63       Thread t = Thread.currentThread();
64       Verify.threadPrintln("initializing Y");
65       y = t.getId();
66     }
67   }
68
69   @Test
70   public void testClinitChoices() {
71     if (verifyAssertionErrorDetails("gotcha")) {
72       Runnable r = new Runnable() {
73         @Override
74         public void run() {
75           long y = Y.y;
76         }
77       };
78       Thread t = new Thread(r);
79       t.start();
80
81       long y = Y.y;
82       Thread tCur = Thread.currentThread();
83       Verify.threadPrintln("testing Y.y");
84       assertTrue("gotcha", y == tCur.getId());
85     }
86   }
87 }