From ef311beb1a8fccb97d30c0ea96905b3448dff807 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Wed, 14 Nov 2012 13:35:43 +0000
Subject: [PATCH] SP-367, BIS-242:
 MultiThreadSampleOptimisticLockingTest.testRegisterContainedSamplesForSameSampleInTwoThreads()
 introduced

SVN: 27621
---
 ...ultiThreadSampleOptimisticLockingTest.java | 63 ++++++++++++++++++-
 .../optimistic_locking/ToolBox.java           |  8 +++
 2 files changed, 68 insertions(+), 3 deletions(-)

diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadSampleOptimisticLockingTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadSampleOptimisticLockingTest.java
index bcbde898c6d..16e1abc69bc 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadSampleOptimisticLockingTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadSampleOptimisticLockingTest.java
@@ -47,14 +47,14 @@ public class MultiThreadSampleOptimisticLockingTest extends MultiThreadOptimisti
             MultiThreadSampleOptimisticLockingTest.class);
 
     @Test
-    public void testRegisterSamplesForSameSampleInTwoThreads()
+    public void testRegisterChildSamplesForSameSampleInTwoThreads()
     {
         final Sample sample = toolBox.createAndLoadSample(1, null);
         final MessageChannel messageChannelMain =
-                new MessageChannelBuilder(10000).name("data sets for samples main")
+                new MessageChannelBuilder(10000).name("child samples for samples main")
                         .logger(operationLog).getChannel();
         final MessageChannel messageChannelSecond =
-                new MessageChannelBuilder(10000).name("data sets for samples second")
+                new MessageChannelBuilder(10000).name("child samples for samples second")
                         .logger(operationLog).getChannel();
         final IServiceConversationProgressListener listener =
                 new AbstractServiceConversationProgressListener(operationLog)
@@ -102,6 +102,63 @@ public class MultiThreadSampleOptimisticLockingTest extends MultiThreadOptimisti
 
     }
 
+    @Test
+    public void testRegisterContainedSamplesForSameSampleInTwoThreads()
+    {
+        final Sample sample = toolBox.createAndLoadSample(1, null);
+        final MessageChannel messageChannelMain =
+                new MessageChannelBuilder(10000).name("contained samples for samples main")
+                        .logger(operationLog).getChannel();
+        final MessageChannel messageChannelSecond =
+                new MessageChannelBuilder(10000).name("contained samples for samples second")
+                        .logger(operationLog).getChannel();
+        final IServiceConversationProgressListener listener =
+                new AbstractServiceConversationProgressListener(operationLog)
+                    {
+                        @Override
+                        public void handleProgress(String phaseName, int totalItemsToProcess,
+                                int numItemsProcessed)
+                        {
+                            if (phaseName.equals("createContainerSamples")
+                                    && numItemsProcessed == 1 && totalItemsToProcess == 2)
+                            {
+                                messageChannelMain.send(ToolBox.FIRST_REGISTERED);
+                            }
+                        }
+                    };
+        TimeIntervalChecker timeIntervalChecker = new TimeIntervalChecker();
+        new Thread(new Runnable()
+            {
+                @Override
+                public void run()
+                {
+                    messageChannelMain.assertNextMessage(ToolBox.FIRST_REGISTERED);
+                    AtomicEntityOperationDetails details =
+                            new AtomicEntityOperationDetailsBuilder().user("test")
+                                    .sample(toolBox.sampleComponent(13, sample)).getDetails();
+                    etlService.performEntityOperations(systemSessionToken, details);
+                    messageChannelSecond.send(ToolBox.REGISTERED);
+                }
+            }).start();
+        ServiceConversationsThreadContext.setProgressListener(listener);
+        AtomicEntityOperationDetailsBuilder builder = new AtomicEntityOperationDetailsBuilder();
+        builder.user(ToolBox.USER_ID).batchSize(1);
+        builder.sample(toolBox.sampleComponent(11, sample));
+        builder.sample(toolBox.sampleComponent(12, sample));
+
+        etlService.performEntityOperations(systemSessionToken, builder.getDetails());
+        messageChannelSecond.assertNextMessage(ToolBox.REGISTERED);
+
+        Sample loadedSample = toolBox.loadSample(sample);
+        List<Sample> samples =
+                etlService.listSamples(systemSessionToken,
+                        ListSampleCriteria.createForContainer(new TechId(loadedSample)));
+        assertEquals("[OLT-S1:OLT-S11, OLT-S1:OLT-S12, OLT-S1:OLT-S13]",
+                toolBox.extractCodes(samples).toString());
+        toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedSample, "test");
+
+    }
+
     @Test
     public void testRegisterDataSetsForSameSampleInTwoThreads()
     {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java
index 7b33e0e8a09..a9efbfbef3b 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java
@@ -327,6 +327,14 @@ public class ToolBox
         return sample;
     }
 
+    public NewSample sampleComponent(int number, IIdentifierHolder sampleContainer,
+            IEntityProperty... properties)
+    {
+        NewSample sample = sample(number, properties);
+        sample.setContainerIdentifier(sampleContainer.getIdentifier());
+        return sample;
+    }
+
     public NewSample sample(int number, IEntityProperty... properties)
     {
         NewSample sample = new NewSample();
-- 
GitLab