OLD | NEW |
---|---|
(Empty) | |
1 #!/usr/bin/python | |
Mark Mentovai
2012/02/14 20:00:38
The same comment as in the previous file applies.
| |
2 # | |
3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
4 # Use of this source code is governed by a BSD-style license that can be | |
5 # found in the LICENSE file. | |
6 | |
7 """Tests for jni_generator.py. | |
8 | |
9 This test suite contains various tests for the JNI generator. | |
10 It exercises the low-level parser all the way up to the | |
11 code generator and ensures the output matches a golden | |
12 file. | |
13 """ | |
14 | |
15 import difflib | |
16 import os | |
17 import sys | |
18 import unittest | |
19 import jni_generator | |
20 from jni_generator import CalledByNative, NativeMethod, Param | |
21 | |
22 | |
23 class TestGenerator(unittest.TestCase): | |
24 def assertObjEquals(self, first, second): | |
25 dict_first = first.__dict__ | |
26 dict_second = second.__dict__ | |
27 self.assertEquals(dict_first.keys(), dict_second.keys()) | |
28 for key, value in dict_first.iteritems(): | |
29 if (type(value) is list and len(value) and | |
30 isinstance(type(value[0]), object)): | |
31 self.assertListEquals(value, second.__getattribute__(key)) | |
32 else: | |
33 self.assertEquals(value, second.__getattribute__(key)) | |
34 | |
35 def assertListEquals(self, first, second): | |
36 self.assertEquals(len(first), len(second)) | |
37 for i in xrange(len(first)): | |
38 if isinstance(first[i], object): | |
39 self.assertObjEquals(first[i], second[i]) | |
40 else: | |
41 self.assertEquals(first[i], second[i]) | |
42 | |
43 def assertTextEquals(self, golden_text, generated_text): | |
44 stripped_golden = [l.strip() for l in golden_text.split('\n')] | |
45 stripped_generated = [l.strip() for l in generated_text.split('\n')] | |
46 if stripped_golden != stripped_generated: | |
47 print self.id() | |
48 for line in difflib.context_diff(stripped_golden, stripped_generated): | |
49 print line | |
50 self.fail('Golden text mismatch') | |
51 | |
52 def testNatives(self): | |
53 test_data = """" | |
54 private native int nativeInit(); | |
55 private native void nativeDestroy(int nativeChromeBrowserProvider); | |
56 private native long nativeAddBookmark( | |
57 int nativeChromeBrowserProvider, | |
58 String url, String title, boolean isFolder, long parentId); | |
59 private static native String nativeGetDomainAndRegistry(String url); | |
60 private static native void nativeCreateHistoricalTabFromState(byte[] state, int tab_index); | |
61 private native byte[] nativeGetStateAsByteArray(ChromeView view); | |
62 private static native String[] nativeGetAutofillProfileGUIDs(); | |
63 private native void nativeSetRecognitionResults(int sessionId, String[] resu lts); | |
64 private native long nativeAddBookmarkFromAPI(int nativeChromeBrowserProvider , | |
65 String url, Long created, Boolean isBookmark, | |
66 Long date, byte[] favicon, String title, Integer visits); | |
67 native int nativeFindAll(String find); | |
68 private static native BookmarkNode nativeGetDefaultBookmarkFolder(); | |
69 private native SQLiteCursor nativeQueryBookmarkFromAPI(int nativeChromeBrows erProvider, | |
70 String[] projection, String selection, | |
71 String[] selectionArgs, String sortOrder); | |
72 private native void nativeGotOrientation(int nativePtr /* device_orientation ::DeviceOrientationAndroid */, | |
73 double alpha, double beta, double gamma); | |
74 """ | |
75 natives = jni_generator.ExtractNatives(test_data) | |
76 golden_natives = [ | |
77 NativeMethod(return_type='int', static=False, | |
78 name='Init', | |
79 params=[], | |
80 java_class_name='', | |
81 type='function'), | |
82 NativeMethod(return_type='void', static=False, name='Destroy', | |
83 params=[Param(datatype='int', | |
84 name='nativeChromeBrowserProvider')], | |
85 java_class_name='', | |
86 type='method', | |
87 p0_type='ChromeBrowserProvider'), | |
88 NativeMethod(return_type='long', static=False, name='AddBookmark', | |
89 params=[Param(datatype='int', | |
90 name='nativeChromeBrowserProvider'), | |
91 Param(datatype='String', | |
92 name='url'), | |
93 Param(datatype='String', | |
94 name='title'), | |
95 Param(datatype='boolean', | |
96 name='isFolder'), | |
97 Param(datatype='long', | |
98 name='parentId')], | |
99 java_class_name='', | |
100 type='method', | |
101 p0_type='ChromeBrowserProvider'), | |
102 NativeMethod(return_type='String', static=True, | |
103 name='GetDomainAndRegistry', | |
104 params=[Param(datatype='String', | |
105 name='url')], | |
106 java_class_name='', | |
107 type='function'), | |
108 NativeMethod(return_type='void', static=True, | |
109 name='CreateHistoricalTabFromState', | |
110 params=[Param(datatype='byte[]', | |
111 name='state'), | |
112 Param(datatype='int', | |
113 name='tab_index')], | |
114 java_class_name='', | |
115 type='function'), | |
116 NativeMethod(return_type='byte[]', static=False, | |
117 name='GetStateAsByteArray', | |
118 params=[Param(datatype='ChromeView', name='view')], | |
119 java_class_name='', | |
120 type='function'), | |
121 NativeMethod(return_type='String[]', static=True, | |
122 name='GetAutofillProfileGUIDs', params=[], | |
123 java_class_name='', | |
124 type='function'), | |
125 NativeMethod(return_type='void', static=False, | |
126 name='SetRecognitionResults', | |
127 params=[Param(datatype='int', name='sessionId'), | |
128 Param(datatype='String[]', name='results')], | |
129 java_class_name='', | |
130 type='function'), | |
131 NativeMethod(return_type='long', static=False, | |
132 name='AddBookmarkFromAPI', | |
133 params=[Param(datatype='int', | |
134 name='nativeChromeBrowserProvider'), | |
135 Param(datatype='String', | |
136 name='url'), | |
137 Param(datatype='Long', | |
138 name='created'), | |
139 Param(datatype='Boolean', | |
140 name='isBookmark'), | |
141 Param(datatype='Long', | |
142 name='date'), | |
143 Param(datatype='byte[]', | |
144 name='favicon'), | |
145 Param(datatype='String', | |
146 name='title'), | |
147 Param(datatype='Integer', | |
148 name='visits')], | |
149 java_class_name='', | |
150 type='method', | |
151 p0_type='ChromeBrowserProvider'), | |
152 NativeMethod(return_type='int', static=False, | |
153 name='FindAll', | |
154 params=[Param(datatype='String', | |
155 name='find')], | |
156 java_class_name='', | |
157 type='function'), | |
158 NativeMethod(return_type='BookmarkNode', static=True, | |
159 name='GetDefaultBookmarkFolder', | |
160 params=[], | |
161 java_class_name='', | |
162 type='function'), | |
163 NativeMethod(return_type='SQLiteCursor', | |
164 static=False, | |
165 name='QueryBookmarkFromAPI', | |
166 params=[Param(datatype='int', | |
167 name='nativeChromeBrowserProvider'), | |
168 Param(datatype='String[]', | |
169 name='projection'), | |
170 Param(datatype='String', | |
171 name='selection'), | |
172 Param(datatype='String[]', | |
173 name='selectionArgs'), | |
174 Param(datatype='String', | |
175 name='sortOrder'), | |
176 ], | |
177 java_class_name='', | |
178 type='method', | |
179 p0_type='ChromeBrowserProvider'), | |
180 NativeMethod(return_type='void', static=False, | |
181 name='GotOrientation', | |
182 params=[Param(datatype='int', | |
183 cpp_class_name='device_orientation::DeviceOri entationAndroid', | |
184 name='nativePtr'), | |
185 Param(datatype='double', | |
186 name='alpha'), | |
187 Param(datatype='double', | |
188 name='beta'), | |
189 Param(datatype='double', | |
190 name='gamma'), | |
191 ], | |
192 java_class_name='', | |
193 type='method', | |
194 p0_type='device_orientation::DeviceOrientationAndroid'), | |
195 ] | |
196 self.assertListEquals(golden_natives, natives) | |
197 h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni', | |
198 natives, []) | |
199 golden_content = """\ | |
200 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
201 // Use of this source code is governed by a BSD-style license that can be | |
202 // found in the LICENSE file. | |
203 | |
204 | |
205 // This file is autogenerated by base/android/jni_generator/jni_generator_tests. py | |
206 // For org/chromium/TestJni | |
207 | |
208 #ifndef org_chromium_TestJni_JNI | |
209 #define org_chromium_TestJni_JNI | |
210 | |
211 #include <jni.h> | |
212 | |
213 #include "base/android/jni_android.h" | |
214 #include "base/android/scoped_java_ref.h" | |
215 #include "base/basictypes.h" | |
216 #include "base/logging.h" | |
217 | |
218 using base::android::ScopedJavaLocalRef; | |
219 | |
220 // Step 1: forward declarations. | |
221 namespace { | |
222 const char* const kTestJniClassPath = "org/chromium/TestJni"; | |
223 // Leaking this JavaRef as we cannot use LazyInstance from some threads. | |
224 base::android::ScopedJavaGlobalRef<jclass>& | |
225 g_TestJni_clazz = *(new base::android::ScopedJavaGlobalRef<jclass>()); | |
226 } // namespace | |
227 | |
228 static jint Init(JNIEnv* env, jobject obj); | |
229 | |
230 | |
231 static jstring GetDomainAndRegistry(JNIEnv* env, jclass clazz, | |
232 jstring url); | |
233 | |
234 | |
235 static void CreateHistoricalTabFromState(JNIEnv* env, jclass clazz, | |
236 jbyteArray state, | |
237 jint tab_index); | |
238 | |
239 | |
240 static jbyteArray GetStateAsByteArray(JNIEnv* env, jobject obj, | |
241 jobject view); | |
242 | |
243 | |
244 static jobjectArray GetAutofillProfileGUIDs(JNIEnv* env, jclass clazz); | |
245 | |
246 | |
247 static void SetRecognitionResults(JNIEnv* env, jobject obj, | |
248 jint sessionId, | |
249 jobjectArray results); | |
250 | |
251 | |
252 static jint FindAll(JNIEnv* env, jobject obj, | |
253 jstring find); | |
254 | |
255 | |
256 static jobject GetDefaultBookmarkFolder(JNIEnv* env, jclass clazz); | |
257 | |
258 | |
259 // Step 2: method stubs. | |
260 static void Destroy(JNIEnv* env, jobject obj, | |
261 jint nativeChromeBrowserProvider) { | |
262 DCHECK(nativeChromeBrowserProvider) << "Destroy"; | |
263 ChromeBrowserProvider* native = reinterpret_cast<ChromeBrowserProvider*>(nativ eChromeBrowserProvider); | |
264 return native->Destroy(env, obj); | |
265 } | |
266 | |
267 static jlong AddBookmark(JNIEnv* env, jobject obj, | |
268 jint nativeChromeBrowserProvider, | |
269 jstring url, | |
270 jstring title, | |
271 jboolean isFolder, | |
272 jlong parentId) { | |
273 DCHECK(nativeChromeBrowserProvider) << "AddBookmark"; | |
274 ChromeBrowserProvider* native = reinterpret_cast<ChromeBrowserProvider*>(nativ eChromeBrowserProvider); | |
275 return native->AddBookmark(env, obj, url, title, isFolder, parentId); | |
276 } | |
277 | |
278 static jlong AddBookmarkFromAPI(JNIEnv* env, jobject obj, | |
279 jint nativeChromeBrowserProvider, | |
280 jstring url, | |
281 jobject created, | |
282 jobject isBookmark, | |
283 jobject date, | |
284 jbyteArray favicon, | |
285 jstring title, | |
286 jobject visits) { | |
287 DCHECK(nativeChromeBrowserProvider) << "AddBookmarkFromAPI"; | |
288 ChromeBrowserProvider* native = reinterpret_cast<ChromeBrowserProvider*>(nativ eChromeBrowserProvider); | |
289 return native->AddBookmarkFromAPI(env, obj, url, created, isBookmark, date, fa vicon, title, visits); | |
290 } | |
291 | |
292 static jobject QueryBookmarkFromAPI(JNIEnv* env, jobject obj, | |
293 jint nativeChromeBrowserProvider, | |
294 jobjectArray projection, | |
295 jstring selection, | |
296 jobjectArray selectionArgs, | |
297 jstring sortOrder) { | |
298 DCHECK(nativeChromeBrowserProvider) << "QueryBookmarkFromAPI"; | |
299 ChromeBrowserProvider* native = reinterpret_cast<ChromeBrowserProvider*>(nativ eChromeBrowserProvider); | |
300 return native->QueryBookmarkFromAPI(env, obj, projection, selection, selection Args, sortOrder).Release(); | |
301 } | |
302 | |
303 static void GotOrientation(JNIEnv* env, jobject obj, | |
304 jint nativePtr, | |
305 jdouble alpha, | |
306 jdouble beta, | |
307 jdouble gamma) { | |
308 DCHECK(nativePtr) << "GotOrientation"; | |
309 device_orientation::DeviceOrientationAndroid* native = reinterpret_cast<device _orientation::DeviceOrientationAndroid*>(nativePtr); | |
310 return native->GotOrientation(env, obj, alpha, beta, gamma); | |
311 } | |
312 | |
313 | |
314 // Step 3: GetMethodIDs and RegisterNatives. | |
315 | |
316 | |
317 static void GetMethodIDsImpl(JNIEnv* env) { | |
318 g_TestJni_clazz.Reset(base::android::GetClass(env, kTestJniClassPath)); | |
319 } | |
320 | |
321 static bool RegisterNativesImpl(JNIEnv* env) { | |
322 GetMethodIDsImpl(env); | |
323 | |
324 static const JNINativeMethod kMethodsTestJni[] = { | |
325 { "nativeInit", "()I", reinterpret_cast<void*>(Init) }, | |
326 { "nativeDestroy", "(I)V", reinterpret_cast<void*>(Destroy) }, | |
327 { "nativeAddBookmark", "(ILjava/lang/String;Ljava/lang/String;ZJ)J", reinter pret_cast<void*>(AddBookmark) }, | |
328 { "nativeGetDomainAndRegistry", "(Ljava/lang/String;)Ljava/lang/String;", re interpret_cast<void*>(GetDomainAndRegistry) }, | |
329 { "nativeCreateHistoricalTabFromState", "([BI)V", reinterpret_cast<void*>(Cr eateHistoricalTabFromState) }, | |
330 { "nativeGetStateAsByteArray", "(Lorg/chromium/chromeview/ChromeView;)[B", r einterpret_cast<void*>(GetStateAsByteArray) }, | |
331 { "nativeGetAutofillProfileGUIDs", "()[Ljava/lang/String;", reinterpret_cast <void*>(GetAutofillProfileGUIDs) }, | |
332 { "nativeSetRecognitionResults", "(I[Ljava/lang/String;)V", reinterpret_cast <void*>(SetRecognitionResults) }, | |
333 { "nativeAddBookmarkFromAPI", "(ILjava/lang/String;Ljava/lang/Long;Ljava/lan g/Boolean;Ljava/lang/Long;[BLjava/lang/String;Ljava/lang/Integer;)J", reinterpre t_cast<void*>(AddBookmarkFromAPI) }, | |
334 { "nativeFindAll", "(Ljava/lang/String;)I", reinterpret_cast<void*>(FindAll) }, | |
335 { "nativeGetDefaultBookmarkFolder", "()Lcom/android/chrome/ChromeBrowserProv ider$BookmarkNode;", reinterpret_cast<void*>(GetDefaultBookmarkFolder) }, | |
336 { "nativeQueryBookmarkFromAPI", "(I[Ljava/lang/String;Ljava/lang/String;[Lja va/lang/String;Ljava/lang/String;)Lcom/android/chrome/database/SQLiteCursor;", r einterpret_cast<void*>(QueryBookmarkFromAPI) }, | |
337 { "nativeGotOrientation", "(IDDD)V", reinterpret_cast<void*>(GotOrientation) }, | |
338 }; | |
339 const int kMethodsTestJniSize = arraysize(kMethodsTestJni); | |
340 | |
341 if (env->RegisterNatives(g_TestJni_clazz.obj(), | |
342 kMethodsTestJni, | |
343 kMethodsTestJniSize) < 0) { | |
344 LOG(ERROR) << "RegisterNatives failed in " << __FILE__; | |
345 return false; | |
346 } | |
347 | |
348 return true; | |
349 } | |
350 | |
351 #endif // org_chromium_TestJni_JNI | |
352 """ | |
353 self.assertTextEquals(golden_content, h.GetContent()) | |
354 | |
355 def testInnerClassNatives(self): | |
356 test_data = """ | |
357 class MyInnerClass { | |
358 @NativeCall("MyInnerClass") | |
359 private native int nativeInit(); | |
360 } | |
361 """ | |
362 natives = jni_generator.ExtractNatives(test_data) | |
363 golden_natives = [ | |
364 NativeMethod(return_type='int', static=False, | |
365 name='Init', params=[], | |
366 java_class_name='MyInnerClass', | |
367 type='function') | |
368 ] | |
369 self.assertListEquals(golden_natives, natives) | |
370 h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni', | |
371 natives, []) | |
372 golden_content = """\ | |
373 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
374 // Use of this source code is governed by a BSD-style license that can be | |
375 // found in the LICENSE file. | |
376 | |
377 | |
378 // This file is autogenerated by base/android/jni_generator/jni_generator_tests. py | |
379 // For org/chromium/TestJni | |
380 | |
381 #ifndef org_chromium_TestJni_JNI | |
382 #define org_chromium_TestJni_JNI | |
383 | |
384 #include <jni.h> | |
385 | |
386 #include "base/android/jni_android.h" | |
387 #include "base/android/scoped_java_ref.h" | |
388 #include "base/basictypes.h" | |
389 #include "base/logging.h" | |
390 | |
391 using base::android::ScopedJavaLocalRef; | |
392 | |
393 // Step 1: forward declarations. | |
394 namespace { | |
395 const char* const kTestJniClassPath = "org/chromium/TestJni"; | |
396 const char* const kMyInnerClassClassPath = "org/chromium/TestJni$MyInnerClass"; | |
397 // Leaking this JavaRef as we cannot use LazyInstance from some threads. | |
398 base::android::ScopedJavaGlobalRef<jclass>& | |
399 g_TestJni_clazz = *(new base::android::ScopedJavaGlobalRef<jclass>()); | |
400 } // namespace | |
401 | |
402 static jint Init(JNIEnv* env, jobject obj); | |
403 | |
404 | |
405 // Step 2: method stubs. | |
406 | |
407 | |
408 // Step 3: GetMethodIDs and RegisterNatives. | |
409 | |
410 | |
411 static void GetMethodIDsImpl(JNIEnv* env) { | |
412 g_TestJni_clazz.Reset(base::android::GetClass(env, kTestJniClassPath)); | |
413 } | |
414 | |
415 static bool RegisterNativesImpl(JNIEnv* env) { | |
416 GetMethodIDsImpl(env); | |
417 | |
418 static const JNINativeMethod kMethodsMyInnerClass[] = { | |
419 { "nativeInit", "()I", reinterpret_cast<void*>(Init) }, | |
420 }; | |
421 const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass); | |
422 | |
423 if (env->RegisterNatives(g_MyInnerClass_clazz.obj(), | |
424 kMethodsMyInnerClass, | |
425 kMethodsMyInnerClassSize) < 0) { | |
426 LOG(ERROR) << "RegisterNatives failed in " << __FILE__; | |
427 return false; | |
428 } | |
429 | |
430 return true; | |
431 } | |
432 | |
433 #endif // org_chromium_TestJni_JNI | |
434 """ | |
435 self.assertTextEquals(golden_content, h.GetContent()) | |
436 | |
437 def testInnerClassNativesMultiple(self): | |
438 test_data = """ | |
439 class MyInnerClass { | |
440 @NativeCall("MyInnerClass") | |
441 private native int nativeInit(); | |
442 } | |
443 class MyOtherInnerClass { | |
444 @NativeCall("MyOtherInnerClass") | |
445 private native int nativeInit(); | |
446 } | |
447 """ | |
448 natives = jni_generator.ExtractNatives(test_data) | |
449 golden_natives = [ | |
450 NativeMethod(return_type='int', static=False, | |
451 name='Init', params=[], | |
452 java_class_name='MyInnerClass', | |
453 type='function'), | |
454 NativeMethod(return_type='int', static=False, | |
455 name='Init', params=[], | |
456 java_class_name='MyOtherInnerClass', | |
457 type='function') | |
458 ] | |
459 self.assertListEquals(golden_natives, natives) | |
460 h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni', | |
461 natives, []) | |
462 golden_content = """\ | |
463 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
464 // Use of this source code is governed by a BSD-style license that can be | |
465 // found in the LICENSE file. | |
466 | |
467 | |
468 // This file is autogenerated by base/android/jni_generator/jni_generator_tests. py | |
469 // For org/chromium/TestJni | |
470 | |
471 #ifndef org_chromium_TestJni_JNI | |
472 #define org_chromium_TestJni_JNI | |
473 | |
474 #include <jni.h> | |
475 | |
476 #include "base/android/jni_android.h" | |
477 #include "base/android/scoped_java_ref.h" | |
478 #include "base/basictypes.h" | |
479 #include "base/logging.h" | |
480 | |
481 using base::android::ScopedJavaLocalRef; | |
482 | |
483 // Step 1: forward declarations. | |
484 namespace { | |
485 const char* const kMyOtherInnerClassClassPath = "org/chromium/TestJni$MyOtherInn erClass"; | |
486 const char* const kTestJniClassPath = "org/chromium/TestJni"; | |
487 const char* const kMyInnerClassClassPath = "org/chromium/TestJni$MyInnerClass"; | |
488 // Leaking this JavaRef as we cannot use LazyInstance from some threads. | |
489 base::android::ScopedJavaGlobalRef<jclass>& | |
490 g_TestJni_clazz = *(new base::android::ScopedJavaGlobalRef<jclass>()); | |
491 } // namespace | |
492 | |
493 static jint Init(JNIEnv* env, jobject obj); | |
494 | |
495 | |
496 static jint Init(JNIEnv* env, jobject obj); | |
497 | |
498 | |
499 // Step 2: method stubs. | |
500 | |
501 | |
502 // Step 3: GetMethodIDs and RegisterNatives. | |
503 | |
504 | |
505 static void GetMethodIDsImpl(JNIEnv* env) { | |
506 g_TestJni_clazz.Reset(base::android::GetClass(env, kTestJniClassPath)); | |
507 } | |
508 | |
509 static bool RegisterNativesImpl(JNIEnv* env) { | |
510 GetMethodIDsImpl(env); | |
511 | |
512 static const JNINativeMethod kMethodsMyOtherInnerClass[] = { | |
513 { "nativeInit", "()I", reinterpret_cast<void*>(Init) }, | |
514 }; | |
515 const int kMethodsMyOtherInnerClassSize = arraysize(kMethodsMyOtherInnerClass) ; | |
516 | |
517 if (env->RegisterNatives(g_MyOtherInnerClass_clazz.obj(), | |
518 kMethodsMyOtherInnerClass, | |
519 kMethodsMyOtherInnerClassSize) < 0) { | |
520 LOG(ERROR) << "RegisterNatives failed in " << __FILE__; | |
521 return false; | |
522 } | |
523 | |
524 static const JNINativeMethod kMethodsMyInnerClass[] = { | |
525 { "nativeInit", "()I", reinterpret_cast<void*>(Init) }, | |
526 }; | |
527 const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass); | |
528 | |
529 if (env->RegisterNatives(g_MyInnerClass_clazz.obj(), | |
530 kMethodsMyInnerClass, | |
531 kMethodsMyInnerClassSize) < 0) { | |
532 LOG(ERROR) << "RegisterNatives failed in " << __FILE__; | |
533 return false; | |
534 } | |
535 | |
536 return true; | |
537 } | |
538 | |
539 #endif // org_chromium_TestJni_JNI | |
540 """ | |
541 self.assertTextEquals(golden_content, h.GetContent()) | |
542 | |
543 def testInnerClassNativesBothInnerAndOuter(self): | |
544 test_data = """ | |
545 class MyOuterClass { | |
546 private native int nativeInit(); | |
547 class MyOtherInnerClass { | |
548 @NativeCall("MyOtherInnerClass") | |
549 private native int nativeInit(); | |
550 } | |
551 } | |
552 """ | |
553 natives = jni_generator.ExtractNatives(test_data) | |
554 golden_natives = [ | |
555 NativeMethod(return_type='int', static=False, | |
556 name='Init', params=[], | |
557 java_class_name='', | |
558 type='function'), | |
559 NativeMethod(return_type='int', static=False, | |
560 name='Init', params=[], | |
561 java_class_name='MyOtherInnerClass', | |
562 type='function') | |
563 ] | |
564 self.assertListEquals(golden_natives, natives) | |
565 h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni', | |
566 natives, []) | |
567 golden_content = """\ | |
568 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
569 // Use of this source code is governed by a BSD-style license that can be | |
570 // found in the LICENSE file. | |
571 | |
572 | |
573 // This file is autogenerated by base/android/jni_generator/jni_generator_tests. py | |
574 // For org/chromium/TestJni | |
575 | |
576 #ifndef org_chromium_TestJni_JNI | |
577 #define org_chromium_TestJni_JNI | |
578 | |
579 #include <jni.h> | |
580 | |
581 #include "base/android/jni_android.h" | |
582 #include "base/android/scoped_java_ref.h" | |
583 #include "base/basictypes.h" | |
584 #include "base/logging.h" | |
585 | |
586 using base::android::ScopedJavaLocalRef; | |
587 | |
588 // Step 1: forward declarations. | |
589 namespace { | |
590 const char* const kMyOtherInnerClassClassPath = "org/chromium/TestJni$MyOtherInn erClass"; | |
591 const char* const kTestJniClassPath = "org/chromium/TestJni"; | |
592 // Leaking this JavaRef as we cannot use LazyInstance from some threads. | |
593 base::android::ScopedJavaGlobalRef<jclass>& | |
594 g_TestJni_clazz = *(new base::android::ScopedJavaGlobalRef<jclass>()); | |
595 } // namespace | |
596 | |
597 static jint Init(JNIEnv* env, jobject obj); | |
598 | |
599 | |
600 static jint Init(JNIEnv* env, jobject obj); | |
601 | |
602 | |
603 // Step 2: method stubs. | |
604 | |
605 | |
606 // Step 3: GetMethodIDs and RegisterNatives. | |
607 | |
608 | |
609 static void GetMethodIDsImpl(JNIEnv* env) { | |
610 g_TestJni_clazz.Reset(base::android::GetClass(env, kTestJniClassPath)); | |
611 } | |
612 | |
613 static bool RegisterNativesImpl(JNIEnv* env) { | |
614 GetMethodIDsImpl(env); | |
615 | |
616 static const JNINativeMethod kMethodsMyOtherInnerClass[] = { | |
617 { "nativeInit", "()I", reinterpret_cast<void*>(Init) }, | |
618 }; | |
619 const int kMethodsMyOtherInnerClassSize = arraysize(kMethodsMyOtherInnerClass) ; | |
620 | |
621 if (env->RegisterNatives(g_MyOtherInnerClass_clazz.obj(), | |
622 kMethodsMyOtherInnerClass, | |
623 kMethodsMyOtherInnerClassSize) < 0) { | |
624 LOG(ERROR) << "RegisterNatives failed in " << __FILE__; | |
625 return false; | |
626 } | |
627 | |
628 static const JNINativeMethod kMethodsTestJni[] = { | |
629 { "nativeInit", "()I", reinterpret_cast<void*>(Init) }, | |
630 }; | |
631 const int kMethodsTestJniSize = arraysize(kMethodsTestJni); | |
632 | |
633 if (env->RegisterNatives(g_TestJni_clazz.obj(), | |
634 kMethodsTestJni, | |
635 kMethodsTestJniSize) < 0) { | |
636 LOG(ERROR) << "RegisterNatives failed in " << __FILE__; | |
637 return false; | |
638 } | |
639 | |
640 return true; | |
641 } | |
642 | |
643 #endif // org_chromium_TestJni_JNI | |
644 """ | |
645 self.assertTextEquals(golden_content, h.GetContent()) | |
646 | |
647 def testCalledByNatives(self): | |
648 test_data = """" | |
649 @CalledByNative | |
650 NativeInfoBar showConfirmInfoBar(int nativeInfoBar, String buttonOk, | |
651 String buttonCancel, String title, Bitmap i con) { | |
652 InfoBar infobar = new ConfirmInfoBar(nativeInfoBar, mContext, | |
653 buttonOk, buttonCancel, | |
654 title, icon); | |
655 return infobar; | |
656 } | |
657 @CalledByNative | |
658 NativeInfoBar showAutoLoginInfoBar(int nativeInfoBar, | |
659 String realm, String account, String args ) { | |
660 AutoLoginInfoBar infobar = new AutoLoginInfoBar(nativeInfoBar, mContext, | |
661 realm, account, args); | |
662 if (infobar.displayedAccountCount() == 0) | |
663 infobar = null; | |
664 return infobar; | |
665 } | |
666 @CalledByNative("InfoBar") | |
667 void dismiss(); | |
668 @SuppressWarnings("unused") | |
669 @CalledByNative | |
670 private static boolean shouldShowAutoLogin(ChromeView chromeView, | |
671 String realm, String account, String args) { | |
672 AccountManagerContainer accountManagerContainer = | |
673 new AccountManagerContainer((Activity)chromeView.getContext(), realm , account, args); | |
674 String[] logins = accountManagerContainer.getAccountLogins(null); | |
675 return logins.length != 0; | |
676 } | |
677 @CalledByNative | |
678 static InputStream openUrl(String url) { | |
679 return null; | |
680 } | |
681 @CalledByNative | |
682 private void activateHardwareAcceleration(final boolean activated, final int iPid, final int iType, | |
683 final int iPrimaryID, final int iSecondaryID) { | |
684 if (!activated) { | |
685 return | |
686 } | |
687 } | |
688 @CalledByNativeUnchecked | |
689 private void uncheckedCall(int iParam); | |
690 """ | |
691 called_by_natives = jni_generator.ExtractCalledByNatives(test_data) | |
692 golden_called_by_natives = [ | |
693 CalledByNative( | |
694 return_type='NativeInfoBar', | |
695 system_class=False, | |
696 static=False, | |
697 name='showConfirmInfoBar', | |
698 method_id_var_name='showConfirmInfoBar', | |
699 java_class_name='', | |
700 params=[Param(datatype='int', name='nativeInfoBar'), | |
701 Param(datatype='String', name='buttonOk'), | |
702 Param(datatype='String', name='buttonCancel'), | |
703 Param(datatype='String', name='title'), | |
704 Param(datatype='Bitmap', name='icon')], | |
705 env_call=('Object', ''), | |
706 unchecked=False, | |
707 ), | |
708 CalledByNative( | |
709 return_type='NativeInfoBar', | |
710 system_class=False, | |
711 static=False, | |
712 name='showAutoLoginInfoBar', | |
713 method_id_var_name='showAutoLoginInfoBar', | |
714 java_class_name='', | |
715 params=[Param(datatype='int', name='nativeInfoBar'), | |
716 Param(datatype='String', name='realm'), | |
717 Param(datatype='String', name='account'), | |
718 Param(datatype='String', name='args')], | |
719 env_call=('Object', ''), | |
720 unchecked=False, | |
721 ), | |
722 CalledByNative( | |
723 return_type='void', | |
724 system_class=False, | |
725 static=False, | |
726 name='dismiss', | |
727 method_id_var_name='dismiss', | |
728 java_class_name='InfoBar', | |
729 params=[], | |
730 env_call=('Void', ''), | |
731 unchecked=False, | |
732 ), | |
733 CalledByNative( | |
734 return_type='boolean', | |
735 system_class=False, | |
736 static=True, | |
737 name='shouldShowAutoLogin', | |
738 method_id_var_name='shouldShowAutoLogin', | |
739 java_class_name='', | |
740 params=[Param(datatype='ChromeView', name='chromeView'), | |
741 Param(datatype='String', name='realm'), | |
742 Param(datatype='String', name='account'), | |
743 Param(datatype='String', name='args')], | |
744 env_call=('Boolean', ''), | |
745 unchecked=False, | |
746 ), | |
747 CalledByNative( | |
748 return_type='InputStream', | |
749 system_class=False, | |
750 static=True, | |
751 name='openUrl', | |
752 method_id_var_name='openUrl', | |
753 java_class_name='', | |
754 params=[Param(datatype='String', name='url')], | |
755 env_call=('Object', ''), | |
756 unchecked=False, | |
757 ), | |
758 CalledByNative( | |
759 return_type='void', | |
760 system_class=False, | |
761 static=False, | |
762 name='activateHardwareAcceleration', | |
763 method_id_var_name='activateHardwareAcceleration', | |
764 java_class_name='', | |
765 params=[Param(datatype='boolean', name='activated'), | |
766 Param(datatype='int', name='iPid'), | |
767 Param(datatype='int', name='iType'), | |
768 Param(datatype='int', name='iPrimaryID'), | |
769 Param(datatype='int', name='iSecondaryID'), | |
770 ], | |
771 env_call=('Void', ''), | |
772 unchecked=False, | |
773 ), | |
774 CalledByNative( | |
775 return_type='void', | |
776 system_class=False, | |
777 static=False, | |
778 name='uncheckedCall', | |
779 method_id_var_name='uncheckedCall', | |
780 java_class_name='', | |
781 params=[Param(datatype='int', name='iParam')], | |
782 env_call=('Void', ''), | |
783 unchecked=True, | |
784 ), | |
785 ] | |
786 self.assertListEquals(golden_called_by_natives, called_by_natives) | |
787 h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni', | |
788 [], called_by_natives) | |
789 golden_content = """\ | |
790 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
791 // Use of this source code is governed by a BSD-style license that can be | |
792 // found in the LICENSE file. | |
793 | |
794 | |
795 // This file is autogenerated by base/android/jni_generator/jni_generator_tests. py | |
796 // For org/chromium/TestJni | |
797 | |
798 #ifndef org_chromium_TestJni_JNI | |
799 #define org_chromium_TestJni_JNI | |
800 | |
801 #include <jni.h> | |
802 | |
803 #include "base/android/jni_android.h" | |
804 #include "base/android/scoped_java_ref.h" | |
805 #include "base/basictypes.h" | |
806 #include "base/logging.h" | |
807 | |
808 using base::android::ScopedJavaLocalRef; | |
809 | |
810 // Step 1: forward declarations. | |
811 namespace { | |
812 const char* const kTestJniClassPath = "org/chromium/TestJni"; | |
813 const char* const kInfoBarClassPath = "org/chromium/TestJni$InfoBar"; | |
814 // Leaking this JavaRef as we cannot use LazyInstance from some threads. | |
815 base::android::ScopedJavaGlobalRef<jclass>& | |
816 g_TestJni_clazz = *(new base::android::ScopedJavaGlobalRef<jclass>()); | |
817 // Leaking this JavaRef as we cannot use LazyInstance from some threads. | |
818 base::android::ScopedJavaGlobalRef<jclass>& | |
819 g_InfoBar_clazz = *(new base::android::ScopedJavaGlobalRef<jclass>()); | |
820 } // namespace | |
821 | |
822 | |
823 // Step 2: method stubs. | |
824 | |
825 static jmethodID g_TestJni_showConfirmInfoBar = 0; | |
826 static ScopedJavaLocalRef<jobject> Java_TestJni_showConfirmInfoBar(JNIEnv* env, jobject obj, jint nativeInfoBar, | |
827 jstring buttonOk, | |
828 jstring buttonCancel, | |
829 jstring title, | |
830 jobject icon) { | |
831 DCHECK(!g_TestJni_clazz.is_null()); /* Must call RegisterNativesImpl() */ | |
832 DCHECK(g_TestJni_showConfirmInfoBar); | |
833 jobject ret = | |
834 env->CallObjectMethod(obj, | |
835 g_TestJni_showConfirmInfoBar, nativeInfoBar, buttonOk, buttonCancel, title , icon); | |
836 base::android::CheckException(env); | |
837 return ScopedJavaLocalRef<jobject>(env, ret); | |
838 } | |
839 | |
840 static jmethodID g_TestJni_showAutoLoginInfoBar = 0; | |
841 static ScopedJavaLocalRef<jobject> Java_TestJni_showAutoLoginInfoBar(JNIEnv* env , jobject obj, jint nativeInfoBar, | |
842 jstring realm, | |
843 jstring account, | |
844 jstring args) { | |
845 DCHECK(!g_TestJni_clazz.is_null()); /* Must call RegisterNativesImpl() */ | |
846 DCHECK(g_TestJni_showAutoLoginInfoBar); | |
847 jobject ret = | |
848 env->CallObjectMethod(obj, | |
849 g_TestJni_showAutoLoginInfoBar, nativeInfoBar, realm, account, args); | |
850 base::android::CheckException(env); | |
851 return ScopedJavaLocalRef<jobject>(env, ret); | |
852 } | |
853 | |
854 static jmethodID g_InfoBar_dismiss = 0; | |
855 static void Java_InfoBar_dismiss(JNIEnv* env, jobject obj) { | |
856 DCHECK(!g_InfoBar_clazz.is_null()); /* Must call RegisterNativesImpl() */ | |
857 DCHECK(g_InfoBar_dismiss); | |
858 | |
859 env->CallVoidMethod(obj, | |
860 g_InfoBar_dismiss); | |
861 base::android::CheckException(env); | |
862 | |
863 } | |
864 | |
865 static jmethodID g_TestJni_shouldShowAutoLogin = 0; | |
866 static jboolean Java_TestJni_shouldShowAutoLogin(JNIEnv* env, jobject chromeView , | |
867 jstring realm, | |
868 jstring account, | |
869 jstring args) { | |
870 DCHECK(!g_TestJni_clazz.is_null()); /* Must call RegisterNativesImpl() */ | |
871 DCHECK(g_TestJni_shouldShowAutoLogin); | |
872 jboolean ret = | |
873 env->CallStaticBooleanMethod(g_TestJni_clazz.obj(), | |
874 g_TestJni_shouldShowAutoLogin, chromeView, realm, account, args); | |
875 base::android::CheckException(env); | |
876 return ret; | |
877 } | |
878 | |
879 static jmethodID g_TestJni_openUrl = 0; | |
880 static ScopedJavaLocalRef<jobject> Java_TestJni_openUrl(JNIEnv* env, jstring url ) { | |
881 DCHECK(!g_TestJni_clazz.is_null()); /* Must call RegisterNativesImpl() */ | |
882 DCHECK(g_TestJni_openUrl); | |
883 jobject ret = | |
884 env->CallStaticObjectMethod(g_TestJni_clazz.obj(), | |
885 g_TestJni_openUrl, url); | |
886 base::android::CheckException(env); | |
887 return ScopedJavaLocalRef<jobject>(env, ret); | |
888 } | |
889 | |
890 static jmethodID g_TestJni_activateHardwareAcceleration = 0; | |
891 static void Java_TestJni_activateHardwareAcceleration(JNIEnv* env, jobject obj, jboolean activated, | |
892 jint iPid, | |
893 jint iType, | |
894 jint iPrimaryID, | |
895 jint iSecondaryID) { | |
896 DCHECK(!g_TestJni_clazz.is_null()); /* Must call RegisterNativesImpl() */ | |
897 DCHECK(g_TestJni_activateHardwareAcceleration); | |
898 | |
899 env->CallVoidMethod(obj, | |
900 g_TestJni_activateHardwareAcceleration, activated, iPid, iType, iPrimaryID , iSecondaryID); | |
901 base::android::CheckException(env); | |
902 | |
903 } | |
904 | |
905 static jmethodID g_TestJni_uncheckedCall = 0; | |
906 static void Java_TestJni_uncheckedCall(JNIEnv* env, jobject obj, jint iParam) { | |
907 DCHECK(!g_TestJni_clazz.is_null()); /* Must call RegisterNativesImpl() */ | |
908 DCHECK(g_TestJni_uncheckedCall); | |
909 | |
910 env->CallVoidMethod(obj, | |
911 g_TestJni_uncheckedCall, iParam); | |
912 | |
913 | |
914 } | |
915 | |
916 // Step 3: GetMethodIDs and RegisterNatives. | |
917 | |
918 | |
919 static void GetMethodIDsImpl(JNIEnv* env) { | |
920 g_TestJni_clazz.Reset(base::android::GetClass(env, kTestJniClassPath)); | |
921 g_InfoBar_clazz.Reset(base::android::GetClass(env, kInfoBarClassPath)); | |
922 g_TestJni_showConfirmInfoBar = base::android::GetMethodID( | |
923 env, g_TestJni_clazz, | |
924 "showConfirmInfoBar", | |
925 "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/graphics/B itmap;)Lcom/android/chrome/infobar/InfoBarContainer$NativeInfoBar;"); | |
926 | |
927 g_TestJni_showAutoLoginInfoBar = base::android::GetMethodID( | |
928 env, g_TestJni_clazz, | |
929 "showAutoLoginInfoBar", | |
930 "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/android/chrom e/infobar/InfoBarContainer$NativeInfoBar;"); | |
931 | |
932 g_InfoBar_dismiss = base::android::GetMethodID( | |
933 env, g_InfoBar_clazz, | |
934 "dismiss", | |
935 "()V"); | |
936 | |
937 g_TestJni_shouldShowAutoLogin = base::android::GetStaticMethodID( | |
938 env, g_TestJni_clazz, | |
939 "shouldShowAutoLogin", | |
940 "(Lorg/chromium/chromeview/ChromeView;Ljava/lang/String;Ljava/lang/String;Lj ava/lang/String;)Z"); | |
941 | |
942 g_TestJni_openUrl = base::android::GetStaticMethodID( | |
943 env, g_TestJni_clazz, | |
944 "openUrl", | |
945 "(Ljava/lang/String;)Ljava/io/InputStream;"); | |
946 | |
947 g_TestJni_activateHardwareAcceleration = base::android::GetMethodID( | |
948 env, g_TestJni_clazz, | |
949 "activateHardwareAcceleration", | |
950 "(ZIIII)V"); | |
951 | |
952 g_TestJni_uncheckedCall = base::android::GetMethodID( | |
953 env, g_TestJni_clazz, | |
954 "uncheckedCall", | |
955 "(I)V"); | |
956 | |
957 } | |
958 | |
959 static bool RegisterNativesImpl(JNIEnv* env) { | |
960 GetMethodIDsImpl(env); | |
961 | |
962 return true; | |
963 } | |
964 | |
965 #endif // org_chromium_TestJni_JNI | |
966 """ | |
967 self.assertTextEquals(golden_content, h.GetContent()) | |
968 | |
969 def testCalledByNativeParseError(self): | |
970 try: | |
971 jni_generator.ExtractCalledByNatives(""" | |
972 @CalledByNative | |
973 public static int foo(); // This one is fine | |
974 | |
975 @CalledByNative | |
976 scooby doo | |
977 """) | |
978 self.fail('Expected a ParseError') | |
979 except jni_generator.ParseError, e: | |
980 self.assertEquals(('@CalledByNative', 'scooby doo'), e.context_lines) | |
981 | |
982 def testFullyQualifiedClassName(self): | |
983 contents = """ | |
984 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
985 // Use of this source code is governed by a BSD-style license that can be | |
986 // found in the LICENSE file. | |
987 | |
988 package org.chromium.chromeview; | |
989 | |
990 import org.chromium.chromeview.legacy.DownloadListener; | |
991 """ | |
992 self.assertEquals('org/chromium/chromeview/Foo', | |
993 jni_generator.ExtractFullyQualifiedJavaClassName( | |
994 'org/chromium/chromeview/Foo.java', contents)) | |
995 self.assertEquals('org/chromium/chromeview/Foo', | |
996 jni_generator.ExtractFullyQualifiedJavaClassName( | |
997 'frameworks/Foo.java', contents)) | |
998 self.assertRaises(SyntaxError, | |
999 jni_generator.ExtractFullyQualifiedJavaClassName, | |
1000 'com/foo/Bar', 'no PACKAGE line') | |
1001 | |
1002 def testMethodNameMangling(self): | |
1003 self.assertEquals('close_pqV', | |
1004 jni_generator.GetMangledMethodName('close', '()V')) | |
1005 self.assertEquals('read_paBIIqI', | |
1006 jni_generator.GetMangledMethodName('read', '([BII)I')) | |
1007 self.assertEquals('open_pLjava_lang_StringxqLjava_io_InputStreamx', | |
1008 jni_generator.GetMangledMethodName( | |
1009 'open', | |
1010 '(Ljava/lang/String;)Ljava/io/InputStream;')) | |
1011 | |
1012 def testFromJavaP(self): | |
1013 contents = """ | |
1014 public abstract class java.io.InputStream extends java.lang.Object implements ja va.io.Closeable{ | |
1015 public java.io.InputStream(); | |
1016 public int available() throws java.io.IOException; | |
1017 public void close() throws java.io.IOException; | |
1018 public void mark(int); | |
1019 public boolean markSupported(); | |
1020 public abstract int read() throws java.io.IOException; | |
1021 public int read(byte[]) throws java.io.IOException; | |
1022 public int read(byte[], int, int) throws java.io.IOException; | |
1023 public synchronized void reset() throws java.io.IOException; | |
1024 public long skip(long) throws java.io.IOException; | |
1025 } | |
1026 """ | |
1027 jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'), None) | |
1028 self.assertEquals(9, len(jni_from_javap.called_by_natives)) | |
1029 golden_content = """\ | |
1030 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
1031 // Use of this source code is governed by a BSD-style license that can be | |
1032 // found in the LICENSE file. | |
1033 | |
1034 | |
1035 // This file is autogenerated by base/android/jni_generator/jni_generator_tests. py | |
1036 // For java/io/InputStream | |
1037 | |
1038 #ifndef java_io_InputStream_JNI | |
1039 #define java_io_InputStream_JNI | |
1040 | |
1041 #include <jni.h> | |
1042 | |
1043 #include "base/android/jni_android.h" | |
1044 #include "base/android/scoped_java_ref.h" | |
1045 #include "base/basictypes.h" | |
1046 #include "base/logging.h" | |
1047 | |
1048 using base::android::ScopedJavaLocalRef; | |
1049 | |
1050 // Step 1: forward declarations. | |
1051 namespace { | |
1052 const char* const kInputStreamClassPath = "java/io/InputStream"; | |
1053 // Leaking this JavaRef as we cannot use LazyInstance from some threads. | |
1054 base::android::ScopedJavaGlobalRef<jclass>& | |
1055 g_InputStream_clazz = *(new base::android::ScopedJavaGlobalRef<jclass>()); | |
1056 } // namespace | |
1057 | |
1058 | |
1059 // Step 2: method stubs. | |
1060 | |
1061 static jmethodID g_InputStream_available = 0; | |
1062 static jint Java_InputStream_available(JNIEnv* env, jobject obj) __attribute__ ( (unused)); | |
1063 static jint Java_InputStream_available(JNIEnv* env, jobject obj) { | |
1064 DCHECK(!g_InputStream_clazz.is_null()); /* Must call RegisterNativesImpl() * / | |
1065 DCHECK(g_InputStream_available); | |
1066 jint ret = | |
1067 env->CallIntMethod(obj, | |
1068 g_InputStream_available); | |
1069 base::android::CheckException(env); | |
1070 return ret; | |
1071 } | |
1072 | |
1073 static jmethodID g_InputStream_close = 0; | |
1074 static void Java_InputStream_close(JNIEnv* env, jobject obj) __attribute__ ((unu sed)); | |
1075 static void Java_InputStream_close(JNIEnv* env, jobject obj) { | |
1076 DCHECK(!g_InputStream_clazz.is_null()); /* Must call RegisterNativesImpl() * / | |
1077 DCHECK(g_InputStream_close); | |
1078 | |
1079 env->CallVoidMethod(obj, | |
1080 g_InputStream_close); | |
1081 base::android::CheckException(env); | |
1082 | |
1083 } | |
1084 | |
1085 static jmethodID g_InputStream_mark = 0; | |
1086 static void Java_InputStream_mark(JNIEnv* env, jobject obj, jint p0) __attribute __ ((unused)); | |
1087 static void Java_InputStream_mark(JNIEnv* env, jobject obj, jint p0) { | |
1088 DCHECK(!g_InputStream_clazz.is_null()); /* Must call RegisterNativesImpl() * / | |
1089 DCHECK(g_InputStream_mark); | |
1090 | |
1091 env->CallVoidMethod(obj, | |
1092 g_InputStream_mark, p0); | |
1093 base::android::CheckException(env); | |
1094 | |
1095 } | |
1096 | |
1097 static jmethodID g_InputStream_markSupported = 0; | |
1098 static jboolean Java_InputStream_markSupported(JNIEnv* env, jobject obj) __attri bute__ ((unused)); | |
1099 static jboolean Java_InputStream_markSupported(JNIEnv* env, jobject obj) { | |
1100 DCHECK(!g_InputStream_clazz.is_null()); /* Must call RegisterNativesImpl() * / | |
1101 DCHECK(g_InputStream_markSupported); | |
1102 jboolean ret = | |
1103 env->CallBooleanMethod(obj, | |
1104 g_InputStream_markSupported); | |
1105 base::android::CheckException(env); | |
1106 return ret; | |
1107 } | |
1108 | |
1109 static jmethodID g_InputStream_read_pqI = 0; | |
1110 static jint Java_InputStream_read(JNIEnv* env, jobject obj) __attribute__ ((unus ed)); | |
1111 static jint Java_InputStream_read(JNIEnv* env, jobject obj) { | |
1112 DCHECK(!g_InputStream_clazz.is_null()); /* Must call RegisterNativesImpl() * / | |
1113 DCHECK(g_InputStream_read_pqI); | |
1114 jint ret = | |
1115 env->CallIntMethod(obj, | |
1116 g_InputStream_read_pqI); | |
1117 base::android::CheckException(env); | |
1118 return ret; | |
1119 } | |
1120 | |
1121 static jmethodID g_InputStream_read_paBqI = 0; | |
1122 static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0) __att ribute__ ((unused)); | |
1123 static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0) { | |
1124 DCHECK(!g_InputStream_clazz.is_null()); /* Must call RegisterNativesImpl() * / | |
1125 DCHECK(g_InputStream_read_paBqI); | |
1126 jint ret = | |
1127 env->CallIntMethod(obj, | |
1128 g_InputStream_read_paBqI, p0); | |
1129 base::android::CheckException(env); | |
1130 return ret; | |
1131 } | |
1132 | |
1133 static jmethodID g_InputStream_read_paBIIqI = 0; | |
1134 static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0, | |
1135 jint p1, | |
1136 jint p2) __attribute__ ((unused)); | |
1137 static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0, | |
1138 jint p1, | |
1139 jint p2) { | |
1140 DCHECK(!g_InputStream_clazz.is_null()); /* Must call RegisterNativesImpl() * / | |
1141 DCHECK(g_InputStream_read_paBIIqI); | |
1142 jint ret = | |
1143 env->CallIntMethod(obj, | |
1144 g_InputStream_read_paBIIqI, p0, p1, p2); | |
1145 base::android::CheckException(env); | |
1146 return ret; | |
1147 } | |
1148 | |
1149 static jmethodID g_InputStream_reset = 0; | |
1150 static void Java_InputStream_reset(JNIEnv* env, jobject obj) __attribute__ ((unu sed)); | |
1151 static void Java_InputStream_reset(JNIEnv* env, jobject obj) { | |
1152 DCHECK(!g_InputStream_clazz.is_null()); /* Must call RegisterNativesImpl() * / | |
1153 DCHECK(g_InputStream_reset); | |
1154 | |
1155 env->CallVoidMethod(obj, | |
1156 g_InputStream_reset); | |
1157 base::android::CheckException(env); | |
1158 | |
1159 } | |
1160 | |
1161 static jmethodID g_InputStream_skip = 0; | |
1162 static jlong Java_InputStream_skip(JNIEnv* env, jobject obj, jlong p0) __attribu te__ ((unused)); | |
1163 static jlong Java_InputStream_skip(JNIEnv* env, jobject obj, jlong p0) { | |
1164 DCHECK(!g_InputStream_clazz.is_null()); /* Must call RegisterNativesImpl() * / | |
1165 DCHECK(g_InputStream_skip); | |
1166 jlong ret = | |
1167 env->CallLongMethod(obj, | |
1168 g_InputStream_skip, p0); | |
1169 base::android::CheckException(env); | |
1170 return ret; | |
1171 } | |
1172 | |
1173 // Step 3: GetMethodIDs and RegisterNatives. | |
1174 namespace JNI_InputStream { | |
1175 | |
1176 static void GetMethodIDsImpl(JNIEnv* env) { | |
1177 g_InputStream_clazz.Reset(base::android::GetClass(env, kInputStreamClassPath)) ; | |
1178 g_InputStream_available = base::android::GetMethodID( | |
1179 env, g_InputStream_clazz, | |
1180 "available", | |
1181 "()I"); | |
1182 | |
1183 g_InputStream_close = base::android::GetMethodID( | |
1184 env, g_InputStream_clazz, | |
1185 "close", | |
1186 "()V"); | |
1187 | |
1188 g_InputStream_mark = base::android::GetMethodID( | |
1189 env, g_InputStream_clazz, | |
1190 "mark", | |
1191 "(I)V"); | |
1192 | |
1193 g_InputStream_markSupported = base::android::GetMethodID( | |
1194 env, g_InputStream_clazz, | |
1195 "markSupported", | |
1196 "()Z"); | |
1197 | |
1198 g_InputStream_read_pqI = base::android::GetMethodID( | |
1199 env, g_InputStream_clazz, | |
1200 "read", | |
1201 "()I"); | |
1202 | |
1203 g_InputStream_read_paBqI = base::android::GetMethodID( | |
1204 env, g_InputStream_clazz, | |
1205 "read", | |
1206 "([B)I"); | |
1207 | |
1208 g_InputStream_read_paBIIqI = base::android::GetMethodID( | |
1209 env, g_InputStream_clazz, | |
1210 "read", | |
1211 "([BII)I"); | |
1212 | |
1213 g_InputStream_reset = base::android::GetMethodID( | |
1214 env, g_InputStream_clazz, | |
1215 "reset", | |
1216 "()V"); | |
1217 | |
1218 g_InputStream_skip = base::android::GetMethodID( | |
1219 env, g_InputStream_clazz, | |
1220 "skip", | |
1221 "(J)J"); | |
1222 | |
1223 } | |
1224 | |
1225 static bool RegisterNativesImpl(JNIEnv* env) { | |
1226 JNI_InputStream::GetMethodIDsImpl(env); | |
1227 | |
1228 return true; | |
1229 } | |
1230 } // namespace JNI_InputStream | |
1231 | |
1232 #endif // java_io_InputStream_JNI | |
1233 """ | |
1234 self.assertTextEquals(golden_content, jni_from_javap.GetContent()) | |
1235 | |
1236 def testREForNatives(self): | |
1237 # We should not match "native SyncSetupFlow" inside the comment. | |
1238 test_data = """ | |
1239 /** | |
1240 * Invoked when the setup process is complete so we can disconnect from the | |
1241 * native-side SyncSetupFlowHandler. | |
1242 */ | |
1243 public void destroy() { | |
1244 Log.v(TAG, "Destroying native SyncSetupFlow"); | |
1245 if (mNativeSyncSetupFlow != 0) { | |
1246 nativeSyncSetupEnded(mNativeSyncSetupFlow); | |
1247 mNativeSyncSetupFlow = 0; | |
1248 } | |
1249 } | |
1250 private native void nativeSyncSetupEnded(int nativeAndroidSyncSetupFlowHandl er); | |
1251 """ | |
1252 jni_from_java = jni_generator.JNIFromJavaSource(test_data, 'foo/bar') | |
1253 | |
1254 def testRaisesOnUnknownDatatype(self): | |
1255 test_data = """ | |
1256 class MyInnerClass { | |
1257 private native int nativeInit(AnUnknownDatatype p0); | |
1258 } | |
1259 """ | |
1260 self.assertRaises(SyntaxError, | |
1261 jni_generator.JNIFromJavaSource, | |
1262 test_data, 'foo/bar') | |
1263 | |
1264 def testJniSelfDocumentingExample(self): | |
1265 script_dir = os.path.dirname(sys.argv[0]) | |
1266 content = file(os.path.join(script_dir, 'SampleForTests.java')).read() | |
1267 golden_content = file(os.path.join(script_dir, | |
1268 'golden_sample_for_tests_jni.h')).read() | |
1269 jni_from_java = jni_generator.JNIFromJavaSource(content, | |
1270 'org/chromium/example/jni_ge nerator/SampleForTests') | |
1271 self.assertTextEquals(golden_content, jni_from_java.GetContent()) | |
1272 | |
1273 def testCheckFilenames(self): | |
1274 self.assertRaises(SystemExit, jni_generator.CheckFilenames, | |
1275 ['more', 'input', 'than'], ['output']) | |
1276 self.assertRaises(SystemExit, jni_generator.CheckFilenames, | |
1277 ['more'], ['output', 'than', 'input']) | |
1278 self.assertRaises(SystemExit, jni_generator.CheckFilenames, | |
1279 ['NotTheSame.java'], ['not_good.h']) | |
1280 self.assertRaises(SystemExit, jni_generator.CheckFilenames, | |
1281 ['MissingJniSuffix.java'], ['missing_jni_suffix.h']) | |
1282 jni_generator.CheckFilenames(['ThisIsFine.java'], ['this_is_fine_jni.h']) | |
1283 jni_generator.CheckFilenames([], []) | |
1284 | |
1285 | |
1286 if __name__ == '__main__': | |
1287 unittest.main() | |
1288 | |
Mark Mentovai
2012/02/14 20:00:38
Don’t need this blank line.
bulach
2012/02/14 23:18:11
Done.
| |
OLD | NEW |