// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.media.router;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;

import org.chromium.base.BaseSwitches;
import org.chromium.base.CommandLine;
import org.chromium.base.SysUtils;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.Feature;

import java.util.ArrayList;
import java.util.List;

/**
 * Sink observation tests for ChromeMediaRouter.
 */
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class ChromeMediaRouterSinkObservationTest extends ChromeMediaRouterTestBase {
    @Test
    @Feature({"MediaRouter"})
    public void testRouterOnSinksReceived() {
        mChromeMediaRouter.onSinksReceived(SOURCE_ID1, mRouteProvider, new ArrayList<MediaSink>());

        assertEquals(1, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().size());
        assertEquals(
                1, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().get(SOURCE_ID1).size());
        assertEquals(0,
                mChromeMediaRouter.getSinksPerSourcePerProviderForTest()
                        .get(SOURCE_ID1)
                        .get(mRouteProvider)
                        .size());
        assertEquals(1, mChromeMediaRouter.getSinksPerSourceForTest().size());
        assertEquals(0, mChromeMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID1).size());
    }

    @Test
    @Feature({"MediaRouter"})
    public void testRouterOnSinksReceivedTwiceForOneSource() {
        mChromeMediaRouter.onSinksReceived(SOURCE_ID1, mRouteProvider, new ArrayList<MediaSink>());

        List<MediaSink> sinkList = new ArrayList<MediaSink>();
        MediaSink sink = new MediaSink(SINK_ID1, SINK_NAME1, null);
        sinkList.add(sink);
        mChromeMediaRouter.onSinksReceived(SOURCE_ID1, mRouteProvider, sinkList);

        assertEquals(1, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().size());
        assertEquals(
                1, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().get(SOURCE_ID1).size());
        assertEquals(1,
                mChromeMediaRouter.getSinksPerSourcePerProviderForTest()
                        .get(SOURCE_ID1)
                        .get(mRouteProvider)
                        .size());
        assertTrue(mChromeMediaRouter.getSinksPerSourcePerProviderForTest()
                           .get(SOURCE_ID1)
                           .get(mRouteProvider)
                           .contains(sink));

        assertEquals(1, mChromeMediaRouter.getSinksPerSourceForTest().size());
        assertEquals(1, mChromeMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID1).size());
        assertTrue(mChromeMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID1).contains(sink));
    }

    @Test
    @Feature({"MediaRouter"})
    public void testRouterOnSinksReceivedForTwoSources() {
        mChromeMediaRouter.onSinksReceived(SOURCE_ID1, mRouteProvider, new ArrayList<MediaSink>());

        List<MediaSink> sinkList = new ArrayList<MediaSink>();
        MediaSink sink = new MediaSink(SINK_ID1, SINK_NAME1, null);
        sinkList.add(sink);
        mChromeMediaRouter.onSinksReceived(SOURCE_ID2, mRouteProvider, sinkList);

        assertEquals(2, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().size());
        assertEquals(
                1, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().get(SOURCE_ID1).size());
        assertEquals(0,
                mChromeMediaRouter.getSinksPerSourcePerProviderForTest()
                        .get(SOURCE_ID1)
                        .get(mRouteProvider)
                        .size());
        assertEquals(
                1, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().get(SOURCE_ID2).size());
        assertEquals(1,
                mChromeMediaRouter.getSinksPerSourcePerProviderForTest()
                        .get(SOURCE_ID2)
                        .get(mRouteProvider)
                        .size());
        assertTrue(mChromeMediaRouter.getSinksPerSourcePerProviderForTest()
                           .get(SOURCE_ID2)
                           .get(mRouteProvider)
                           .contains(sink));
        assertEquals(2, mChromeMediaRouter.getSinksPerSourceForTest().size());
        assertEquals(0, mChromeMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID1).size());
        assertEquals(1, mChromeMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID2).size());
        assertTrue(mChromeMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID2).contains(sink));
    }

    @Test
    @Feature({"MediaRouter"})
    public void testNotLowRamDevice() throws Exception {
        SysUtils.resetForTesting();
        CommandLine.getInstance().appendSwitch(BaseSwitches.DISABLE_LOW_END_DEVICE_MODE);
        assertTrue(mChromeMediaRouter.startObservingMediaSinks(SOURCE_ID1));
    }

    @Test
    @Feature({"MediaRouter"})
    public void testIsLowRamDevice() throws Exception {
        SysUtils.resetForTesting();
        CommandLine.getInstance().appendSwitch(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE);
        assertEquals(false, mChromeMediaRouter.startObservingMediaSinks(SOURCE_ID1));
    }
}
