View Javadoc

1   package com.atlassian.scheduler.config;
2   
3   import com.google.common.collect.ImmutableMap;
4   import org.junit.Test;
5   
6   import java.io.Serializable;
7   import java.util.Collections;
8   import java.util.Date;
9   import java.util.Map;
10  
11  import static com.atlassian.scheduler.config.JobConfig.NO_PARAMETERS;
12  import static com.atlassian.scheduler.config.RunMode.RUN_LOCALLY;
13  import static com.atlassian.scheduler.config.RunMode.RUN_ONCE_PER_CLUSTER;
14  import static com.atlassian.scheduler.config.Schedule.forInterval;
15  import static com.atlassian.scheduler.config.Schedule.runOnce;
16  import static com.google.common.collect.Maps.newHashMap;
17  import static org.hamcrest.Matchers.equalTo;
18  import static org.hamcrest.Matchers.is;
19  import static org.hamcrest.Matchers.not;
20  import static org.junit.Assert.assertEquals;
21  import static org.junit.Assert.assertNotSame;
22  import static org.junit.Assert.assertSame;
23  import static org.junit.Assert.assertThat;
24  import static org.junit.Assert.fail;
25  
26  /**
27   * @since v1.0
28   */
29  public class JobConfigTest {
30      private static final JobRunnerKey KEY = JobRunnerKey.of("test.job");
31  
32      @Test
33      public void testDefaults() {
34          final JobConfig config = JobConfig.forJobRunnerKey(KEY);
35          assertEquals(KEY, config.getJobRunnerKey());
36          assertEquals(RUN_ONCE_PER_CLUSTER, config.getRunMode());
37          assertEquals(runOnce(null), config.getSchedule());
38          assertEquals(NO_PARAMETERS, config.getParameters());
39      }
40  
41      @Test
42      public void testWithRunMode() {
43          final JobConfig original = JobConfig.forJobRunnerKey(KEY);
44          final JobConfig modified = original.withRunMode(RUN_LOCALLY);
45          assertNotSame(original, modified);
46          assertThat(modified, not(equalTo(original)));
47          assertThat(original.getRunMode(), is(RUN_ONCE_PER_CLUSTER));
48          assertThat(modified.getRunMode(), is(RUN_LOCALLY));
49      }
50  
51      @Test
52      public void testWithSchedule() {
53          final Schedule schedule = forInterval(42L, new Date());
54          final JobConfig original = JobConfig.forJobRunnerKey(KEY);
55          final JobConfig modified = original.withSchedule(schedule);
56          assertNotSame(original, modified);
57          assertThat(modified, not(equalTo(original)));
58          assertThat(original.getSchedule(), is(runOnce(null)));
59          assertThat(modified.getSchedule(), is(schedule));
60      }
61  
62      @Test
63      public void testWithParametersNull() {
64          final Map<String, Serializable> parameters = JobConfig.forJobRunnerKey(KEY)
65                  .withParameters(null)
66                  .getParameters();
67          assertEquals(NO_PARAMETERS, parameters);
68          assertImmutable(parameters);
69      }
70  
71      @Test
72      public void testWithParametersImmutableMap() {
73          // ImmutableMap is special-cased because we can always be certain that its structure
74          // cannot be modified.  The only this that could change is mutable objects within the
75          // map, and there is nothing that we could do about that anyway.
76          final Map<String, Serializable> parameters = ImmutableMap.copyOf(mutableParameters());
77          final JobConfig original = JobConfig.forJobRunnerKey(KEY);
78          final JobConfig modified = original.withParameters(parameters);
79          assertThat(modified, not(equalTo(original)));
80          assertSame(parameters, modified.getParameters());
81      }
82  
83      @Test
84      public void testWithParametersUnmodifiableMap() {
85          // With unmodifiable map, we still do the copy for two reasons:
86          // 1) We can't use instanceof on it to determine that this is what it is
87          // 2) It's wrapping another map that is probably still mutable, so we can't be sure
88          //      that its structure will not change
89          final Map<String, Serializable> modifiableMap = mutableParameters();
90          final Map<String, Serializable> unmodifiableMap = Collections.unmodifiableMap(modifiableMap);
91          final JobConfig original = JobConfig.forJobRunnerKey(KEY);
92          final JobConfig modified = original.withParameters(unmodifiableMap);
93          assertThat(modified, not(equalTo(original)));
94          assertThat(modified.getParameters(), equalTo(unmodifiableMap));
95          assertNotSame(unmodifiableMap, modified.getParameters());
96          assertImmutable(modified.getParameters());
97          modifiableMap.put("Changed", "It!");
98          assertThat(modified.getParameters(), equalTo(mutableParameters()));
99          assertThat(modified.getParameters(), not(equalTo(unmodifiableMap)));
100     }
101 
102     @Test
103     public void testWithParametersNormalMap() {
104         final Map<String, Serializable> modifiableMap = mutableParameters();
105         final JobConfig original = JobConfig.forJobRunnerKey(KEY);
106         final JobConfig modified = original.withParameters(modifiableMap);
107         assertThat(modified, not(equalTo(original)));
108         assertThat(modified.getParameters(), equalTo(modifiableMap));
109         assertImmutable(modified.getParameters());
110         modifiableMap.put("Changed", "It!");
111         assertThat(modified.getParameters(), equalTo(mutableParameters()));
112         assertThat(modified.getParameters(), not(equalTo(modifiableMap)));
113     }
114 
115 
116     private static void assertImmutable(Map<String, Serializable> map) {
117         try {
118             map.put("This put should fail", "because the map should be immutable");
119             fail("Supplied map was mutable: " + map);
120         } catch (UnsupportedOperationException uoe) {
121             // Expected
122         }
123     }
124 
125     private static Map<String, Serializable> mutableParameters() {
126         final Map<String, Serializable> map = newHashMap();
127         map.put("Hello", 42L);
128         map.put("World", true);
129         return map;
130     }
131 }