Commit 5f6c907c by olly Committed by Oliver Woodman

Reset DefaultBandwidthMeter on network type change

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=219454931
parent 7d99794b
...@@ -65,6 +65,14 @@ public class SlidingPercentile { ...@@ -65,6 +65,14 @@ public class SlidingPercentile {
currentSortOrder = SORT_ORDER_NONE; currentSortOrder = SORT_ORDER_NONE;
} }
/** Resets the sliding percentile. */
public void reset() {
samples.clear();
currentSortOrder = SORT_ORDER_NONE;
nextSampleIndex = 0;
totalWeight = 0;
}
/** /**
* Adds a new weighted value. * Adds a new weighted value.
* *
......
...@@ -1652,7 +1652,7 @@ public final class Util { ...@@ -1652,7 +1652,7 @@ public final class Util {
return getMobileNetworkType(networkInfo); return getMobileNetworkType(networkInfo);
case ConnectivityManager.TYPE_ETHERNET: case ConnectivityManager.TYPE_ETHERNET:
return C.NETWORK_TYPE_ETHERNET; return C.NETWORK_TYPE_ETHERNET;
default: // Ethernet, VPN, Bluetooth, Dummy. default: // VPN, Bluetooth, Dummy.
return C.NETWORK_TYPE_OTHER; return C.NETWORK_TYPE_OTHER;
} }
} }
......
...@@ -15,15 +15,18 @@ ...@@ -15,15 +15,18 @@
*/ */
package com.google.android.exoplayer2.upstream; package com.google.android.exoplayer2.upstream;
import static android.Manifest.permission.ACCESS_NETWORK_STATE;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import android.content.Context; import android.content.Context;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.NetworkInfo.DetailedState; import android.net.NetworkInfo.DetailedState;
import android.net.Uri;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.testutil.FakeClock;
import com.google.android.exoplayer2.testutil.FakeDataSource;
import java.util.Random;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
...@@ -36,6 +39,7 @@ import org.robolectric.shadows.ShadowNetworkInfo; ...@@ -36,6 +39,7 @@ import org.robolectric.shadows.ShadowNetworkInfo;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public final class DefaultBandwidthMeterTest { public final class DefaultBandwidthMeterTest {
private static final int SIMULATED_TRANSFER_COUNT = 100;
private static final String FAST_COUNTRY_ISO = "EE"; private static final String FAST_COUNTRY_ISO = "EE";
private static final String SLOW_COUNTRY_ISO = "PG"; private static final String SLOW_COUNTRY_ISO = "PG";
...@@ -496,6 +500,44 @@ public final class DefaultBandwidthMeterTest { ...@@ -496,6 +500,44 @@ public final class DefaultBandwidthMeterTest {
} }
@Test @Test
public void networkTypeOverride_updatesBitrateEstimate() {
setActiveNetworkInfo(networkInfoEthernet);
DefaultBandwidthMeter bandwidthMeter =
new DefaultBandwidthMeter.Builder(RuntimeEnvironment.application).build();
long initialEstimateEthernet = bandwidthMeter.getBitrateEstimate();
bandwidthMeter.setNetworkTypeOverride(C.NETWORK_TYPE_2G);
long initialEstimate2g = bandwidthMeter.getBitrateEstimate();
assertThat(initialEstimateEthernet).isGreaterThan(initialEstimate2g);
}
@Test
public void networkTypeOverride_doesFullReset() {
// Simulate transfers for an ethernet connection.
setActiveNetworkInfo(networkInfoEthernet);
FakeClock clock = new FakeClock(/* initialTimeMs= */ 0);
DefaultBandwidthMeter bandwidthMeter =
new DefaultBandwidthMeter.Builder(RuntimeEnvironment.application).setClock(clock).build();
long[] bitrateEstimatesWithNewInstance = simulateTransfers(bandwidthMeter, clock);
// Create a new instance and seed with some transfers.
setActiveNetworkInfo(networkInfo2g);
bandwidthMeter =
new DefaultBandwidthMeter.Builder(RuntimeEnvironment.application).setClock(clock).build();
simulateTransfers(bandwidthMeter, clock);
// Override the network type to ethernet and simulate transfers again.
bandwidthMeter.setNetworkTypeOverride(C.NETWORK_TYPE_ETHERNET);
long[] bitrateEstimatesAfterReset = simulateTransfers(bandwidthMeter, clock);
// If overriding the network type fully reset the bandwidth meter, we expect the bitrate
// estimates generated during simulation to be the same.
assertThat(bitrateEstimatesAfterReset).isEqualTo(bitrateEstimatesWithNewInstance);
}
@Test
@SuppressWarnings("deprecation")
public void defaultInitialBitrateEstimate_withoutContext_isReasonable() { public void defaultInitialBitrateEstimate_withoutContext_isReasonable() {
DefaultBandwidthMeter bandwidthMeterWithBuilder = DefaultBandwidthMeter bandwidthMeterWithBuilder =
new DefaultBandwidthMeter.Builder(/* context= */ null).build(); new DefaultBandwidthMeter.Builder(/* context= */ null).build();
...@@ -510,17 +552,6 @@ public final class DefaultBandwidthMeterTest { ...@@ -510,17 +552,6 @@ public final class DefaultBandwidthMeterTest {
assertThat(initialEstimateWithoutBuilder).isLessThan(50_000_000L); assertThat(initialEstimateWithoutBuilder).isLessThan(50_000_000L);
} }
@Test
public void defaultInitialBitrateEstimate_withoutAccessNetworkStatePermission_isReasonable() {
Shadows.shadowOf(RuntimeEnvironment.application).denyPermissions(ACCESS_NETWORK_STATE);
DefaultBandwidthMeter bandwidthMeter =
new DefaultBandwidthMeter.Builder(RuntimeEnvironment.application).build();
long initialEstimate = bandwidthMeter.getBitrateEstimate();
assertThat(initialEstimate).isGreaterThan(100_000L);
assertThat(initialEstimate).isLessThan(50_000_000L);
}
private void setActiveNetworkInfo(NetworkInfo networkInfo) { private void setActiveNetworkInfo(NetworkInfo networkInfo) {
Shadows.shadowOf(connectivityManager).setActiveNetworkInfo(networkInfo); Shadows.shadowOf(connectivityManager).setActiveNetworkInfo(networkInfo);
} }
...@@ -528,4 +559,23 @@ public final class DefaultBandwidthMeterTest { ...@@ -528,4 +559,23 @@ public final class DefaultBandwidthMeterTest {
private void setNetworkCountryIso(String countryIso) { private void setNetworkCountryIso(String countryIso) {
Shadows.shadowOf(telephonyManager).setNetworkCountryIso(countryIso); Shadows.shadowOf(telephonyManager).setNetworkCountryIso(countryIso);
} }
private static long[] simulateTransfers(DefaultBandwidthMeter bandwidthMeter, FakeClock clock) {
long[] bitrateEstimates = new long[SIMULATED_TRANSFER_COUNT];
Random random = new Random(/* seed= */ 0);
DataSource dataSource = new FakeDataSource();
DataSpec dataSpec = new DataSpec(Uri.parse("https://dummy.com"));
for (int i = 0; i < SIMULATED_TRANSFER_COUNT; i++) {
bandwidthMeter.onTransferStart(dataSource, dataSpec, /* isNetwork= */ true);
clock.advanceTime(random.nextInt(/* bound= */ 5000));
bandwidthMeter.onBytesTransferred(
dataSource,
dataSpec,
/* isNetwork= */ true,
/* bytes= */ random.nextInt(5 * 1024 * 1024));
bandwidthMeter.onTransferEnd(dataSource, dataSpec, /* isNetwork= */ true);
bitrateEstimates[i] = bandwidthMeter.getBitrateEstimate();
}
return bitrateEstimates;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment