AbstractPublicApiTest.java revision 5d217003acf21aea852975af0dff3b398cea6768
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.providers.downloads;
18
19import android.app.DownloadManager;
20import android.database.Cursor;
21import android.net.Uri;
22import android.os.ParcelFileDescriptor;
23import android.provider.Downloads;
24import android.util.Log;
25
26import java.io.FileInputStream;
27import java.io.InputStream;
28import java.net.MalformedURLException;
29
30/**
31 * Code common to tests that use the download manager public API.
32 */
33public abstract class AbstractPublicApiTest extends AbstractDownloadManagerFunctionalTest {
34
35    class Download {
36        final long mId;
37
38        private Download(long downloadId) {
39            this.mId = downloadId;
40        }
41
42        public int getStatus() {
43            return (int) getLongField(DownloadManager.COLUMN_STATUS);
44        }
45
46        public int getStatusIfExists() {
47            Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId));
48            try {
49                if (cursor.getCount() > 0) {
50                    cursor.moveToFirst();
51                    return (int) cursor.getLong(cursor.getColumnIndexOrThrow(
52                            DownloadManager.COLUMN_STATUS));
53                } else {
54                    // the row doesn't exist
55                    return -1;
56                }
57            } finally {
58                cursor.close();
59            }
60        }
61
62        String getStringField(String field) {
63            Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId));
64            try {
65                assertEquals(1, cursor.getCount());
66                cursor.moveToFirst();
67                return cursor.getString(cursor.getColumnIndexOrThrow(field));
68            } finally {
69                cursor.close();
70            }
71        }
72
73        long getLongField(String field) {
74            Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId));
75            try {
76                assertEquals(1, cursor.getCount());
77                cursor.moveToFirst();
78                return cursor.getLong(cursor.getColumnIndexOrThrow(field));
79            } finally {
80                cursor.close();
81            }
82        }
83
84        String getContents() throws Exception {
85            ParcelFileDescriptor downloadedFile = mManager.openDownloadedFile(mId);
86            assertTrue("Invalid file descriptor: " + downloadedFile,
87                       downloadedFile.getFileDescriptor().valid());
88            InputStream stream = new FileInputStream(downloadedFile.getFileDescriptor());
89            try {
90                return readStream(stream);
91            } finally {
92                stream.close();
93            }
94        }
95
96        void runUntilStatus(int status) throws Exception {
97            runService();
98            assertEquals(status, getStatus());
99        }
100
101        // max time to wait before giving up on the current download operation.
102        private static final int MAX_TIME_TO_WAIT_FOR_OPERATION = 5;
103        // while waiting for the above time period, sleep this long to yield to the
104        // download thread
105        private static final int TIME_TO_SLEEP = 1000;
106
107        int runUntilDone() throws InterruptedException {
108            int sleepCounter = MAX_TIME_TO_WAIT_FOR_OPERATION * 1000 / TIME_TO_SLEEP;
109            for (int i = 0; i < sleepCounter; i++) {
110                int status = getStatusIfExists();
111                if (status == -1 || Downloads.Impl.isStatusCompleted(getStatus())) {
112                    // row doesn't exist or the download is done
113                    return status;
114                }
115                // download not done yet. sleep a while and try again
116                Thread.sleep(TIME_TO_SLEEP);
117            }
118            return 0; // failed
119        }
120
121        // waits until progress_so_far is >= (progress)%
122        boolean runUntilProgress(int progress) throws InterruptedException {
123            int sleepCounter = MAX_TIME_TO_WAIT_FOR_OPERATION * 1000 / TIME_TO_SLEEP;
124            int numBytesReceivedSoFar = 0;
125            int totalBytes = 0;
126            for (int i = 0; i < sleepCounter; i++) {
127                Cursor cursor = mManager.query(new DownloadManager.Query().setFilterById(mId));
128                try {
129                    assertEquals(1, cursor.getCount());
130                    cursor.moveToFirst();
131                    numBytesReceivedSoFar = cursor.getInt(
132                            cursor.getColumnIndexOrThrow(
133                                    DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
134                    totalBytes = cursor.getInt(
135                            cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
136                } finally {
137                    cursor.close();
138                }
139                Log.i(LOG_TAG, "in runUntilProgress, numBytesReceivedSoFar: " +
140                        numBytesReceivedSoFar + ", totalBytes: " + totalBytes);
141                if (totalBytes == 0) {
142                    fail("total_bytes should not be zero");
143                    return false;
144                } else {
145                    if (numBytesReceivedSoFar * 100 / totalBytes >= progress) {
146                        // progress_so_far is >= progress%. we are done
147                        return true;
148                    }
149                }
150                // download not done yet. sleep a while and try again
151                Thread.sleep(TIME_TO_SLEEP);
152            }
153            Log.i(LOG_TAG, "FAILED in runUntilProgress, numBytesReceivedSoFar: " +
154                    numBytesReceivedSoFar + ", totalBytes: " + totalBytes);
155            return false; // failed
156        }
157    }
158
159    protected static final String PACKAGE_NAME = "my.package.name";
160    protected static final String REQUEST_PATH = "/path";
161
162    protected DownloadManager mManager;
163
164    public AbstractPublicApiTest(FakeSystemFacade systemFacade) {
165        super(systemFacade);
166    }
167
168    @Override
169    protected void setUp() throws Exception {
170        super.setUp();
171        mManager = new DownloadManager(mResolver, PACKAGE_NAME);
172    }
173
174    protected DownloadManager.Request getRequest() throws MalformedURLException {
175        return getRequest(getServerUri(REQUEST_PATH));
176    }
177
178    protected DownloadManager.Request getRequest(String path) {
179        return new DownloadManager.Request(Uri.parse(path));
180    }
181
182    protected Download enqueueRequest(DownloadManager.Request request) {
183        return new Download(mManager.enqueue(request));
184    }
185}
186