182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori/*
282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Copyright (C) 2010 The Android Open Source Project
382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori *
482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Licensed under the Apache License, Version 2.0 (the "License");
582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * you may not use this file except in compliance with the License.
682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * You may obtain a copy of the License at
782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori *
882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori *      http://www.apache.org/licenses/LICENSE-2.0
982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori *
1082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Unless required by applicable law or agreed to in writing, software
1182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * distributed under the License is distributed on an "AS IS" BASIS,
1282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * See the License for the specific language governing permissions and
1482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * limitations under the License.
1582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */
1682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
1782e891b3259350a92b55969a6380ca1240ee0829Vasu Noripackage com.android.frameworks.downloadmanagertests;
1882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
1982e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.app.DownloadManager;
2082e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.app.DownloadManager.Query;
2182e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.content.BroadcastReceiver;
2282e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.content.Context;
2382e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.content.Intent;
2482e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.content.IntentFilter;
2582e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.database.Cursor;
2682e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.net.ConnectivityManager;
2782e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.net.NetworkInfo;
2882e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.net.wifi.WifiManager;
2982e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.os.Environment;
3082e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.os.ParcelFileDescriptor;
3182e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.os.SystemClock;
3282e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.provider.Settings;
3382e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.test.InstrumentationTestCase;
3482e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport android.util.Log;
3582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
3682e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport java.io.File;
3782e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport java.util.Collections;
3882e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport java.util.HashSet;
3982e891b3259350a92b55969a6380ca1240ee0829Vasu Noriimport java.util.Set;
40b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkeyimport java.util.concurrent.TimeoutException;
4182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
4282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori/**
4382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori * Base class for Instrumented tests for the Download Manager.
4482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori */
4582e891b3259350a92b55969a6380ca1240ee0829Vasu Noripublic class DownloadManagerBaseTest extends InstrumentationTestCase {
4682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
4782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected DownloadManager mDownloadManager = null;
4882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected String mFileType = "text/plain";
4982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected Context mContext = null;
5082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected MultipleDownloadsCompletedReceiver mReceiver = null;
5182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected static final int DEFAULT_FILE_SIZE = 10 * 1024;  // 10kb
5282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected static final int FILE_BLOCK_READ_SIZE = 1024 * 1024;
5382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
5482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected static final String LOG_TAG = "android.net.DownloadManagerBaseTest";
5582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected static final int HTTP_OK = 200;
5682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected static final int HTTP_REDIRECT = 307;
5782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected static final int HTTP_PARTIAL_CONTENT = 206;
5882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected static final int HTTP_NOT_FOUND = 404;
5982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected static final int HTTP_SERVICE_UNAVAILABLE = 503;
6082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
6182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected static final int DEFAULT_MAX_WAIT_TIME = 2 * 60 * 1000;  // 2 minutes
6282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected static final int DEFAULT_WAIT_POLL_TIME = 5 * 1000;  // 5 seconds
6382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
6482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected static final int WAIT_FOR_DOWNLOAD_POLL_TIME = 1 * 1000;  // 1 second
6582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected static final int MAX_WAIT_FOR_DOWNLOAD_TIME = 5 * 60 * 1000; // 5 minutes
6682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected static final int MAX_WAIT_FOR_LARGE_DOWNLOAD_TIME = 15 * 60 * 1000; // 15 minutes
6782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
6882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    public static class MultipleDownloadsCompletedReceiver extends BroadcastReceiver {
6982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        private volatile int mNumDownloadsCompleted = 0;
7082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        private Set<Long> downloadIds = Collections.synchronizedSet(new HashSet<Long>());
7182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
7282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        /**
7382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         * {@inheritDoc}
7482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         */
7582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        @Override
7682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        public void onReceive(Context context, Intent intent) {
7782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            if (intent.getAction().equalsIgnoreCase(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
7882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                synchronized(this) {
7982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    long id = intent.getExtras().getLong(DownloadManager.EXTRA_DOWNLOAD_ID);
8082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    Log.i(LOG_TAG, "Received Notification for download: " + id);
8182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    if (!downloadIds.contains(id)) {
8282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                        ++mNumDownloadsCompleted;
8382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                        Log.i(LOG_TAG, "MultipleDownloadsCompletedReceiver got intent: " +
8482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                                intent.getAction() + " --> total count: " + mNumDownloadsCompleted);
8582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                        downloadIds.add(id);
8682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
8782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                        DownloadManager dm = (DownloadManager)context.getSystemService(
8882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                                Context.DOWNLOAD_SERVICE);
8982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
9082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                        Cursor cursor = dm.query(new Query().setFilterById(id));
9182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                        try {
9282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                            if (cursor.moveToFirst()) {
9382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                                int status = cursor.getInt(cursor.getColumnIndex(
9482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                                        DownloadManager.COLUMN_STATUS));
9582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                                Log.i(LOG_TAG, "Download status is: " + status);
9682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                            } else {
9782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                                fail("No status found for completed download!");
9882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                            }
9982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                        } finally {
10082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                            cursor.close();
10182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                        }
10282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    } else {
10382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                        Log.i(LOG_TAG, "Notification for id: " + id + " has already been made.");
10482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    }
10582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                }
10682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            }
10782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
10882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
10982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        /**
11082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         * Gets the number of times the {@link #onReceive} callback has been called for the
111b14ad8cc8cb0ed774072b077694b21fd0a6f33beJeff Sharkey         * {@link DownloadManager#ACTION_DOWNLOAD_COMPLETE} action, indicating the number of
11282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         * downloads completed thus far.
11382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         *
11482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         * @return the number of downloads completed so far.
11582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         */
11682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        public int numDownloadsCompleted() {
11782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            return mNumDownloadsCompleted;
11882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
11982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
12082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        /**
12182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         * Gets the list of download IDs.
12282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         * @return A Set<Long> with the ids of the completed downloads.
12382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         */
12482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        public Set<Long> getDownloadIds() {
12582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            synchronized(this) {
12682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                Set<Long> returnIds = new HashSet<Long>(downloadIds);
12782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                return returnIds;
12882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            }
12982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
13082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
13182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
13282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
13382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    public static class WiFiChangedReceiver extends BroadcastReceiver {
13482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        private Context mContext = null;
13582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
13682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        /**
13782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         * Constructor
13882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         *
13982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         * Sets the current state of WiFi.
14082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         *
14182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         * @param context The current app {@link Context}.
14282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         */
14382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        public WiFiChangedReceiver(Context context) {
14482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            mContext = context;
14582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
14682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
14782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        /**
14882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         * {@inheritDoc}
14982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         */
15082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        @Override
15182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        public void onReceive(Context context, Intent intent) {
15282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            if (intent.getAction().equalsIgnoreCase(ConnectivityManager.CONNECTIVITY_ACTION)) {
15382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                Log.i(LOG_TAG, "ConnectivityManager state change: " + intent.getAction());
15482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                synchronized (this) {
15582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    this.notify();
15682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                }
15782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            }
15882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
15982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
16082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        /**
16182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         * Gets the current state of WiFi.
16282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         *
16382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         * @return Returns true if WiFi is on, false otherwise.
16482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori         */
16582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        public boolean getWiFiIsOn() {
16682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            ConnectivityManager connManager = (ConnectivityManager)mContext.getSystemService(
16782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    Context.CONNECTIVITY_SERVICE);
16882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            NetworkInfo info = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
16982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            Log.i(LOG_TAG, "WiFi Connection state is currently: " + info.isConnected());
17082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            return info.isConnected();
17182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
17282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
17382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
17482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
17582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * {@inheritDoc}
17682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
17782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    @Override
17882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    public void setUp() throws Exception {
17982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        mContext = getInstrumentation().getContext();
18082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        mDownloadManager = (DownloadManager)mContext.getSystemService(Context.DOWNLOAD_SERVICE);
18182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        mReceiver = registerNewMultipleDownloadsReceiver();
18282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
18382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
18482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
18582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Helper to verify the size of a file.
18682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
18782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param pfd The input file to compare the size of
18882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param size The expected size of the file
18982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
19082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected void verifyFileSize(ParcelFileDescriptor pfd, long size) {
19182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        assertEquals(pfd.getStatSize(), size);
19282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
19382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
19482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
19582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Helper to create and register a new MultipleDownloadCompletedReciever
19682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
19782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * This is used to track many simultaneous downloads by keeping count of all the downloads
19882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * that have completed.
19982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
20082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @return A new receiver that records and can be queried on how many downloads have completed.
20182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
20282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected MultipleDownloadsCompletedReceiver registerNewMultipleDownloadsReceiver() {
20382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        MultipleDownloadsCompletedReceiver receiver = new MultipleDownloadsCompletedReceiver();
20482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        mContext.registerReceiver(receiver, new IntentFilter(
20582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                DownloadManager.ACTION_DOWNLOAD_COMPLETE));
20682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        return receiver;
20782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
20882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
20982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
21082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Enables or disables WiFi.
21182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
21282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Note: Needs the following permissions:
21382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *  android.permission.ACCESS_WIFI_STATE
21482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *  android.permission.CHANGE_WIFI_STATE
21582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param enable true if it should be enabled, false if it should be disabled
21682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
21782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected void setWiFiStateOn(boolean enable) throws Exception {
21882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Log.i(LOG_TAG, "Setting WiFi State to: " + enable);
21982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        WifiManager manager = (WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);
22082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
22182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        manager.setWifiEnabled(enable);
22282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
22382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        String timeoutMessage = "Timed out waiting for Wifi to be "
22482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            + (enable ? "enabled!" : "disabled!");
22582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
22682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        WiFiChangedReceiver receiver = new WiFiChangedReceiver(mContext);
22782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        mContext.registerReceiver(receiver, new IntentFilter(
22882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                ConnectivityManager.CONNECTIVITY_ACTION));
22982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
23082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        synchronized (receiver) {
23182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            long timeoutTime = SystemClock.elapsedRealtime() + DEFAULT_MAX_WAIT_TIME;
23282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            boolean timedOut = false;
23382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
23482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            while (receiver.getWiFiIsOn() != enable && !timedOut) {
23582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                try {
23682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    receiver.wait(DEFAULT_WAIT_POLL_TIME);
23782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
23882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    if (SystemClock.elapsedRealtime() > timeoutTime) {
23982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                        timedOut = true;
24082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    }
24182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                }
24282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                catch (InterruptedException e) {
24382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    // ignore InterruptedExceptions
24482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                }
24582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            }
24682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            if (timedOut) {
24782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                fail(timeoutMessage);
24882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            }
24982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
25082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        assertEquals(enable, receiver.getWiFiIsOn());
25182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
25282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
25382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
25482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Helper to enables or disables airplane mode. If successful, it also broadcasts an intent
25582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * indicating that the mode has changed.
25682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
25782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Note: Needs the following permission:
25882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *  android.permission.WRITE_SETTINGS
25982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param enable true if airplane mode should be ON, false if it should be OFF
26082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
26182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected void setAirplaneModeOn(boolean enable) throws Exception {
26282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int state = enable ? 1 : 0;
26382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
26482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        // Change the system setting
26535fae68cc3eb21c15069c58d275a46537cc04f4aTsu Chiang Chuang        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON,
26682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                state);
26782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
26882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        String timeoutMessage = "Timed out waiting for airplane mode to be " +
26982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                (enable ? "enabled!" : "disabled!");
27082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
27182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        // wait for airplane mode to change state
27282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int currentWaitTime = 0;
27382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        while (Settings.System.getInt(mContext.getContentResolver(),
27435fae68cc3eb21c15069c58d275a46537cc04f4aTsu Chiang Chuang                Settings.Global.AIRPLANE_MODE_ON, -1) != state) {
27582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            timeoutWait(currentWaitTime, DEFAULT_WAIT_POLL_TIME, DEFAULT_MAX_WAIT_TIME,
27682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    timeoutMessage);
27782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
27882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
27982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        // Post the intent
28082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
28182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        intent.putExtra("state", true);
28282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        mContext.sendBroadcast(intent);
28382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
28482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
28582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
28682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Helper to wait for a particular download to finish, or else a timeout to occur
28782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
28882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Does not wait for a receiver notification of the download.
28982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
29082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param id The download id to query on (wait for)
29182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
292fbfe6d971d63860c02a71d69c3c7c29a2e958734Neal Nguyen    protected void waitForDownloadOrTimeout_skipNotification(long id) throws TimeoutException,
29382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            InterruptedException {
294fbfe6d971d63860c02a71d69c3c7c29a2e958734Neal Nguyen        doWaitForDownloadsOrTimeout(new Query().setFilterById(id),
295fbfe6d971d63860c02a71d69c3c7c29a2e958734Neal Nguyen                WAIT_FOR_DOWNLOAD_POLL_TIME, MAX_WAIT_FOR_DOWNLOAD_TIME);
29682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
29782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
29882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
29982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Helper to wait for a particular download to finish, or else a timeout to occur
30082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
30182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Also guarantees a notification has been posted for the download.
30282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
30382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param id The download id to query on (wait for)
30482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
30582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected void waitForDownloadOrTimeout(long id) throws TimeoutException,
30682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            InterruptedException {
307fbfe6d971d63860c02a71d69c3c7c29a2e958734Neal Nguyen        waitForDownloadOrTimeout(id, WAIT_FOR_DOWNLOAD_POLL_TIME, MAX_WAIT_FOR_DOWNLOAD_TIME);
30882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
30982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
31082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
31182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Helper to wait for a particular download to finish, or else a timeout to occur
31282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
31382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Also guarantees a notification has been posted for the download.
31482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
31582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param id The download id to query on (wait for)
31682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param poll The amount of time to wait
31782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param timeoutMillis The max time (in ms) to wait for the download(s) to complete
31882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
31982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected void waitForDownloadOrTimeout(long id, long poll, long timeoutMillis)
32082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            throws TimeoutException, InterruptedException {
32182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        doWaitForDownloadsOrTimeout(new Query().setFilterById(id), poll, timeoutMillis);
32282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        waitForReceiverNotifications(1);
32382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
32482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
32582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
32682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Helper to wait for all downloads to finish, or else a specified timeout to occur
32782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
32882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Makes no guaranee that notifications have been posted for all downloads.
32982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
33082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param poll The amount of time to wait
33182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param timeoutMillis The max time (in ms) to wait for the download(s) to complete
33282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
33382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected void waitForDownloadsOrTimeout(long poll, long timeoutMillis) throws TimeoutException,
33482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            InterruptedException {
33582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        doWaitForDownloadsOrTimeout(new Query(), poll, timeoutMillis);
33682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
33782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
33882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
33982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Helper to wait for all downloads to finish, or else a timeout to occur, but does not throw
34082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
34182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Also guarantees a notification has been posted for the download.
34282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
34382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param id The id of the download to query against
34482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param poll The amount of time to wait
34582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param timeoutMillis The max time (in ms) to wait for the download(s) to complete
34682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @return true if download completed successfully (didn't timeout), false otherwise
34782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
34882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    private boolean waitForDownloadOrTimeoutNoThrow(long id, long poll, long timeoutMillis) {
34982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        try {
35082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            doWaitForDownloadsOrTimeout(new Query().setFilterById(id), poll, timeoutMillis);
35182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            waitForReceiverNotifications(1);
35282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        } catch (TimeoutException e) {
35382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            return false;
35482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
35582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        return true;
35682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
35782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
35882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
35982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Helper function to synchronously wait, or timeout if the maximum threshold has been exceeded.
36082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
36182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param currentTotalWaitTime The total time waited so far
36282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param poll The amount of time to wait
36382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param maxTimeoutMillis The total wait time threshold; if we've waited more than this long,
36482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *          we timeout and fail
36582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param timedOutMessage The message to display in the failure message if we timeout
36682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @return The new total amount of time we've waited so far
36782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @throws TimeoutException if timed out waiting for SD card to mount
36882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
36982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    private int timeoutWait(int currentTotalWaitTime, long poll, long maxTimeoutMillis,
37082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            String timedOutMessage) throws TimeoutException {
37182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        long now = SystemClock.elapsedRealtime();
37282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        long end = now + poll;
37382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
37482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        // if we get InterruptedException's, ignore them and just keep sleeping
37582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        while (now < end) {
37682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            try {
37782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                Thread.sleep(end - now);
37882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            } catch (InterruptedException e) {
37982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                // ignore interrupted exceptions
38082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            }
38182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            now = SystemClock.elapsedRealtime();
38282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
38382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
38482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        currentTotalWaitTime += poll;
38582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        if (currentTotalWaitTime > maxTimeoutMillis) {
38682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            throw new TimeoutException(timedOutMessage);
38782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
38882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        return currentTotalWaitTime;
38982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
39082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
39182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
39282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Helper to wait for all downloads to finish, or else a timeout to occur
39382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
39482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param query The query to pass to the download manager
39582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param poll The poll time to wait between checks
39682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param timeoutMillis The max amount of time (in ms) to wait for the download(s) to complete
39782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
39882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    private void doWaitForDownloadsOrTimeout(Query query, long poll, long timeoutMillis)
39982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            throws TimeoutException {
40082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int currentWaitTime = 0;
40182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        while (true) {
40282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            query.setFilterByStatus(DownloadManager.STATUS_PENDING | DownloadManager.STATUS_PAUSED
40382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    | DownloadManager.STATUS_RUNNING);
40482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            Cursor cursor = mDownloadManager.query(query);
40582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
40682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            try {
40782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                if (cursor.getCount() == 0) {
40882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    Log.i(LOG_TAG, "All downloads should be done...");
40982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    break;
41082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                }
41182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                currentWaitTime = timeoutWait(currentWaitTime, poll, timeoutMillis,
41282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                        "Timed out waiting for all downloads to finish");
41382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            } finally {
41482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                cursor.close();
41582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            }
41682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
41782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
41882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
41982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
42082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Synchronously waits for external store to be mounted (eg: SD Card).
42182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
42282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @throws InterruptedException if interrupted
42382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @throws Exception if timed out waiting for SD card to mount
42482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
42582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected void waitForExternalStoreMount() throws Exception {
42682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        String extStorageState = Environment.getExternalStorageState();
42782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int currentWaitTime = 0;
42882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        while (!extStorageState.equals(Environment.MEDIA_MOUNTED)) {
42982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            Log.i(LOG_TAG, "Waiting for SD card...");
43082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            currentWaitTime = timeoutWait(currentWaitTime, DEFAULT_WAIT_POLL_TIME,
43182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    DEFAULT_MAX_WAIT_TIME, "Timed out waiting for SD Card to be ready!");
43282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            extStorageState = Environment.getExternalStorageState();
43382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
43482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
43582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
43682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
43782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Synchronously waits for a download to start.
43882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
43982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param dlRequest the download request id used by Download Manager to track the download.
44082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @throws Exception if timed out while waiting for SD card to mount
44182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
44282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected void waitForDownloadToStart(long dlRequest) throws Exception {
44382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Cursor cursor = getCursor(dlRequest);
44482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        try {
44582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
44682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            int value = cursor.getInt(columnIndex);
44782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            int currentWaitTime = 0;
44882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
44982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            while (value != DownloadManager.STATUS_RUNNING &&
45082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    (value != DownloadManager.STATUS_FAILED) &&
45182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    (value != DownloadManager.STATUS_SUCCESSFUL)) {
45282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                Log.i(LOG_TAG, "Waiting for download to start...");
45382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                currentWaitTime = timeoutWait(currentWaitTime, WAIT_FOR_DOWNLOAD_POLL_TIME,
45482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                        MAX_WAIT_FOR_DOWNLOAD_TIME, "Timed out waiting for download to start!");
45582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                cursor.requery();
45682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                assertTrue(cursor.moveToFirst());
45782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
45882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                value = cursor.getInt(columnIndex);
45982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            }
46082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            assertFalse("Download failed immediately after start",
46182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    value == DownloadManager.STATUS_FAILED);
46282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        } finally {
46382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            cursor.close();
46482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
46582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
46682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
46782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
46882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Synchronously waits for our receiver to receive notification for a given number of
46982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * downloads.
47082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
47182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param targetNumber The number of notifications for unique downloads to wait for; pass in
47282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *         -1 to not wait for notification.
47382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @throws Exception if timed out while waiting
47482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
47582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    private void waitForReceiverNotifications(int targetNumber) throws TimeoutException {
47682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int count = mReceiver.numDownloadsCompleted();
47782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int currentWaitTime = 0;
47882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
47982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        while (count < targetNumber) {
48082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            Log.i(LOG_TAG, "Waiting for notification of downloads...");
48182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            currentWaitTime = timeoutWait(currentWaitTime, WAIT_FOR_DOWNLOAD_POLL_TIME,
48282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    MAX_WAIT_FOR_DOWNLOAD_TIME, "Timed out waiting for download notifications!"
48382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    + " Received " + count + "notifications.");
48482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            count = mReceiver.numDownloadsCompleted();
48582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
48682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
48782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
48882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
48982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Synchronously waits for a file to increase in size (such as to monitor that a download is
49082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * progressing).
49182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
49282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param file The file whose size to track.
49382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @throws Exception if timed out while waiting for the file to grow in size.
49482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
49582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected void waitForFileToGrow(File file) throws Exception {
49682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int currentWaitTime = 0;
49782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
49882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        // File may not even exist yet, so wait until it does (or we timeout)
49982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        while (!file.exists()) {
50082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            Log.i(LOG_TAG, "Waiting for file to exist...");
50182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            currentWaitTime = timeoutWait(currentWaitTime, WAIT_FOR_DOWNLOAD_POLL_TIME,
50282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    MAX_WAIT_FOR_DOWNLOAD_TIME, "Timed out waiting for file to be created.");
50382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
50482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
50582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        // Get original file size...
50682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        long originalSize = file.length();
50782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
50882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        while (file.length() <= originalSize) {
50982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            Log.i(LOG_TAG, "Waiting for file to be written to...");
51082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            currentWaitTime = timeoutWait(currentWaitTime, WAIT_FOR_DOWNLOAD_POLL_TIME,
51182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    MAX_WAIT_FOR_DOWNLOAD_TIME, "Timed out waiting for file to be written to.");
51282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
51382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
51482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
51582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
51682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Helper to remove all downloads that are registered with the DL Manager.
51782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
51882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Note: This gives us a clean slate b/c it includes downloads that are pending, running,
51982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * paused, or have completed.
52082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
52182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected void removeAllCurrentDownloads() {
52282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Log.i(LOG_TAG, "Removing all current registered downloads...");
52382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Cursor cursor = mDownloadManager.query(new Query());
52482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        try {
52582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            if (cursor.moveToFirst()) {
52682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                do {
52782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    int index = cursor.getColumnIndex(DownloadManager.COLUMN_ID);
52882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    long downloadId = cursor.getLong(index);
52982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
53082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    mDownloadManager.remove(downloadId);
53182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                } while (cursor.moveToNext());
53282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            }
53382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        } finally {
53482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            cursor.close();
53582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
53682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
53782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
53882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
53982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Helper to verify an int value in a Cursor
54082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
54182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param cursor The cursor containing the query results
54282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param columnName The name of the column to query
54382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param expected The expected int value
54482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
54582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    private void verifyInt(Cursor cursor, String columnName, int expected) {
54682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int index = cursor.getColumnIndex(columnName);
54782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int actual = cursor.getInt(index);
54882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        assertEquals(expected, actual);
54982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
55082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
55182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    /**
55282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * Performs a query based on ID and returns a Cursor for the query.
55382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     *
55482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @param id The id of the download in DL Manager; pass -1 to query all downloads
55582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     * @return A cursor for the query results
55682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori     */
55782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    protected Cursor getCursor(long id) throws Exception {
55882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Query query = new Query();
55982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        if (id != -1) {
56082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            query.setFilterById(id);
56182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
56282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
56382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        Cursor cursor = mDownloadManager.query(query);
56482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        int currentWaitTime = 0;
56582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori
56682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        try {
56782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            while (!cursor.moveToFirst()) {
56882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                Thread.sleep(DEFAULT_WAIT_POLL_TIME);
56982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                currentWaitTime += DEFAULT_WAIT_POLL_TIME;
57082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                if (currentWaitTime > DEFAULT_MAX_WAIT_TIME) {
57182e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                    fail("timed out waiting for a non-null query result");
57282e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                }
57382e891b3259350a92b55969a6380ca1240ee0829Vasu Nori                cursor.requery();
57482e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            }
57582e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        } catch (Exception e) {
57682e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            cursor.close();
57782e891b3259350a92b55969a6380ca1240ee0829Vasu Nori            throw e;
57882e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        }
57982e891b3259350a92b55969a6380ca1240ee0829Vasu Nori        return cursor;
58082e891b3259350a92b55969a6380ca1240ee0829Vasu Nori    }
581fbfe6d971d63860c02a71d69c3c7c29a2e958734Neal Nguyen}
582