1 package org.robolectric.versioning; 2 3 import static com.google.common.truth.Truth.assertThat; 4 5 import java.lang.reflect.Field; 6 import java.util.Arrays; 7 import org.junit.Test; 8 import org.junit.runner.RunWith; 9 import org.junit.runners.JUnit4; 10 import org.robolectric.versioning.AndroidVersions.AndroidRelease; 11 import org.robolectric.versioning.AndroidVersions.SdkInformation; 12 13 /** Test more esoteric versions mismatches in sdkInt numbers, and codenames. */ 14 @RunWith(JUnit4.class) 15 public final class AndroidVersionsEdgeCaseTest { 16 forceWarningMode(boolean warnMode)17 private void forceWarningMode(boolean warnMode) { 18 try { 19 Field field = AndroidVersions.class.getDeclaredField("warnOnly"); 20 field.setAccessible(true); 21 field.set(null, warnMode); 22 } catch (NoSuchFieldException | IllegalAccessException ex) { 23 throw new RuntimeException("Could not update warnOnly field", ex); 24 } 25 } 26 27 /** 28 * sdkInt higher than any known release, claims it's released. Expects an error message to update 29 * to update the AndroidVersions.class 30 */ 31 @Test sdkIntHigherThanKnownReleasesClaimsIsReleased_throwsException()32 public void sdkIntHigherThanKnownReleasesClaimsIsReleased_throwsException() { 33 AndroidRelease earliestUnrelease = null; 34 try { 35 forceWarningMode(false); 36 SdkInformation information = AndroidVersions.gatherStaticSdkInformationFromThisClass(); 37 earliestUnrelease = information.earliestUnreleased; 38 information.computeCurrentSdk( 39 earliestUnrelease.getSdkInt(), earliestUnrelease.getVersion(), "REL", Arrays.asList()); 40 assertThat(this).isNull(); 41 } catch (RuntimeException e) { 42 assertThat(e) 43 .hasMessageThat() 44 .contains( 45 "The current sdk " 46 + earliestUnrelease.getShortCode() 47 + " has been released. Please update the contents of " 48 + AndroidVersions.class.getName() 49 + " to mark sdk " 50 + earliestUnrelease.getShortCode() 51 + " as released."); 52 assertThat(e).isInstanceOf(RuntimeException.class); 53 } 54 } 55 56 /** 57 * sdkInt lower than known release, claims it's released. Expects an error message to update the 58 * jar. 59 */ 60 @Test sdkIntReleasedButStillReportsCodeName_throwsException()61 public void sdkIntReleasedButStillReportsCodeName_throwsException() { 62 AndroidRelease latestRelease = null; 63 try { 64 forceWarningMode(false); 65 SdkInformation information = AndroidVersions.gatherStaticSdkInformationFromThisClass(); 66 latestRelease = information.latestRelease; 67 information.computeCurrentSdk( 68 latestRelease.getSdkInt(), 69 null, 70 information.latestRelease.getShortCode(), 71 Arrays.asList(latestRelease.getShortCode())); 72 assertThat(this).isNull(); 73 } catch (RuntimeException e) { 74 assertThat(e) 75 .hasMessageThat() 76 .contains( 77 "The current sdk " 78 + latestRelease.getShortCode() 79 + " has been been marked as released. Please update the contents of current sdk" 80 + " jar to the released version."); 81 assertThat(e).isInstanceOf(RuntimeException.class); 82 } 83 } 84 85 @Test sdkIntReleasedButStillReportsCodeName_warningMode()86 public void sdkIntReleasedButStillReportsCodeName_warningMode() { 87 AndroidRelease latestRelease = null; 88 try { 89 forceWarningMode(true); 90 SdkInformation information = AndroidVersions.gatherStaticSdkInformationFromThisClass(); 91 latestRelease = information.latestRelease; 92 information.computeCurrentSdk( 93 latestRelease.getSdkInt(), 94 null, 95 information.latestRelease.getShortCode(), 96 Arrays.asList(latestRelease.getShortCode())); 97 } catch (Throwable t) { 98 assertThat(t).isNull(); 99 } 100 } 101 102 @Test unknownSdkInt_warningMode()103 public void unknownSdkInt_warningMode() { 104 try { 105 forceWarningMode(true); 106 SdkInformation information = AndroidVersions.gatherStaticSdkInformationFromThisClass(); 107 AndroidRelease found = 108 information.computeCurrentSdk( 109 35, "zzzz", "Z", Arrays.asList("wwww", "xxxx", "yyyy", "zzzz")); 110 assertThat(found.getSdkInt()).isEqualTo(10000); 111 } catch (Throwable t) { 112 assertThat(t).isNull(); 113 } 114 } 115 } 116