1 /* 2 * Copyright (c) 2007 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 6 package org.mockitousage.serialization; 7 8 import org.junit.Test; 9 import org.mockitousage.IMethods; 10 import org.mockitoutil.SimpleSerializationUtil; 11 12 import java.nio.charset.CharacterCodingException; 13 import java.util.ArrayList; 14 import java.util.List; 15 import java.util.Random; 16 import java.util.concurrent.*; 17 18 import static org.mockito.Mockito.mock; 19 import static org.mockito.Mockito.withSettings; 20 21 public class ParallelSerializationTest { 22 23 @Test single_mock_being_serialized_in_different_classloaders_by_multiple_threads()24 public void single_mock_being_serialized_in_different_classloaders_by_multiple_threads() throws ExecutionException, InterruptedException { 25 // given 26 int iterations = 2; 27 int threadingFactor = 200; 28 final ExecutorService executorService = Executors.newFixedThreadPool(threadingFactor); 29 final IMethods iMethods_that_store_invocations = mock(IMethods.class, withSettings().serializable()); 30 31 // when 32 for (int i = 0; i <= iterations; i++) { 33 List<Future<?>> futures = new ArrayList<Future<?>>(threadingFactor); 34 final CyclicBarrier barrier_that_will_wait_until_threads_are_ready = new CyclicBarrier(threadingFactor); 35 36 // prepare all threads by submitting a callable 37 // - that will serialize the mock a 'threadingFactor' times 38 // - that will use the mock a 'threadingFactor' times 39 for (int j = 0; j < threadingFactor; j++) { 40 // submit a callable that will serialize the mock 'iMethods' 41 futures.add(executorService.submit(new Callable<Object>() { 42 public Object call() throws Exception { 43 barrier_that_will_wait_until_threads_are_ready.await(); 44 45 randomCallOn(iMethods_that_store_invocations); 46 47 return SimpleSerializationUtil.serializeMock(iMethods_that_store_invocations).toByteArray(); 48 } 49 })); 50 51 // submit a callable that will only use the mock 'iMethods' 52 executorService.submit(new Callable<Object>() { 53 public Object call() throws Exception { 54 barrier_that_will_wait_until_threads_are_ready.await(); 55 return iMethods_that_store_invocations.longObjectReturningMethod(); 56 } 57 }); 58 } 59 60 // ensure we are getting the futures 61 for (Future<?> future : futures) { 62 future.get(); 63 } 64 } 65 } 66 randomCallOn(IMethods iMethods)67 private void randomCallOn(IMethods iMethods) throws CharacterCodingException { 68 int random = new Random().nextInt(10); 69 switch (random) { 70 case 0 : iMethods.arrayReturningMethod(); break; 71 case 1 : iMethods.longObjectReturningMethod(); break; 72 case 2 : iMethods.linkedListReturningMethod(); break; 73 case 3 : iMethods.iMethodsReturningMethod(); break; 74 case 4 : iMethods.canThrowException(); break; 75 case 5 : iMethods.differentMethod(); break; 76 case 6 : iMethods.voidMethod(); break; 77 case 7 : iMethods.varargsString(1, ""); break; 78 case 8 : iMethods.forMap(null); break; 79 case 9 : iMethods.throwsNothing(false); break; 80 default: 81 } 82 } 83 } 84