001    package org.cocome.tradingsystem.systests.scenarios;
002    
003    import java.util.Random;
004    
005    /**
006     * This test covers use case 1 for multiple cash desks in parallel.
007     * 
008     * @author Benjamin Hummel
009     * @author Christian Pfaller
010     * @author $Author: hummel $
011     * @version $Rev: 64 $
012     * @levd.rating GREEN Rev: 64
013     */
014    public class ProcessSaleConcurrentTest extends ProcessSaleBase {
015    
016            /** Number of concurrent sales processes. */
017            private static final int NUM_PROCESSES = 3;
018    
019            /** Execute the test scenario. */
020            public void testScenario() throws Exception {
021    
022                    ProcessSaleBase[] saleProcesses = new ProcessSaleBase[NUM_PROCESSES];
023                    for (int i = 0; i < NUM_PROCESSES; ++i) {
024                            saleProcesses[i] = new ProcessSaleBase();
025                            saleProcesses[i].copySetup(this);
026                            saleProcesses[i].initializeCashDesk(0, i);
027                    }
028    
029                    int numFinished = 0;
030                    int[] states = new int[NUM_PROCESSES];
031                    Random interleavingGenerator = new Random(42);
032    
033                    while (numFinished < NUM_PROCESSES) {
034                            int pid = interleavingGenerator.nextInt(NUM_PROCESSES);
035                            switch (states[pid]) {
036                            case 0:
037                                    saleProcesses[pid].startNewSale(15);
038                                    break;
039                            case 1:
040                            case 2:
041                            case 3:
042                                    saleProcesses[pid].enterProducts(5);
043                                    break;
044                            case 4:
045                                    saleProcesses[pid].finishSale();
046                                    break;
047                            case 5:
048                                    saleProcesses[pid].handleCashPayment();
049                                    break;
050                            case 6:
051                                    ++numFinished;
052                                    break;
053                            }
054                            ++states[pid];
055                    }
056            }
057    
058    }