1a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar/*
2a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar * Copyright 2017 The Android Open Source Project
3a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar *
4a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar * Licensed under the Apache License, Version 2.0 (the "License");
5a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar * you may not use this file except in compliance with the License.
6a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar * You may obtain a copy of the License at
7a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar *
8a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar *      http://www.apache.org/licenses/LICENSE-2.0
9a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar *
10a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar * Unless required by applicable law or agreed to in writing, software
11a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar * distributed under the License is distributed on an "AS IS" BASIS,
12a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar * See the License for the specific language governing permissions and
14a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar * limitations under the License.
15a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar */
16a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
17564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariapackage androidx.work.impl.constraints.controllers;
18a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
19a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagarimport static org.hamcrest.CoreMatchers.is;
20a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagarimport static org.hamcrest.MatcherAssert.assertThat;
2191d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarinimport static org.mockito.ArgumentMatchers.eq;
22a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagarimport static org.mockito.Mockito.mock;
23a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagarimport static org.mockito.Mockito.times;
24a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagarimport static org.mockito.Mockito.verify;
25a10969c4800ce698191b23836df2b31c2663c17dJan Clarinimport static org.mockito.Mockito.verifyZeroInteractions;
26a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
27a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagarimport android.support.annotation.NonNull;
289598ea6e2427580e555919657530dc18d237c962Rahul Ravikumarimport android.support.test.filters.SdkSuppress;
29a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagarimport android.support.test.filters.SmallTest;
30a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagarimport android.support.test.runner.AndroidJUnit4;
31a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
32564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.Constraints;
337031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport androidx.work.OneTimeWorkRequest;
34564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.WorkManagerTest;
35564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.impl.constraints.trackers.ConstraintTracker;
36564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.impl.model.WorkSpec;
37564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.worker.TestWorker;
38564e43098c323d1a90be53c190b8fdbdde973505Sumir Kataria
39b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport org.junit.Before;
40b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport org.junit.Test;
41b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport org.junit.runner.RunWith;
42b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria
43b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport java.util.Collections;
44b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport java.util.List;
45b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria
46a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar@RunWith(AndroidJUnit4.class)
479598ea6e2427580e555919657530dc18d237c962Rahul Ravikumar@SdkSuppress(minSdkVersion = 23)
481cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Katariapublic class ConstraintControllerTest extends WorkManagerTest {
49a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    private TestDeviceIdleConstraintController mTestIdleController;
50a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    private ConstraintTracker<Boolean> mMockTracker = mock(ConstraintTracker.class);
51a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    private ConstraintController.OnConstraintUpdatedCallback mCallback =
52a10969c4800ce698191b23836df2b31c2663c17dJan Clarin            mock(ConstraintController.OnConstraintUpdatedCallback.class);
53a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
54a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @Before
55a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    public void setUp() {
56a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController = new TestDeviceIdleConstraintController(mMockTracker, mCallback);
57a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    }
58a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
59a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    private WorkSpec createTestWorkSpec(Constraints constraints) {
607031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        return getWorkSpec(new OneTimeWorkRequest.Builder(TestWorker.class)
6162a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria                .setConstraints(constraints)
621cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria                .build());
63a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    }
64a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
65a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    private WorkSpec createTestConstraintWorkSpec() {
66a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        Constraints mConstraintsWithTestConstraint = new Constraints.Builder()
67a10969c4800ce698191b23836df2b31c2663c17dJan Clarin                .setRequiresDeviceIdle(true)
68a10969c4800ce698191b23836df2b31c2663c17dJan Clarin                .build();
69a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
70a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        return createTestWorkSpec(mConstraintsWithTestConstraint);
71a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    }
72a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
73a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    private WorkSpec createNoConstraintWorkSpec() {
74d677da54eeaecdff79fb012ec96852f53437542fXyan Bhatnagar        return createTestWorkSpec(Constraints.NONE);
75a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    }
76a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
77a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @Test
78a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @SmallTest
79a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testReplace_empty() {
80a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(Collections.<WorkSpec>emptyList());
81a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        verify(mMockTracker).removeListener(mTestIdleController);
82a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        verifyZeroInteractions(mCallback);
83a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    }
84a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
85a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @Test
86a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @SmallTest
87a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testReplace_workSpecNoConstraints() {
88a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        WorkSpec workSpecNoConstraints = createNoConstraintWorkSpec();
89a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        List<WorkSpec> workSpecs = Collections.singletonList(workSpecNoConstraints);
90a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(workSpecs);
91a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        verify(mMockTracker).removeListener(mTestIdleController);
92a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        verifyZeroInteractions(mCallback);
93a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    }
94a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
95a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @Test
96a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @SmallTest
97a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testReplace_workSpecWithConstraint_constrained() {
98a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        WorkSpec workSpecWithConstraint = createTestConstraintWorkSpec();
99b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        List<String> expectedWorkIds = Collections.singletonList(workSpecWithConstraint.id);
100a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        List<WorkSpec> workSpecs = Collections.singletonList(workSpecWithConstraint);
10191d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin
10291d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin        mTestIdleController.setDeviceActive();
103a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(workSpecs);
104a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        verify(mMockTracker).addListener(mTestIdleController);
10591d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin        verify(mCallback).onConstraintNotMet(eq(expectedWorkIds));
106a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    }
107a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
108a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @Test
109a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @SmallTest
110a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testReplace_workSpecWithConstraint_unconstrained() {
111a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        WorkSpec workSpecWithConstraint = createTestConstraintWorkSpec();
112b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        List<String> expectedWorkIds = Collections.singletonList(workSpecWithConstraint.id);
113a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        List<WorkSpec> workSpecs = Collections.singletonList(workSpecWithConstraint);
11491d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin
11591d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin        mTestIdleController.setDeviceIdle();
116a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(workSpecs);
117a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        verify(mMockTracker).addListener(mTestIdleController);
11891d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin        verify(mCallback).onConstraintMet(eq(expectedWorkIds));
119a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    }
120a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
121a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @Test
122a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @SmallTest
123a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testReplace_workSpecWithConstraint_constraintNotSet() {
12491d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin        WorkSpec workSpecWithConstraint = createTestConstraintWorkSpec();
125b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        List<String> expectedWorkIds = Collections.singletonList(workSpecWithConstraint.id);
12691d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin        List<WorkSpec> workSpecs = Collections.singletonList(workSpecWithConstraint);
12791d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin
128a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(workSpecs);
12991d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin        verify(mCallback).onConstraintNotMet(expectedWorkIds);
130a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    }
131a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
132a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @Test
133a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @SmallTest
134a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testReset_alreadyNoMatchingWorkSpecs() {
135a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.reset();
136a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        verifyZeroInteractions(mMockTracker);
137a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    }
138a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
139a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @Test
140a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @SmallTest
141a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testReset_withMatchingWorkSpecs() {
142a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        WorkSpec workSpecWithConstraint = createTestConstraintWorkSpec();
143a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        List<WorkSpec> workSpecs = Collections.singletonList(workSpecWithConstraint);
144a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(workSpecs);
145a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
146a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.reset();
147a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        verify(mMockTracker).removeListener(mTestIdleController);
148a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    }
149a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
150a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @Test
151a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @SmallTest
152a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testOnConstraintChanged_noMatchingWorkSpecs() {
153a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.onConstraintChanged(true);
154a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        verifyZeroInteractions(mCallback);
155a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    }
156a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
157a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @Test
158a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @SmallTest
159a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testOnConstraintChanged_toConstrained_withMatchingWorkSpecs() {
160a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        WorkSpec workSpecWithConstraint = createTestConstraintWorkSpec();
161b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        List<String> expectedWorkIds = Collections.singletonList(workSpecWithConstraint.id);
162a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        List<WorkSpec> workSpecs = Collections.singletonList(workSpecWithConstraint);
163a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(workSpecs);
16491d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin        verify(mCallback).onConstraintNotMet(expectedWorkIds);
165a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
166a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        final boolean deviceIdle = false;
167a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.onConstraintChanged(deviceIdle);
16891d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin        verify(mCallback, times(2)).onConstraintNotMet(expectedWorkIds);
169a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    }
170a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
171a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @Test
172a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @SmallTest
173a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testOnConstraintChanged_toUnconstrained_withMatchingWorkSpecs() {
174a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        WorkSpec workSpecWithConstraint = createTestConstraintWorkSpec();
175b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        List<String> expectedWorkIds = Collections.singletonList(workSpecWithConstraint.id);
176a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        List<WorkSpec> workSpecs = Collections.singletonList(workSpecWithConstraint);
177a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(workSpecs);
178a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
179a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        final boolean deviceIdle = true;
180a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.onConstraintChanged(deviceIdle);
18191d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin        verify(mCallback).onConstraintMet(expectedWorkIds);
182a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    }
183a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
184a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @Test
185a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @SmallTest
186a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testIsWorkSpecConstrained_noMatchingWorkSpecs() {
187a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        WorkSpec workSpecNoConstraints = createNoConstraintWorkSpec();
188a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(Collections.singletonList(workSpecNoConstraints));
189b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(mTestIdleController.isWorkSpecConstrained(workSpecNoConstraints.id),
19091d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin                is(false));
191a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    }
192a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
193a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @Test
194a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @SmallTest
195a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testIsWorkSpecConstrained_constraintNotSet() {
196a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        WorkSpec workSpecWithConstraint = createTestConstraintWorkSpec();
197a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(Collections.singletonList(workSpecWithConstraint));
198b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(mTestIdleController.isWorkSpecConstrained(workSpecWithConstraint.id),
19991d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin                is(false));
200a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    }
201a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
202a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @Test
203a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @SmallTest
204a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testIsWorkSpecConstrained_constrained_withMatchingWorkSpecs() {
205a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.setDeviceActive();
206a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
207a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        WorkSpec workSpecWithConstraint = createTestConstraintWorkSpec();
208a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(Collections.singletonList(workSpecWithConstraint));
209b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(mTestIdleController.isWorkSpecConstrained(workSpecWithConstraint.id),
21091d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin                is(true));
211a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    }
212a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
213a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @Test
214a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    @SmallTest
215a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testIsWorkSpecConstrained_constrained_noMatchingWorkSpecs() {
216a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.setDeviceActive();
217a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
218a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        WorkSpec workSpecNoConstraints = createNoConstraintWorkSpec();
219a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(Collections.singletonList(workSpecNoConstraints));
220b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(mTestIdleController.isWorkSpecConstrained(workSpecNoConstraints.id),
22191d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin                is(false));
222a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    }
223a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
224a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @Test
225a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @SmallTest
226a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testIsWorkSpecConstrained_unconstrained_withMatchingWorkSpecs() {
227a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.setDeviceIdle();
228a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
229a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        WorkSpec workSpecWithConstraint = createTestConstraintWorkSpec();
230a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(Collections.singletonList(workSpecWithConstraint));
231b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(mTestIdleController.isWorkSpecConstrained(workSpecWithConstraint.id),
23291d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin                is(false));
233a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    }
234a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
235a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @Test
236a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    @SmallTest
237a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    public void testIsWorkSpecConstrained_unconstrained_noMatchingWorkSpecs() {
238a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.setDeviceIdle();
239a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
240a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        WorkSpec workSpecNoConstraints = createNoConstraintWorkSpec();
241a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        mTestIdleController.replace(Collections.singletonList(workSpecNoConstraints));
242b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(mTestIdleController.isWorkSpecConstrained(workSpecNoConstraints.id),
24391d49d0a3eecc54aa2b0ad7c7164f9041b94c942Jan Clarin                is(false));
244a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    }
245a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
246a10969c4800ce698191b23836df2b31c2663c17dJan Clarin    private static class TestDeviceIdleConstraintController extends ConstraintController<Boolean> {
247a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        TestDeviceIdleConstraintController(ConstraintTracker<Boolean> tracker,
248a10969c4800ce698191b23836df2b31c2663c17dJan Clarin                OnConstraintUpdatedCallback callback) {
249a10969c4800ce698191b23836df2b31c2663c17dJan Clarin            super(tracker, callback);
250a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        }
251a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
252a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        @Override
253a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        boolean hasConstraint(@NonNull WorkSpec workSpec) {
254b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria            return workSpec.constraints.requiresDeviceIdle();
255a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar        }
256a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar
257a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar        @Override
258a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        boolean isConstrained(@NonNull Boolean isDeviceIdle) {
259a10969c4800ce698191b23836df2b31c2663c17dJan Clarin            return !isDeviceIdle;
260a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        }
261a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
262a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        void setDeviceActive() {
263a10969c4800ce698191b23836df2b31c2663c17dJan Clarin            onConstraintChanged(false);
264a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        }
265a10969c4800ce698191b23836df2b31c2663c17dJan Clarin
266a10969c4800ce698191b23836df2b31c2663c17dJan Clarin        void setDeviceIdle() {
267a10969c4800ce698191b23836df2b31c2663c17dJan Clarin            onConstraintChanged(true);
268a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar        }
269a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar    }
270a20fe146d0b328cc012b110562ca5ff1a456b758Xyan Bhatnagar}
271