/*
 * Copyright (C) 2016 Google Inc.
 *
 * 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 com.android.carrierdefaultapp;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.Rlog;
import android.telephony.TelephonyManager;
import android.test.InstrumentationTestCase;

import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

public class CarrierDefaultReceiverTest extends InstrumentationTestCase {
    @Mock
    private NotificationManager mNotificationMgr;
    @Mock
    private TelephonyManager mTelephonyMgr;
    @Mock
    private CarrierConfigManager mCarrierConfigMgr;
    @Captor
    private ArgumentCaptor<Integer> mInt;
    @Captor
    private ArgumentCaptor<Notification> mNotification;
    @Captor
    private ArgumentCaptor<String> mString;
    private TestContext mContext;
    private CarrierDefaultBroadcastReceiver mReceiver;
    private static String TAG;

    private static final String PORTAL_NOTIFICATION_TAG = "CarrierDefault.Portal.Notification";
    private static final int PORTAL_NOTIFICATION_ID = 0;
    private static int subId = 0;

    @Before
    public void setUp() throws Exception {
        super.setUp();
        TAG = this.getClass().getSimpleName();
        MockitoAnnotations.initMocks(this);
        mContext = new TestContext(getInstrumentation().getTargetContext());
        mContext.injectSystemService(NotificationManager.class, mNotificationMgr);
        mContext.injectSystemService(TelephonyManager.class, mTelephonyMgr);
        mContext.injectSystemService(CarrierConfigManager.class, mCarrierConfigMgr);

        mReceiver = new CarrierDefaultBroadcastReceiver();
    }

    @After
    public void tearDown() throws Exception {
        super.tearDown();
    }

    @Test
    public void testOnReceiveRedirection() {
        // carrier action idx list includes 4(portal notification) & 1(disable metered APNs)
        // upon redirection signal
        PersistableBundle b = new PersistableBundle();
        b.putStringArray(CarrierConfigManager
                .KEY_CARRIER_DEFAULT_ACTIONS_ON_REDIRECTION_STRING_ARRAY, new String[]{"4,1"});
        doReturn(b).when(mCarrierConfigMgr).getConfig();

        Intent intent = new Intent(TelephonyIntents.ACTION_CARRIER_SIGNAL_REDIRECTED);
        intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId);
        Rlog.d(TAG, "OnReceive redirection intent");
        mReceiver.onReceive(mContext, intent);

        mContext.waitForMs(100);

        Rlog.d(TAG, "verify carrier action: showPortalNotification");
        verify(mNotificationMgr, times(1)).notify(mString.capture(), mInt.capture(),
                mNotification.capture());
        assertEquals(PORTAL_NOTIFICATION_ID, (int) mInt.getValue());
        assertEquals(PORTAL_NOTIFICATION_TAG, mString.getValue());
        PendingIntent pendingIntent = mNotification.getValue().contentIntent;
        assertNotNull(pendingIntent);

        Rlog.d(TAG, "verify carrier action: disable all metered apns");
        verify(mTelephonyMgr).carrierActionSetMeteredApnsEnabled(eq(subId), eq(false));
    }
}
