1package test.thread;
2
3import org.testng.Assert;
4import org.testng.TestNG;
5import org.testng.annotations.Test;
6import org.testng.collections.Lists;
7import org.testng.collections.Maps;
8import org.testng.xml.XmlSuite;
9
10import test.SimpleBaseTest;
11
12import java.util.Arrays;
13import java.util.List;
14import java.util.Map;
15
16/**
17 * Test that classes with dependent methods are still run in different threads
18 * and in the correct order.
19 */
20public class MultiThreadedDependentTest extends SimpleBaseTest {
21
22  /**
23   * Make sure that the topological order is preserved and that if
24   * the TestNG runner is configured to run n threads, the dependent
25   * methods are using these n threads.
26   */
27  private void assertOrder(List<String> methods) {
28    List<String> expectedMethods = Arrays.asList(new String[] {
29      "a1", "a2", "a3", "b1", "b2", "b3", "b4", "b5", "c1", "d", "x", "y", "z", "t"
30    });
31    int size = expectedMethods.size();
32    Assert.assertEquals(methods.size(), size);
33    for (String em : expectedMethods) {
34      Assert.assertTrue(methods.contains(em));
35    }
36    Map<String, Boolean> map = Maps.newHashMap();
37    for (String m : methods) {
38      map.put(m, Boolean.TRUE);
39      if ("b1".equals(m) || "b2".equals(m) || "b3".equals(m) || "b4".equals(m) || "b5".equals(m)) {
40        Assert.assertTrue(map.get("a1"));
41        Assert.assertTrue(map.get("a2"));
42        Assert.assertTrue(map.get("a3"));
43      }
44      if ("d".equals(m)) {
45        Assert.assertTrue(map.get("a1"));
46        Assert.assertTrue(map.get("a2"));
47      }
48      if ("c1".equals(m)) {
49        Assert.assertTrue(map.get("b1"));
50        Assert.assertTrue(map.get("b2"));
51      }
52    }
53    Assert.assertEquals(map.size(), size);
54    for (Boolean val : map.values()) {
55      Assert.assertTrue(val);
56    }
57  }
58
59  @Test
60  public void test2Threads() {
61    test(2);
62  }
63
64  @Test
65  public void test3Threads() {
66    test(3);
67  }
68
69  private void test(int threadCount) {
70    Helper.reset();
71    MultiThreadedDependentSampleTest.m_methods = Lists.newArrayList();
72    TestNG tng = create(MultiThreadedDependentSampleTest.class);
73    tng.setThreadCount(threadCount);
74    tng.setParallel(XmlSuite.ParallelMode.METHODS);
75    Map<Long, Long> map = Helper.getMap(MultiThreadedDependentSampleTest.class.getName());
76    synchronized(map) {
77      tng.run();
78      Assert.assertTrue(map.size() > 1, "Map size:" + map.size() + " expected more than 1");
79      assertOrder(MultiThreadedDependentSampleTest.m_methods);
80    }
81  }
82}
83