• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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