You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2016/11/15 10:57:13 UTC

[2/4] cayenne git commit: CAY-2143 NPE in BaseSchemaUpdateStrategy

CAY-2143 NPE in BaseSchemaUpdateStrategy

* tests


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/e77e278b
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/e77e278b
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/e77e278b

Branch: refs/heads/master
Commit: e77e278b296525364c43554c14a681daaf5b4c0b
Parents: 5708e35
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Tue Nov 15 13:52:42 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Tue Nov 15 13:52:45 2016 +0300

----------------------------------------------------------------------
 ...aseSchemaUpdateStrategy_ConcurrencyTest.java | 98 ++++++++++++++++++++
 1 file changed, 98 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/e77e278b/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy_ConcurrencyTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy_ConcurrencyTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy_ConcurrencyTest.java
new file mode 100644
index 0000000..695202d
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy_ConcurrencyTest.java
@@ -0,0 +1,98 @@
+/*
+ *    Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you 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 org.apache.cayenne.access.dbsync;
+
+import org.apache.cayenne.access.DataNode;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.mockito.Mockito.mock;
+
+public class BaseSchemaUpdateStrategy_ConcurrencyTest {
+
+    private static final Log LOGGER = LogFactory.getLog(BaseSchemaUpdateStrategy_ConcurrencyTest.class);
+
+    private ExecutorService threadPool;
+    private DataNode dataNode;
+
+    @Before
+    public void before() {
+        threadPool = Executors.newFixedThreadPool(2);
+        dataNode = mock(DataNode.class);
+    }
+
+    @After
+    public void after() {
+        threadPool.shutdownNow();
+    }
+
+    @Test
+    public void testUpdateSchema_Concurrency() throws InterruptedException, ExecutionException, TimeoutException {
+
+        final AtomicInteger counter = new AtomicInteger();
+        final AtomicBoolean errors = new AtomicBoolean(false);
+
+        final BaseSchemaUpdateStrategy strategy = new BaseSchemaUpdateStrategy() {
+            @Override
+            protected void processSchemaUpdate(DataNode dataNode) throws SQLException {
+                counter.incrementAndGet();
+            }
+        };
+
+        Collection<Future<?>> tasks = new ArrayList<>();
+
+        for (int i = 0; i < 20; i++) {
+            tasks.add(threadPool.submit(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        strategy.updateSchema(dataNode);
+                    } catch (SQLException e) {
+                        LOGGER.error("error in test", e);
+                        errors.set(true);
+                    }
+                }
+            }));
+        }
+
+        for(Future<?> f : tasks) {
+            f.get(1, TimeUnit.SECONDS);
+        }
+
+        assertFalse(errors.get());
+        assertEquals(1, counter.get());
+    }
+}