/*
 *  Copyright 2020 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

package org.webrtc;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;

import android.support.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;
import org.webrtc.RtpParameters.DegradationPreference;

/** Unit-tests for {@link RtpSender}. */
public class RtpSenderTest {
  private PeerConnectionFactory factory;
  private PeerConnection pc;

  @Before
  public void setUp() {
    PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions
                                         .builder(InstrumentationRegistry.getTargetContext())
                                         .setNativeLibraryName(TestConstants.NATIVE_LIBRARY)
                                         .createInitializationOptions());

    factory = PeerConnectionFactory.builder().createPeerConnectionFactory();

    PeerConnection.RTCConfiguration config = new PeerConnection.RTCConfiguration(Arrays.asList());
    // RtpTranceiver is part of new unified plan semantics.
    config.sdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLAN;
    pc = factory.createPeerConnection(config, mock(PeerConnection.Observer.class));
  }

  /** Test checking the enum values for DegradationPreference stay consistent */
  @Test
  @SmallTest
  public void testSetDegradationPreference() throws Exception {
    RtpTransceiver transceiver = pc.addTransceiver(MediaStreamTrack.MediaType.MEDIA_TYPE_VIDEO);
    RtpSender sender = transceiver.getSender();

    RtpParameters parameters = sender.getParameters();
    assertNotNull(parameters);
    assertNull(parameters.degradationPreference);

    parameters.degradationPreference = DegradationPreference.MAINTAIN_FRAMERATE;
    assertTrue(sender.setParameters(parameters));
    parameters = sender.getParameters();
    assertEquals(DegradationPreference.MAINTAIN_FRAMERATE, parameters.degradationPreference);

    parameters.degradationPreference = DegradationPreference.MAINTAIN_RESOLUTION;
    assertTrue(sender.setParameters(parameters));
    parameters = sender.getParameters();
    assertEquals(DegradationPreference.MAINTAIN_RESOLUTION, parameters.degradationPreference);

    parameters.degradationPreference = DegradationPreference.BALANCED;
    assertTrue(sender.setParameters(parameters));
    parameters = sender.getParameters();
    assertEquals(DegradationPreference.BALANCED, parameters.degradationPreference);

    parameters.degradationPreference = DegradationPreference.DISABLED;
    assertTrue(sender.setParameters(parameters));
    parameters = sender.getParameters();
    assertEquals(DegradationPreference.DISABLED, parameters.degradationPreference);
  }
}
