Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(322)

Side by Side Diff: base/android/jni_generator/jni_generator_tests.py

Issue 9384011: Chrome on Android: adds jni_generator. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Joth's comments Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698