/*
 * Copyright (C) 2009 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.permission2.cts;

import android.content.Intent;
import android.content.pm.PackageManager;
import android.test.AndroidTestCase;

/**
 * Verify that applications can not send protected broadcasts.
 */
public class ProtectedBroadcastsTest extends AndroidTestCase {
    private static final String BROADCASTS[] = new String[] {
        Intent.ACTION_SCREEN_OFF,
        Intent.ACTION_SCREEN_ON,
        Intent.ACTION_USER_PRESENT,
        Intent.ACTION_TIME_TICK,
        Intent.ACTION_TIMEZONE_CHANGED,
        Intent.ACTION_BOOT_COMPLETED,
        Intent.ACTION_PACKAGE_INSTALL,
        Intent.ACTION_PACKAGE_ADDED,
        Intent.ACTION_PACKAGE_REPLACED,
        Intent.ACTION_PACKAGE_REMOVED,
        Intent.ACTION_PACKAGE_CHANGED,
        Intent.ACTION_PACKAGE_RESTARTED,
        Intent.ACTION_PACKAGE_DATA_CLEARED,
        Intent.ACTION_UID_REMOVED,
        Intent.ACTION_CONFIGURATION_CHANGED,
        Intent.ACTION_BATTERY_CHANGED,
        Intent.ACTION_BATTERY_LOW,
        Intent.ACTION_BATTERY_OKAY,
        Intent.ACTION_POWER_CONNECTED,
        Intent.ACTION_POWER_DISCONNECTED,
        Intent.ACTION_SHUTDOWN,
        Intent.ACTION_DEVICE_STORAGE_LOW,
        Intent.ACTION_DEVICE_STORAGE_OK,
        Intent.ACTION_REBOOT,
        "com.android.server.WifiManager.action.START_SCAN",
        "com.android.server.WifiManager.action.DELAYED_DRIVER_STOP",
        "android.net.wifi.WIFI_STATE_CHANGED",
        "android.net.wifi.WIFI_AP_STATE_CHANGED",
        "android.net.wifi.SCAN_RESULTS",
        "android.net.wifi.RSSI_CHANGED",
        "android.net.wifi.STATE_CHANGE",
        "android.net.wifi.LINK_CONFIGURATION_CHANGED",
        "android.net.wifi.CONFIGURED_NETWORKS_CHANGE",
        "android.net.wifi.supplicant.CONNECTION_CHANGE",
        "android.net.wifi.supplicant.STATE_CHANGE",
        "android.net.wifi.p2p.STATE_CHANGED",
        "android.net.wifi.p2p.DISCOVERY_STATE_CHANGE",
        "android.net.wifi.p2p.THIS_DEVICE_CHANGED",
        "android.net.wifi.p2p.PEERS_CHANGED",
        "android.net.wifi.p2p.CONNECTION_STATE_CHANGE",
        "android.net.wifi.p2p.PERSISTENT_GROUPS_CHANGED",
        "android.net.conn.TETHER_STATE_CHANGED",
        "android.net.conn.INET_CONDITION_ACTION",
        "android.net.conn.CAPTIVE_PORTAL_TEST_COMPLETED",
        "com.android.server.InputMethodManagerService.SHOW_INPUT_METHOD_PICKER"
    };

    private static final String BROADCASTS_TELEPHONY[] = new String[] {
        Intent.ACTION_NEW_OUTGOING_CALL,
        "android.intent.action.SERVICE_STATE",
        "android.intent.action.SIG_STR",
        "android.intent.action.RADIO_TECHNOLOGY",
        "android.intent.action.ANY_DATA_STATE",
        "android.intent.action.ACTION_MDN_STATE_CHANGED",
        "android.provider.Telephony.SPN_STRINGS_UPDATED",
        "android.intent.action.EMERGENCY_CALLBACK_MODE_CHANGED",
        "android.intent.action.SIM_STATE_CHANGED",
        "android.intent.action.DATA_CONNECTION_FAILED",
        "android.intent.action.NETWORK_SET_TIME",
        "android.intent.action.NETWORK_SET_TIMEZONE",
        "android.telephony.action.SUBSCRIPTION_CARRIER_IDENTITY_CHANGED",
        "android.telephony.action.SUBSCRIPTION_PRECISE_CARRIER_IDENTITY_CHANGED",
        "com.android.internal.intent.action.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS",
    };

    /**
     * Verify that protected broadcast actions can't be sent.
     */
    public void testSendProtectedBroadcasts() {
        for (String action : BROADCASTS) {
            try {
                Intent intent = new Intent(action);
                getContext().sendBroadcast(intent);
                fail("expected security exception broadcasting action: " + action);
            } catch (SecurityException expected) {
                assertNotNull("security exception's error message.", expected.getMessage());
            }
        }
    }

    public void testSendProtectedTelephonyBroadcasts() {
        if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
            return;
        }
        for (String action : BROADCASTS_TELEPHONY) {
            try {
                Intent intent = new Intent(action);
                getContext().sendBroadcast(intent);
                fail("expected security exception broadcasting telephony action: " + action);
            } catch (SecurityException expected) {
                assertNotNull("security exception's error message.", expected.getMessage());
            }
        }
    }
}
