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