1 package org.robolectric.util;
2 
3 import static com.google.common.truth.Truth.assertThat;
4 import static com.google.common.truth.TruthJUnit.assume;
5 import static org.junit.Assert.assertThrows;
6 
7 import androidx.test.ext.junit.runners.AndroidJUnit4;
8 import org.junit.After;
9 import org.junit.Before;
10 import org.junit.Test;
11 import org.junit.runner.RunWith;
12 import org.robolectric.shadows.util.SQLiteLibraryLoader;
13 
14 @RunWith(AndroidJUnit4.class)
15 public class SQLiteLibraryLoaderTest {
16   private static final SQLiteLibraryLoader.LibraryNameMapper LINUX =
17       new LibraryMapperTest("lib", "so");
18   private static final SQLiteLibraryLoader.LibraryNameMapper WINDOWS =
19       new LibraryMapperTest("", "dll");
20   private static final SQLiteLibraryLoader.LibraryNameMapper MAC =
21       new LibraryMapperTest("lib", "dylib");
22   private static final String OS_NAME_WINDOWS_XP = "Windows XP";
23   private static final String OS_NAME_WINDOWS_7 = "Windows 7";
24   private static final String OS_NAME_WINDOWS_10 = "Windows 10";
25   private static final String OS_NAME_LINUX = "Some linux version";
26   private static final String OS_NAME_MAC = "Mac OS X";
27   private static final String OS_ARCH_ARM64 = "aarch64";
28   private static final String OS_ARCH_X86 = "x86";
29   private static final String OS_ARCH_X64 = "x86_64";
30   private static final String OS_ARCH_AMD64 = "amd64";
31   private static final String OS_ARCH_I386 = "i386";
32   private static final String SYSTEM_PROPERTY_OS_NAME = "os.name";
33   private static final String SYSTEM_PROPERTY_OS_ARCH = "os.arch";
34 
35   /** Saved system properties. */
36   private String savedOs, savedArch;
37 
38   private SQLiteLibraryLoader loader;
39 
40   @Before
setUp()41   public void setUp() {
42     loader = new SQLiteLibraryLoader();
43   }
44 
45   @Before
saveSystemProperties()46   public void saveSystemProperties() {
47     savedOs = System.getProperty(SYSTEM_PROPERTY_OS_NAME);
48     savedArch = System.getProperty(SYSTEM_PROPERTY_OS_ARCH);
49   }
50 
51   @After
restoreSystemProperties()52   public void restoreSystemProperties() {
53     System.setProperty(SYSTEM_PROPERTY_OS_NAME, savedOs);
54     System.setProperty(SYSTEM_PROPERTY_OS_ARCH, savedArch);
55   }
56 
57   @Test
shouldExtractNativeLibrary()58   public void shouldExtractNativeLibrary() {
59     assume().that(SQLiteLibraryLoader.isOsSupported()).isTrue();
60     assertThat(loader.isLoaded()).isFalse();
61     loader.doLoad();
62     assertThat(loader.isLoaded()).isTrue();
63   }
64 
65   @Test
shouldFindLibraryForWindowsXPX86()66   public void shouldFindLibraryForWindowsXPX86() {
67     assertThat(loadLibrary(new SQLiteLibraryLoader(WINDOWS), OS_NAME_WINDOWS_XP, OS_ARCH_X86))
68         .isEqualTo("sqlite4java/win32-x86/sqlite4java.dll");
69   }
70 
71   @Test
shouldFindLibraryForWindows7X86()72   public void shouldFindLibraryForWindows7X86() {
73     assertThat(loadLibrary(new SQLiteLibraryLoader(WINDOWS), OS_NAME_WINDOWS_7, OS_ARCH_X86))
74         .isEqualTo("sqlite4java/win32-x86/sqlite4java.dll");
75   }
76 
77   @Test
shouldFindLibraryForWindowsXPAmd64()78   public void shouldFindLibraryForWindowsXPAmd64() {
79     assertThat(loadLibrary(new SQLiteLibraryLoader(WINDOWS), OS_NAME_WINDOWS_XP, OS_ARCH_AMD64))
80         .isEqualTo("sqlite4java/win32-x64/sqlite4java.dll");
81   }
82 
83   @Test
shouldFindLibraryForWindows7Amd64()84   public void shouldFindLibraryForWindows7Amd64() {
85     assertThat(loadLibrary(new SQLiteLibraryLoader(WINDOWS), OS_NAME_WINDOWS_7, OS_ARCH_AMD64))
86         .isEqualTo("sqlite4java/win32-x64/sqlite4java.dll");
87   }
88 
89   @Test
shouldFindLibraryForWindows10Amd64()90   public void shouldFindLibraryForWindows10Amd64() {
91     assertThat(loadLibrary(new SQLiteLibraryLoader(WINDOWS), OS_NAME_WINDOWS_10, OS_ARCH_AMD64))
92         .isEqualTo("sqlite4java/win32-x64/sqlite4java.dll");
93   }
94 
95   @Test
shouldFindLibraryForLinuxI386()96   public void shouldFindLibraryForLinuxI386() {
97     assertThat(loadLibrary(new SQLiteLibraryLoader(LINUX), OS_NAME_LINUX, OS_ARCH_I386))
98         .isEqualTo("sqlite4java/linux-i386/libsqlite4java.so");
99   }
100 
101   @Test
shouldFindLibraryForLinuxX86()102   public void shouldFindLibraryForLinuxX86() {
103     assertThat(loadLibrary(new SQLiteLibraryLoader(LINUX), OS_NAME_LINUX, OS_ARCH_X86))
104         .isEqualTo("sqlite4java/linux-i386/libsqlite4java.so");
105   }
106 
107   @Test
shouldFindLibraryForLinuxAmd64()108   public void shouldFindLibraryForLinuxAmd64() {
109     assertThat(loadLibrary(new SQLiteLibraryLoader(LINUX), OS_NAME_LINUX, OS_ARCH_AMD64))
110         .isEqualTo("sqlite4java/linux-amd64/libsqlite4java.so");
111   }
112 
113   @Test
shouldFindLibraryForMacWithI386()114   public void shouldFindLibraryForMacWithI386() {
115     assertThat(loadLibrary(new SQLiteLibraryLoader(MAC), OS_NAME_MAC, OS_ARCH_I386))
116         .isEqualTo("sqlite4java/osx/libsqlite4java.dylib");
117   }
118 
119   @Test
shouldFindLibraryForMacWithX86()120   public void shouldFindLibraryForMacWithX86() {
121     assertThat(loadLibrary(new SQLiteLibraryLoader(MAC), OS_NAME_MAC, OS_ARCH_X86))
122         .isEqualTo("sqlite4java/osx/libsqlite4java.dylib");
123   }
124 
125   @Test
shouldFindLibraryForMacWithX64()126   public void shouldFindLibraryForMacWithX64() {
127     assertThat(loadLibrary(new SQLiteLibraryLoader(MAC), OS_NAME_MAC, OS_ARCH_X64))
128         .isEqualTo("sqlite4java/osx/libsqlite4java.dylib");
129   }
130 
131   @Test
shouldNotFindLibraryForMacWithARM64()132   public void shouldNotFindLibraryForMacWithARM64() {
133     assertThrows(
134         UnsupportedOperationException.class,
135         () -> loadLibrary(new SQLiteLibraryLoader(MAC), OS_NAME_MAC, OS_ARCH_ARM64));
136   }
137 
138   @Test
shouldThrowExceptionIfUnknownNameAndArch()139   public void shouldThrowExceptionIfUnknownNameAndArch() {
140     assertThrows(
141         UnsupportedOperationException.class,
142         () -> loadLibrary(new SQLiteLibraryLoader(LINUX), "ACME Electronic", "FooBar2000"));
143   }
144 
145   @Test
shouldNotSupportMacOSWithArchArm64()146   public void shouldNotSupportMacOSWithArchArm64() {
147     setNameAndArch(OS_NAME_MAC, OS_ARCH_ARM64);
148     assertThat(SQLiteLibraryLoader.isOsSupported()).isFalse();
149   }
150 
151   @Test
shouldSupportMacOSWithArchX86()152   public void shouldSupportMacOSWithArchX86() {
153     setNameAndArch(OS_NAME_MAC, OS_ARCH_X86);
154     assertThat(SQLiteLibraryLoader.isOsSupported()).isTrue();
155   }
156 
157   @Test
shouldSupportMacOSWithArchX64()158   public void shouldSupportMacOSWithArchX64() {
159     setNameAndArch(OS_NAME_MAC, OS_ARCH_X64);
160     assertThat(SQLiteLibraryLoader.isOsSupported()).isTrue();
161   }
162 
163   @Test
shouldSupportWindowsXPWithArchX86()164   public void shouldSupportWindowsXPWithArchX86() {
165     setNameAndArch(OS_NAME_WINDOWS_XP, OS_ARCH_X86);
166     assertThat(SQLiteLibraryLoader.isOsSupported()).isTrue();
167   }
168 
169   @Test
shouldSupportWindowsXPWithArcAMD64()170   public void shouldSupportWindowsXPWithArcAMD64() {
171     setNameAndArch(OS_NAME_WINDOWS_XP, OS_ARCH_AMD64);
172     assertThat(SQLiteLibraryLoader.isOsSupported()).isTrue();
173   }
174 
175   @Test
shouldSupportWindows7WithArchX86()176   public void shouldSupportWindows7WithArchX86() {
177     setNameAndArch(OS_NAME_WINDOWS_7, OS_ARCH_X86);
178     assertThat(SQLiteLibraryLoader.isOsSupported()).isTrue();
179   }
180 
181   @Test
shouldSupportWindows7WithAMD64()182   public void shouldSupportWindows7WithAMD64() {
183     setNameAndArch(OS_NAME_WINDOWS_7, OS_ARCH_AMD64);
184     assertThat(SQLiteLibraryLoader.isOsSupported()).isTrue();
185   }
186 
187   @Test
shouldSupportWindows10WithAMD64()188   public void shouldSupportWindows10WithAMD64() {
189     setNameAndArch(OS_NAME_WINDOWS_10, OS_ARCH_AMD64);
190     assertThat(SQLiteLibraryLoader.isOsSupported()).isTrue();
191   }
192 
193   @Test
shouldSupportLinuxWithI386()194   public void shouldSupportLinuxWithI386() {
195     setNameAndArch(OS_NAME_LINUX, OS_ARCH_I386);
196     assertThat(SQLiteLibraryLoader.isOsSupported()).isTrue();
197   }
198 
199   @Test
shouldSupportLinuxWithX86()200   public void shouldSupportLinuxWithX86() {
201     setNameAndArch(OS_NAME_LINUX, OS_ARCH_X86);
202     assertThat(SQLiteLibraryLoader.isOsSupported()).isTrue();
203   }
204 
205   @Test
shouldSupportLinuxWithX64()206   public void shouldSupportLinuxWithX64() {
207     setNameAndArch(OS_NAME_LINUX, OS_ARCH_X64);
208     assertThat(SQLiteLibraryLoader.isOsSupported()).isTrue();
209   }
210 
211   @Test
shouldSupportLinuxWithAMD64()212   public void shouldSupportLinuxWithAMD64() {
213     setNameAndArch(OS_NAME_LINUX, OS_ARCH_AMD64);
214     assertThat(SQLiteLibraryLoader.isOsSupported()).isTrue();
215   }
216 
loadLibrary(SQLiteLibraryLoader loader, String name, String arch)217   private String loadLibrary(SQLiteLibraryLoader loader, String name, String arch) {
218     setNameAndArch(name, arch);
219     return loader.getLibClasspathResourceName();
220   }
221 
222   private static class LibraryMapperTest implements SQLiteLibraryLoader.LibraryNameMapper {
223     private final String prefix;
224     private final String ext;
225 
LibraryMapperTest(String prefix, String ext)226     private LibraryMapperTest(String prefix, String ext) {
227       this.prefix = prefix;
228       this.ext = ext;
229     }
230 
231     @Override
mapLibraryName(String name)232     public String mapLibraryName(String name) {
233       return prefix + name + "." + ext;
234     }
235   }
236 
setNameAndArch(String name, String arch)237   private static void setNameAndArch(String name, String arch) {
238     System.setProperty(SYSTEM_PROPERTY_OS_NAME, name);
239     System.setProperty(SYSTEM_PROPERTY_OS_ARCH, arch);
240   }
241 }
242