summaryrefslogtreecommitdiffstats
path: root/vespajlib/src/test/java/com/yahoo/concurrent/maintenance/JobControlTest.java
blob: 0640ab2835aff078c8c0af92945ffe5951fc9449 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.concurrent.maintenance;

import com.yahoo.transaction.Mutex;
import org.junit.Test;

import java.time.Duration;
import java.time.Instant;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

/**
 * @author bratseth
 */
public class JobControlTest {

    @Test
    public void testJobControl() {
        MockJobControlState state = new MockJobControlState();
        JobControl jobControl = new JobControl(state);

        MockMaintainer maintainer1 = new MockMaintainer();
        MockMaintainer maintainer2 = new MockMaintainer();
        assertTrue(jobControl.jobs().isEmpty());

        String job1 = "Job1";
        String job2 = "Job2";

        jobControl.started(job1, maintainer1);
        jobControl.started(job2, maintainer2);
        assertEquals(2, jobControl.jobs().size());
        assertTrue(jobControl.jobs().contains(job1));
        assertTrue(jobControl.jobs().contains(job2));

        assertTrue(jobControl.isActive(job1));
        assertTrue(jobControl.isActive(job2));

        state.setActive(job1, false);
        assertFalse(jobControl.isActive(job1));
        assertTrue(jobControl.isActive(job2));

        state.setActive(job2, false);
        assertFalse(jobControl.isActive(job1));
        assertFalse(jobControl.isActive(job2));

        state.setActive(job1, true);
        assertTrue(jobControl.isActive(job1));
        assertFalse(jobControl.isActive(job2));

        state.setActive(job2, true);
        assertTrue(jobControl.isActive(job1));
        assertTrue(jobControl.isActive(job2));

        // Run jobs on-demand
        jobControl.run(job1);
        jobControl.run(job1);
        assertEquals(2, maintainer1.maintenanceInvocations);
        jobControl.run(job2);
        assertEquals(1, maintainer2.maintenanceInvocations);

        // Running jobs on-demand ignores inactive flag
        state.setActive(job1, false);
        jobControl.run(job1);
        assertEquals(3, maintainer1.maintenanceInvocations);
    }

    @Test
    public void testJobControlMayDeactivateJobs() {
        MockJobControlState state = new MockJobControlState();
        JobControl jobControl = new JobControl(state);
        MockMaintainer mockMaintainer = new MockMaintainer(jobControl);

        assertTrue(jobControl.jobs().contains("MockMaintainer"));

        assertEquals(0, mockMaintainer.maintenanceInvocations);

        mockMaintainer.run();
        assertEquals(1, mockMaintainer.maintenanceInvocations);

        state.setActive("MockMaintainer", false);
        mockMaintainer.run();
        assertEquals(1, mockMaintainer.maintenanceInvocations);

        state.setActive("MockMaintainer", true);
        mockMaintainer.run();
        assertEquals(2, mockMaintainer.maintenanceInvocations);
    }

    private static class MockJobControlState implements JobControlState {

        private final Set<String> inactiveJobs = new HashSet<>();

        @Override
        public Set<String> readInactiveJobs() {
            return new HashSet<>(inactiveJobs);
        }

        @Override
        public Mutex lockMaintenanceJob(String job) {
            return () -> {};
        }

        public void setActive(String job, boolean active) {
            if (active) {
                inactiveJobs.remove(job);
            } else {
                inactiveJobs.add(job);
            }
        }

    }

    private static class MockMaintainer extends Maintainer {

        int maintenanceInvocations = 0;

        private MockMaintainer(JobControl jobControl) {
            super(null, Duration.ofHours(1), Instant.now(), jobControl, List.of());
        }

        private MockMaintainer() {
            this(new JobControl(new MockJobControlState()));
        }

        @Override
        protected void maintain() {
            maintenanceInvocations++;
        }

    }

}