1 // Copyright 2017 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.net; 6 7 import static com.google.common.truth.Truth.assertThat; 8 9 import static org.junit.Assert.assertThrows; 10 11 import static org.chromium.net.CronetProvider.PROVIDER_NAME_APP_PACKAGED; 12 import static org.chromium.net.CronetProvider.PROVIDER_NAME_FALLBACK; 13 14 import android.content.Context; 15 16 import androidx.test.ext.junit.runners.AndroidJUnit4; 17 import androidx.test.filters.SmallTest; 18 19 import com.google.common.truth.Correspondence; 20 21 import org.junit.Rule; 22 import org.junit.Test; 23 import org.junit.runner.RunWith; 24 25 import org.chromium.base.test.util.Batch; 26 import org.chromium.net.CronetTestRule.CronetImplementation; 27 import org.chromium.net.CronetTestRule.IgnoreFor; 28 29 import java.util.ArrayList; 30 import java.util.Arrays; 31 import java.util.List; 32 33 /** Tests {@link CronetEngine.Builder}. */ 34 @RunWith(AndroidJUnit4.class) 35 @IgnoreFor( 36 implementations = {CronetImplementation.FALLBACK}, 37 reason = "These tests don't depend on Cronet's impl") 38 @Batch(Batch.UNIT_TESTS) 39 public class CronetEngineBuilderTest { 40 @Rule public final CronetTestRule mTestRule = CronetTestRule.withManualEngineStartup(); 41 42 /** Tests the comparison of two strings that contain versions. */ 43 @Test 44 @SmallTest testVersionComparison()45 public void testVersionComparison() { 46 assertVersionIsHigher("22.44", "22.43.12"); 47 assertVersionIsLower("22.43.12", "022.124"); 48 assertVersionIsLower("22.99", "22.100"); 49 assertVersionIsHigher("22.100", "22.99"); 50 assertVersionIsEqual("11.2.33", "11.2.33"); 51 assertIllegalArgumentException(null, "1.2.3"); 52 assertIllegalArgumentException("1.2.3", null); 53 assertIllegalArgumentException("1.2.3", "1.2.3x"); 54 } 55 56 /** 57 * Tests the correct ordering of the providers. The platform provider should be the last in the 58 * list. Other providers should be ordered by placing providers with the higher version first. 59 */ 60 @Test 61 @SmallTest testProviderOrdering()62 public void testProviderOrdering() { 63 final CronetProvider[] availableProviders = 64 new CronetProvider[] { 65 new FakeProvider( 66 mTestRule.getTestFramework().getContext(), 67 PROVIDER_NAME_APP_PACKAGED, 68 "99.77", 69 true), 70 new FakeProvider( 71 mTestRule.getTestFramework().getContext(), 72 PROVIDER_NAME_FALLBACK, 73 "99.99", 74 true), 75 new FakeProvider( 76 mTestRule.getTestFramework().getContext(), 77 "Some other provider", 78 "99.88", 79 true), 80 }; 81 82 ArrayList<CronetProvider> providers = new ArrayList<>(Arrays.asList(availableProviders)); 83 List<CronetProvider> orderedProviders = 84 CronetEngine.Builder.getEnabledCronetProviders( 85 mTestRule.getTestFramework().getContext(), providers); 86 87 // Check the result 88 assertThat(orderedProviders) 89 .containsExactly( 90 availableProviders[2], availableProviders[0], availableProviders[1]) 91 .inOrder(); 92 } 93 94 /** 95 * Tests that the providers that are disabled are not included in the list of available 96 * providers when the provider is selected by the default selection logic. 97 */ 98 @Test 99 @SmallTest testThatDisabledProvidersAreExcluded()100 public void testThatDisabledProvidersAreExcluded() { 101 final CronetProvider[] availableProviders = 102 new CronetProvider[] { 103 new FakeProvider( 104 mTestRule.getTestFramework().getContext(), 105 PROVIDER_NAME_FALLBACK, 106 "99.99", 107 true), 108 new FakeProvider( 109 mTestRule.getTestFramework().getContext(), 110 PROVIDER_NAME_APP_PACKAGED, 111 "99.77", 112 true), 113 new FakeProvider( 114 mTestRule.getTestFramework().getContext(), 115 "Some other provider", 116 "99.88", 117 false), 118 }; 119 120 ArrayList<CronetProvider> providers = new ArrayList<>(Arrays.asList(availableProviders)); 121 List<CronetProvider> orderedProviders = 122 CronetEngine.Builder.getEnabledCronetProviders( 123 mTestRule.getTestFramework().getContext(), providers); 124 125 Correspondence<CronetProvider, String> providerName = 126 Correspondence.transforming( 127 provider -> provider.getName(), "The name of the provider"); 128 129 assertThat(orderedProviders) 130 .comparingElementsUsing(providerName) 131 .containsExactly(PROVIDER_NAME_APP_PACKAGED, PROVIDER_NAME_FALLBACK) 132 .inOrder(); 133 } 134 assertVersionIsHigher(String s1, String s2)135 private void assertVersionIsHigher(String s1, String s2) { 136 assertThat(CronetEngine.Builder.compareVersions(s1, s2)).isEqualTo(1); 137 } 138 assertVersionIsLower(String s1, String s2)139 private void assertVersionIsLower(String s1, String s2) { 140 assertThat(CronetEngine.Builder.compareVersions(s1, s2)).isEqualTo(-1); 141 } 142 assertVersionIsEqual(String s1, String s2)143 private void assertVersionIsEqual(String s1, String s2) { 144 assertThat(CronetEngine.Builder.compareVersions(s1, s2)).isEqualTo(0); 145 } 146 assertIllegalArgumentException(String s1, String s2)147 private void assertIllegalArgumentException(String s1, String s2) { 148 assertThrows( 149 IllegalArgumentException.class, () -> CronetEngine.Builder.compareVersions(s1, s2)); 150 } 151 152 // TODO(kapishnikov): Replace with a mock when mockito is supported. 153 private static class FakeProvider extends CronetProvider { 154 private final String mName; 155 private final String mVersion; 156 private final boolean mEnabled; 157 FakeProvider(Context context, String name, String version, boolean enabled)158 protected FakeProvider(Context context, String name, String version, boolean enabled) { 159 super(context); 160 mName = name; 161 mVersion = version; 162 mEnabled = enabled; 163 } 164 165 @Override createBuilder()166 public CronetEngine.Builder createBuilder() { 167 return new CronetEngine.Builder((ICronetEngineBuilder) null); 168 } 169 170 @Override getName()171 public String getName() { 172 return mName; 173 } 174 175 @Override getVersion()176 public String getVersion() { 177 return mVersion; 178 } 179 180 @Override isEnabled()181 public boolean isEnabled() { 182 return mEnabled; 183 } 184 185 @Override toString()186 public String toString() { 187 return mName; 188 } 189 } 190 } 191