]>
Commit | Line | Data |
---|---|---|
7c673cae | 1 | // Copyright (c) 2014, Facebook, Inc. All rights reserved. |
11fdf7f2 TL |
2 | // This source code is licensed under both the GPLv2 (found in the |
3 | // COPYING file in the root directory) and Apache 2.0 License | |
4 | // (found in the LICENSE.Apache file in the root directory). | |
7c673cae FG |
5 | package org.rocksdb.util; |
6 | ||
7 | import org.junit.AfterClass; | |
8 | import org.junit.BeforeClass; | |
9 | import org.junit.Test; | |
10 | ||
11 | import java.lang.reflect.Field; | |
12 | import java.lang.reflect.Modifier; | |
13 | ||
14 | import static org.assertj.core.api.Assertions.assertThat; | |
15 | ||
16 | public class EnvironmentTest { | |
17 | private final static String ARCH_FIELD_NAME = "ARCH"; | |
18 | private final static String OS_FIELD_NAME = "OS"; | |
19 | ||
20 | private static String INITIAL_OS; | |
21 | private static String INITIAL_ARCH; | |
22 | ||
23 | @BeforeClass | |
24 | public static void saveState() { | |
25 | INITIAL_ARCH = getEnvironmentClassField(ARCH_FIELD_NAME); | |
26 | INITIAL_OS = getEnvironmentClassField(OS_FIELD_NAME); | |
27 | } | |
28 | ||
29 | @Test | |
30 | public void mac32() { | |
31 | setEnvironmentClassFields("mac", "32"); | |
32 | assertThat(Environment.isWindows()).isFalse(); | |
33 | assertThat(Environment.getJniLibraryExtension()). | |
34 | isEqualTo(".jnilib"); | |
35 | assertThat(Environment.getJniLibraryFileName("rocksdb")). | |
36 | isEqualTo("librocksdbjni-osx.jnilib"); | |
37 | assertThat(Environment.getSharedLibraryFileName("rocksdb")). | |
38 | isEqualTo("librocksdbjni.dylib"); | |
39 | } | |
40 | ||
41 | @Test | |
42 | public void mac64() { | |
43 | setEnvironmentClassFields("mac", "64"); | |
44 | assertThat(Environment.isWindows()).isFalse(); | |
45 | assertThat(Environment.getJniLibraryExtension()). | |
46 | isEqualTo(".jnilib"); | |
47 | assertThat(Environment.getJniLibraryFileName("rocksdb")). | |
48 | isEqualTo("librocksdbjni-osx.jnilib"); | |
49 | assertThat(Environment.getSharedLibraryFileName("rocksdb")). | |
50 | isEqualTo("librocksdbjni.dylib"); | |
51 | } | |
52 | ||
53 | @Test | |
54 | public void nix32() { | |
55 | // Linux | |
56 | setEnvironmentClassFields("Linux", "32"); | |
57 | assertThat(Environment.isWindows()).isFalse(); | |
58 | assertThat(Environment.getJniLibraryExtension()). | |
59 | isEqualTo(".so"); | |
60 | assertThat(Environment.getJniLibraryFileName("rocksdb")). | |
61 | isEqualTo("librocksdbjni-linux32.so"); | |
62 | assertThat(Environment.getSharedLibraryFileName("rocksdb")). | |
63 | isEqualTo("librocksdbjni.so"); | |
64 | // UNIX | |
65 | setEnvironmentClassFields("Unix", "32"); | |
66 | assertThat(Environment.isWindows()).isFalse(); | |
67 | assertThat(Environment.getJniLibraryExtension()). | |
68 | isEqualTo(".so"); | |
69 | assertThat(Environment.getJniLibraryFileName("rocksdb")). | |
70 | isEqualTo("librocksdbjni-linux32.so"); | |
71 | assertThat(Environment.getSharedLibraryFileName("rocksdb")). | |
72 | isEqualTo("librocksdbjni.so"); | |
73 | } | |
74 | ||
75 | @Test(expected = UnsupportedOperationException.class) | |
76 | public void aix32() { | |
77 | // AIX | |
78 | setEnvironmentClassFields("aix", "32"); | |
79 | assertThat(Environment.isWindows()).isFalse(); | |
80 | assertThat(Environment.getJniLibraryExtension()). | |
81 | isEqualTo(".so"); | |
82 | Environment.getJniLibraryFileName("rocksdb"); | |
83 | } | |
84 | ||
85 | @Test | |
86 | public void nix64() { | |
87 | setEnvironmentClassFields("Linux", "x64"); | |
88 | assertThat(Environment.isWindows()).isFalse(); | |
89 | assertThat(Environment.getJniLibraryExtension()). | |
90 | isEqualTo(".so"); | |
91 | assertThat(Environment.getJniLibraryFileName("rocksdb")). | |
92 | isEqualTo("librocksdbjni-linux64.so"); | |
93 | assertThat(Environment.getSharedLibraryFileName("rocksdb")). | |
94 | isEqualTo("librocksdbjni.so"); | |
95 | // UNIX | |
96 | setEnvironmentClassFields("Unix", "x64"); | |
97 | assertThat(Environment.isWindows()).isFalse(); | |
98 | assertThat(Environment.getJniLibraryExtension()). | |
99 | isEqualTo(".so"); | |
100 | assertThat(Environment.getJniLibraryFileName("rocksdb")). | |
101 | isEqualTo("librocksdbjni-linux64.so"); | |
102 | assertThat(Environment.getSharedLibraryFileName("rocksdb")). | |
103 | isEqualTo("librocksdbjni.so"); | |
104 | // AIX | |
105 | setEnvironmentClassFields("aix", "x64"); | |
106 | assertThat(Environment.isWindows()).isFalse(); | |
107 | assertThat(Environment.getJniLibraryExtension()). | |
108 | isEqualTo(".so"); | |
109 | assertThat(Environment.getJniLibraryFileName("rocksdb")). | |
110 | isEqualTo("librocksdbjni-aix64.so"); | |
111 | assertThat(Environment.getSharedLibraryFileName("rocksdb")). | |
112 | isEqualTo("librocksdbjni.so"); | |
113 | } | |
114 | ||
115 | @Test | |
116 | public void detectWindows(){ | |
117 | setEnvironmentClassFields("win", "x64"); | |
118 | assertThat(Environment.isWindows()).isTrue(); | |
119 | } | |
120 | ||
121 | @Test | |
122 | public void win64() { | |
123 | setEnvironmentClassFields("win", "x64"); | |
124 | assertThat(Environment.isWindows()).isTrue(); | |
125 | assertThat(Environment.getJniLibraryExtension()). | |
126 | isEqualTo(".dll"); | |
127 | assertThat(Environment.getJniLibraryFileName("rocksdb")). | |
128 | isEqualTo("librocksdbjni-win64.dll"); | |
129 | assertThat(Environment.getSharedLibraryFileName("rocksdb")). | |
130 | isEqualTo("librocksdbjni.dll"); | |
131 | } | |
132 | ||
133 | private void setEnvironmentClassFields(String osName, | |
134 | String osArch) { | |
135 | setEnvironmentClassField(OS_FIELD_NAME, osName); | |
136 | setEnvironmentClassField(ARCH_FIELD_NAME, osArch); | |
137 | } | |
138 | ||
139 | @AfterClass | |
140 | public static void restoreState() { | |
141 | setEnvironmentClassField(OS_FIELD_NAME, INITIAL_OS); | |
142 | setEnvironmentClassField(ARCH_FIELD_NAME, INITIAL_ARCH); | |
143 | } | |
144 | ||
145 | private static String getEnvironmentClassField(String fieldName) { | |
146 | final Field field; | |
147 | try { | |
148 | field = Environment.class.getDeclaredField(fieldName); | |
149 | field.setAccessible(true); | |
150 | final Field modifiersField = Field.class.getDeclaredField("modifiers"); | |
151 | modifiersField.setAccessible(true); | |
152 | modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); | |
153 | return (String)field.get(null); | |
154 | } catch (NoSuchFieldException | IllegalAccessException e) { | |
155 | throw new RuntimeException(e); | |
156 | } | |
157 | } | |
158 | ||
159 | private static void setEnvironmentClassField(String fieldName, String value) { | |
160 | final Field field; | |
161 | try { | |
162 | field = Environment.class.getDeclaredField(fieldName); | |
163 | field.setAccessible(true); | |
164 | final Field modifiersField = Field.class.getDeclaredField("modifiers"); | |
165 | modifiersField.setAccessible(true); | |
166 | modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); | |
167 | field.set(null, value); | |
168 | } catch (NoSuchFieldException | IllegalAccessException e) { | |
169 | throw new RuntimeException(e); | |
170 | } | |
171 | } | |
172 | } |