/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.security.cts;

import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.test.AndroidTestCase;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.IOException;


public class SqliteJournalLeakTest extends AndroidTestCase {

    private static final int REPEAT = 5;

    private static final String[] DATABASES = {
        "/com.android.bluetooth/databases/btopp.db",
        "/com.android.browser/app_appcache/ApplicationCache.db",
        "/com.android.browser/app_databases/Databases.db",
        "/com.android.browser/app_geolocation/CachedGeoposition.db",
        "/com.android.browser/app_geolocation/GeolocationPermissions.db",
        "/com.android.browser/app_icons/WebpageIcons.db",
        "/com.android.browser/databases/browser.db",
        "/com.android.browser/databases/launcher.db",
        "/com.android.browser/databases/webview.db",
        "/com.android.browser/databases/webviewCache.db",
        "/com.android.email/databases/EmailProvider.db",
        "/com.android.email/databases/EmailProviderBody.db",
        "/com.android.email/databases/webview.db",
        "/com.android.email/databases/webviewCache.db",
        "/com.android.providers.calendar/databases/calendar.db",
        "/com.android.providers.contacts/databases/contacts2.db",
        "/com.android.providers.downloads/databases/downloads.db",
        "/com.android.providers.drm/databases/drm.db",
        "/com.android.providers.media/databases/internal.db",
        "/com.android.providers.settings/databases/settings.db",
        "/com.android.providers.tasks/databases/tasks.db",
        "/com.android.providers.telephony/optable.db",
        "/com.android.providers.telephony/databases/mmssms.db",
        "/com.android.providers.telephony/databases/nwk_info.db",
        "/com.android.providers.telephony/databases/telephony.db",
        "/com.android.providers.telephony/databases/tether_dun.db",
        "/com.android.providers.userdictionary/databases/user_dict.db",
        "/com.android.settings/databases/webview.db",
        "/com.android.settings/databases/webviewCache.db",
        "/com.android.vending/databases/billing4.db",
        "/com.android.vending/databases/market_assets.db",
        "/com.android.vending/databases/suggestions.db",
        "/com.android.vending/databases/webview.db",
        "/com.android.vending/databases/webviewCache.db"
    };

    /**
     * This method triggers activities that should cause database writes.
     * The goal of this is to try to make potentially short-lived journal
     * files show up.
     */
    private void doActivity() {
        Intent webIntent = new Intent(Intent.ACTION_VIEW);
        webIntent.setData(Uri.parse("http:///localhost"));
        webIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        getContext().startActivity(webIntent);
        Intent dictIntent = new Intent("android.settings.USER_DICTIONARY_SETTINGS");
        dictIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        getContext().startActivity(dictIntent);
    }

    private void checkDatabases(String suffix) {
        String msg = " is world readable. Please set its permissions to 600"
            + " by setting -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600 in external/sqlite/dist/"
            + "Android.mk; see CVE-2011-3901.";
        String base = Environment.getDataDirectory().getAbsolutePath();
        for(int i=REPEAT; i > 0; i--) {
            doActivity();
            for (String name : DATABASES) {
                name = base + "/data" + name + suffix;
                File f = new File(name);
                assertFalse(name + msg, f.canRead());
            }
        }
    }

    public void testJournal() {
        checkDatabases("-journal");
    }

    public void testWal() {
        checkDatabases("-wal");
    }

    public void testShm() {
        checkDatabases("-shm");
    }
}
