1bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay/*
2bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay * Copyright (C) 2016 The Android Open Source Project
3bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay *
4bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay * Licensed under the Apache License, Version 2.0 (the "License");
5bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay * you may not use this file except in compliance with the License.
6bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay * You may obtain a copy of the License at
7bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay *
8bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay *      http://www.apache.org/licenses/LICENSE-2.0
9bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay *
10bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay * Unless required by applicable law or agreed to in writing, software
11bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay * distributed under the License is distributed on an "AS IS" BASIS,
12bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay * See the License for the specific language governing permissions and
14bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay * limitations under the License.
15bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay */
16bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
17bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKaypackage com.android.documentsui.services;
18bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
19bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKayimport static org.junit.Assert.assertEquals;
20bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKayimport static org.junit.Assert.fail;
21bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
2299f1dc3da6defec0596864934bfe76adc96a1d62Steve McKayimport android.net.Uri;
23bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKayimport android.support.annotation.Nullable;
24bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
25d080506e3aa8547605cd4783eb660775d7d2b8eeSteve McKayimport com.android.documentsui.base.DocumentInfo;
26bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
27bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKayimport java.util.ArrayList;
28bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKayimport java.util.List;
29bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKayimport java.util.concurrent.CountDownLatch;
30bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKayimport java.util.concurrent.TimeUnit;
31bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
32bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKaypublic class TestJobListener implements Job.Listener {
33bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
34bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    private final CountDownLatch latch = new CountDownLatch(1);
35bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    private final List<Job> progress = new ArrayList<>();
36bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    @Nullable private Job started;
37bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    @Nullable private Job finished;
38bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
39bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    @Override
40bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    public void onStart(Job job) {
41bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        started = job;
42bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    }
43bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
44bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    @Override
45bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    public void onFinished(Job job) {
46bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        this.finished = job;
47bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        latch.countDown();
48bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    }
49bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
50bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    public void assertStarted() {
51bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        if (started == null) {
52bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay            fail("Job didn't start. onStart never called.");
53bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        }
54bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    }
55bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
56bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    public void assertFinished() {
57bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        if (finished == null) {
58bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay            fail("Job didn't finish. onFinish never called.");
59bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        }
60bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    }
61bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
62bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    public void assertFailed() {
63dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        if (finished == null || !finished.hasFailures()) {
64bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay            fail("Job didn't fail. onFailed never called.");
65bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        }
66bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    }
67bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
6899f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay    public void assertFilesFailed(List<String> names) {
69dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        if (finished == null || !finished.hasFailures()) {
70bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay            fail("Can't test failed documetns. Job didn't fail.");
71bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        }
72bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
7399f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        assertEquals(finished.failedDocs.size(), names.size());
74bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        for (String name : names) {
75bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay            assertFileFailed(name);
76bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        }
77bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    }
78bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
79bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    public void assertFileFailed(String name) {
80dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        if (finished == null || !finished.hasFailures()) {
81bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay            fail("Can't test failed documetns. Job didn't fail.");
82bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        }
83bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
8499f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        for (DocumentInfo failed : finished.failedDocs) {
85bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay            if (name.equals(failed.displayName)) {
86bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay                return;
87bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay            }
88bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        }
89bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        fail("Couldn't find failed file: " + name);
90bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    }
91bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
9299f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay    public void assertUrisFailed(List<Uri> uris) {
9399f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        if (finished == null || !finished.hasFailures()) {
9499f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay            fail("Can't test failed documetns. Job didn't fail.");
9599f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        }
9699f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay
9799f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        assertEquals(finished.failedDocs.size(), uris.size());
9899f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        for (Uri uri : uris) {
9999f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay            assertUriFailed(uri);
10099f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        }
10199f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay    }
10299f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay
10399f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay    public void assertUriFailed(Uri uri) {
10499f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        if (finished == null || !finished.hasFailures()) {
10599f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay            fail("Can't test failed documetns. Job didn't fail.");
10699f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        }
10799f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay
10899f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        for (Uri failed : finished.failedUris) {
10999f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay            if (uri.equals(failed)) {
11099f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay                return;
11199f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay            }
11299f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        }
11399f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        fail("Couldn't find failed uri: " + uri);
11499f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay    }
11599f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay
11699f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay    public void assertFailureCount(int expected) {
11799f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        if (finished == null) {
11899f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay            fail("No job to test.");
11999f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        }
12099f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay
12199f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        assertEquals(expected, finished.failureCount);
12299f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay    }
12399f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay
124bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    public void assertCanceled() {
125bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        if (finished == null) {
126bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay            fail("Can't determine if job was canceled. Job didn't finish.");
127bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        }
128bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        if (!finished.isCanceled()) {
129bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay            fail("Job wasn't canceled. Job#isCanceled returned false.");
130bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        }
131bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    }
132bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
133bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    public void assertMadeProgress() {
134bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        if (progress.isEmpty()) {
135bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay            fail("Job made no progress. onProgress never called.");
136bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        }
137bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    }
138bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay
139bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    public void waitForFinished() throws InterruptedException {
140bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay        latch.await(500, TimeUnit.MILLISECONDS);
141bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay    }
142bbeba5265c5baa42c6db93fc8030c6055747da4dSteve McKay}
143