/**
 * 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 com.android.internal.telephony;

import com.android.internal.telephony.RetryManager;
import junit.framework.TestCase;
import android.test.suitebuilder.annotation.SmallTest;

public class TelephonyUtilsTest extends TestCase {

    /**
     * After first creating the RetryManager
     * isRetryNeeded should be false and the time 0
     */
    @SmallTest
    public void testRetryManagerEmpty() throws Exception {
        RetryManager rm = new RetryManager();

        assertEquals(0, rm.getRetryCount());
        assertFalse(rm.isRetryForever());
        assertFalse(rm.isRetryNeeded());
        assertEquals(0, rm.getRetryCount());
        assertEquals(0, rm.getRetryTimer());

        rm.increaseRetryCount();
        assertFalse(rm.isRetryForever());
        assertFalse(rm.isRetryNeeded());
        assertEquals(0, rm.getRetryCount());
        assertEquals(0, rm.getRetryTimer());

        rm.setRetryCount(123);
        assertFalse(rm.isRetryForever());
        assertFalse(rm.isRetryNeeded());
        assertEquals(0, rm.getRetryCount());
        assertEquals(0, rm.getRetryTimer());

        rm.retryForeverUsingLastTimeout();
        assertTrue(rm.isRetryForever());
        assertTrue(rm.isRetryNeeded());
        assertEquals(0, rm.getRetryCount());
        assertEquals(0, rm.getRetryTimer());

        rm.setRetryCount(2);
        assertTrue(rm.isRetryForever());
        assertTrue(rm.isRetryNeeded());
        assertEquals(0, rm.getRetryCount());
        assertEquals(0, rm.getRetryTimer());
    }

    /**
     * A simple test and that randomization is doing something.
     */
    @SmallTest
    public void testRetryManagerSimplest() throws Exception {
        RetryManager rm = new RetryManager();

        assertTrue(rm.configure(1, 500, 10));
        int loops = 10;
        int count = 0;
        for (int i = 0; i < loops; i++) {
            assertTrue(rm.isRetryNeeded());
            int time = rm.getRetryTimer();
            assertTrue((time >= 500) && (time < 600));
            if (time == 500) {
                count++;
            }
        }
        assertFalse(count == loops);
        rm.increaseRetryCount();
        assertFalse(rm.isRetryNeeded());
        rm.setRetryCount(0);
        assertTrue(rm.isRetryNeeded());
    }

    /**
     * Test multiple values using simple configuration.
     */
    @SmallTest
    public void testRetryManagerSimple() throws Exception {
        RetryManager rm = new RetryManager();

        assertTrue(rm.configure(3, 1000, 0));
        assertTrue(rm.isRetryNeeded());
        assertEquals(1000, rm.getRetryTimer());
        assertEquals(rm.getRetryTimer(), 1000);
        rm.increaseRetryCount();
        assertTrue(rm.isRetryNeeded());
        assertEquals(1000, rm.getRetryTimer());
        rm.increaseRetryCount();
        assertTrue(rm.isRetryNeeded());
        assertEquals(1000, rm.getRetryTimer());
        rm.increaseRetryCount();
        assertFalse(rm.isRetryNeeded());
        assertEquals(1000, rm.getRetryTimer());
    }

    /**
     * Test string configuration, simplest
     */
    @SmallTest
    public void testRetryManageSimpleString() throws Exception {
        RetryManager rm = new RetryManager();

        assertTrue(rm.configure("101"));
        assertTrue(rm.isRetryNeeded());
        assertEquals(101, rm.getRetryTimer());
        rm.increaseRetryCount();
        assertFalse(rm.isRetryNeeded());
    }

    /**
     * Test infinite retires
     */
    @SmallTest
    public void testRetryManageInfinite() throws Exception {
        RetryManager rm = new RetryManager();

        assertTrue(rm.configure("1000,2000,3000,max_retries=infinite"));
        assertTrue(rm.isRetryNeeded());
        assertEquals(1000, rm.getRetryTimer());
        rm.increaseRetryCount();
        assertTrue(rm.isRetryNeeded());
        assertEquals(2000, rm.getRetryTimer());
        rm.increaseRetryCount();
        assertTrue(rm.isRetryNeeded());
        // All others are 3000 and isRetryNeeded is always true
        for (int i=0; i < 100; i++) {
            assertEquals(3000, rm.getRetryTimer());
            rm.increaseRetryCount();
            assertTrue(rm.isRetryNeeded());
        }
    }

    /**
     * Test string configuration using all options and with quotes.
     */
    @SmallTest
    public void testRetryManageString() throws Exception {
        RetryManager rm = new RetryManager();
        int time;

        assertTrue(rm.configure(
                "\"max_retries=4, default_randomization=100,1000, 2000 :200 , 3000\""));
        assertTrue(rm.isRetryNeeded());
        time = rm.getRetryTimer();
        assertTrue((time >= 1000) && (time < 1100));

        rm.increaseRetryCount();
        assertTrue(rm.isRetryNeeded());
        time = rm.getRetryTimer();
        assertTrue((time >= 2000) && (time < 2200));

        rm.increaseRetryCount();
        assertTrue(rm.isRetryNeeded());
        time = rm.getRetryTimer();
        assertTrue((time >= 3000) && (time < 3100));

        rm.increaseRetryCount();
        assertTrue(rm.isRetryNeeded());
        time = rm.getRetryTimer();
        assertTrue((time >= 3000) && (time < 3100));

        rm.increaseRetryCount();
        assertFalse(rm.isRetryNeeded());
    }

    /**
     * Test string configuration using all options.
     */
    @SmallTest
    public void testRetryManageForever() throws Exception {
        RetryManager rm = new RetryManager();
        int time;

        assertTrue(rm.configure("1000, 2000, 3000"));
        assertTrue(rm.isRetryNeeded());
        assertFalse(rm.isRetryForever());
        assertEquals(0, rm.getRetryCount());
        assertEquals(1000, rm.getRetryTimer());

        rm.retryForeverUsingLastTimeout();
        rm.increaseRetryCount();
        rm.increaseRetryCount();
        rm.increaseRetryCount();
        assertTrue(rm.isRetryNeeded());
        assertTrue(rm.isRetryForever());
        assertEquals(3, rm.getRetryCount());
        assertEquals(3000, rm.getRetryTimer());

        rm.setRetryCount(1);
        assertTrue(rm.isRetryNeeded());
        assertTrue(rm.isRetryForever());
        assertEquals(1, rm.getRetryCount());
        assertEquals(2000, rm.getRetryTimer());

        rm.retryForeverUsingLastTimeout();
        assertTrue(rm.isRetryNeeded());
        assertTrue(rm.isRetryForever());
        rm.resetRetryCount();
        assertTrue(rm.isRetryNeeded());
        assertTrue(rm.isRetryForever());
        assertEquals(0, rm.getRetryCount());
        assertEquals(1000, rm.getRetryTimer());
    }
}
