summaryrefslogtreecommitdiffstats
path: root/jsr166-tests/src/test/java/jsr166/ThreadLocalTest.java
diff options
context:
space:
mode:
authorCalin Juravle <calin@google.com>2013-08-01 17:26:00 +0100
committerCalin Juravle <calin@google.com>2013-08-14 19:15:59 +0100
commit8f0d92bba199d906c70a5e40d7f3516c1a424117 (patch)
tree3762e8e4275ac7535ce011915fb0e0f7a343deea /jsr166-tests/src/test/java/jsr166/ThreadLocalTest.java
parent75a06e56a4cc4599946e21422513e4bafa759509 (diff)
downloadlibcore-8f0d92bba199d906c70a5e40d7f3516c1a424117.zip
libcore-8f0d92bba199d906c70a5e40d7f3516c1a424117.tar.gz
libcore-8f0d92bba199d906c70a5e40d7f3516c1a424117.tar.bz2
Added jsr166 tck tests as part of the libcore testsuite.
Change-Id: I6094d734f818fa043f2b277cf2b4ec7fec68e26e
Diffstat (limited to 'jsr166-tests/src/test/java/jsr166/ThreadLocalTest.java')
-rw-r--r--jsr166-tests/src/test/java/jsr166/ThreadLocalTest.java96
1 files changed, 96 insertions, 0 deletions
diff --git a/jsr166-tests/src/test/java/jsr166/ThreadLocalTest.java b/jsr166-tests/src/test/java/jsr166/ThreadLocalTest.java
new file mode 100644
index 0000000..885c2b2
--- /dev/null
+++ b/jsr166-tests/src/test/java/jsr166/ThreadLocalTest.java
@@ -0,0 +1,96 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ * Other contributors include Andrew Wright, Jeffrey Hayes,
+ * Pat Fisher, Mike Judd.
+ */
+
+package jsr166;
+
+import junit.framework.*;
+import java.util.concurrent.Semaphore;
+
+public class ThreadLocalTest extends JSR166TestCase {
+
+ static ThreadLocal<Integer> tl = new ThreadLocal<Integer>() {
+ public Integer initialValue() {
+ return one;
+ }
+ };
+
+ static InheritableThreadLocal<Integer> itl =
+ new InheritableThreadLocal<Integer>() {
+ protected Integer initialValue() {
+ return zero;
+ }
+
+ protected Integer childValue(Integer parentValue) {
+ return new Integer(parentValue.intValue() + 1);
+ }
+ };
+
+ /**
+ * remove causes next access to return initial value
+ */
+ public void testRemove() {
+ assertSame(tl.get(), one);
+ tl.set(two);
+ assertSame(tl.get(), two);
+ tl.remove();
+ assertSame(tl.get(), one);
+ }
+
+ /**
+ * remove in InheritableThreadLocal causes next access to return
+ * initial value
+ */
+ public void testRemoveITL() {
+ assertSame(itl.get(), zero);
+ itl.set(two);
+ assertSame(itl.get(), two);
+ itl.remove();
+ assertSame(itl.get(), zero);
+ }
+
+ private class ITLThread extends Thread {
+ final int[] x;
+ ITLThread(int[] array) { x = array; }
+ public void run() {
+ Thread child = null;
+ if (itl.get().intValue() < x.length - 1) {
+ child = new ITLThread(x);
+ child.start();
+ }
+ Thread.yield();
+
+ int threadId = itl.get().intValue();
+ for (int j = 0; j < threadId; j++) {
+ x[threadId]++;
+ Thread.yield();
+ }
+
+ if (child != null) { // Wait for child (if any)
+ try {
+ child.join();
+ } catch (InterruptedException e) {
+ threadUnexpectedException(e);
+ }
+ }
+ }
+ }
+
+ /**
+ * InheritableThreadLocal propagates generic values.
+ */
+ public void testGenericITL() throws InterruptedException {
+ final int threadCount = 10;
+ final int x[] = new int[threadCount];
+ Thread progenitor = new ITLThread(x);
+ progenitor.start();
+ progenitor.join();
+ for (int i = 0; i < threadCount; i++) {
+ assertEquals(i, x[i]);
+ }
+ }
+}