From 0acb1519416832abbd7f83187c9260e99f6d57be Mon Sep 17 00:00:00 2001 From: Inderjeet Singh Date: Mon, 20 Oct 2008 19:48:38 +0000 Subject: [PATCH] A test to reproduce Gson concurrency bug. See issue 63. --- .../gson/functional/ConcurrencyTest.java | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100755 gson/src/test/java/com/google/gson/functional/ConcurrencyTest.java diff --git a/gson/src/test/java/com/google/gson/functional/ConcurrencyTest.java b/gson/src/test/java/com/google/gson/functional/ConcurrencyTest.java new file mode 100755 index 00000000..af2b11e5 --- /dev/null +++ b/gson/src/test/java/com/google/gson/functional/ConcurrencyTest.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2008 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.gson.functional; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicBoolean; + +import junit.framework.TestCase; + +import com.google.gson.Gson; + +/** + * Tests for ensuring Gson thread-safety. + * + * @author Inderjeet Singh + * @author Joel Leitch + */ +public class ConcurrencyTest extends TestCase { + private Gson gson; + + @Override + protected void setUp() throws Exception { + super.setUp(); + gson = new Gson(); + } + + /** + * Source-code based on + * http://groups.google.com/group/google-gson/browse_thread/thread/563bb51ee2495081 + */ + public void testSingleThread() { + MyObject myObj = new MyObject("hello", "world", 42); + for (int i = 0; i < 10; i++) { + gson.toJson(myObj); + } + } + + /** + * Source-code based on + * http://groups.google.com/group/google-gson/browse_thread/thread/563bb51ee2495081 + */ + public void testMultiThread() throws InterruptedException { + final CountDownLatch startLatch = new CountDownLatch(1); + final CountDownLatch finishedLatch = new CountDownLatch(10); + final AtomicBoolean failed = new AtomicBoolean(false); + ExecutorService executor = Executors.newFixedThreadPool(10); + for (int taskCount = 0; taskCount < 10; taskCount++) { + executor.execute(new Runnable() { + public void run() { + MyObject myObj = new MyObject(); + try { + startLatch.await(); + for (int i = 0; i < 10; i++) { + String json = gson.toJson(myObj); + } + } catch (Throwable t) { + failed.set(true); + } finally { + finishedLatch.countDown(); + } + } + }); + } + startLatch.countDown(); + finishedLatch.await(); + assertFalse(failed.get()); + } + + private static class MyObject { + private String a; + private String b; + private int i; + + MyObject() { + this("hello", "world", 42); + } + + public MyObject(String a, String b, int i) { + this.a = a; + this.b = b; + this.i = i; + } + } +}