15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Tests for jni_generator.py.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This test suite contains various tests for the JNI generator.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)It exercises the low-level parser all the way up to the
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)code generator and ensures the output matches a golden
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)file.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import difflib
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import inspect
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import jni_generator
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from jni_generator import CalledByNative, JniParams, NativeMethod, Param
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SCRIPT_NAME = 'base/android/jni_generator/jni_generator.py'
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)INCLUDES = (
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'base/android/jni_generator/jni_generator_helper.h'
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles))
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# Set this environment variable in order to regenerate the golden text
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# files.
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)REBASELINE_ENV = 'REBASELINE'
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class TestOptions(object):
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  """The mock options object which is passed to the jni_generator.py script."""
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  def __init__(self):
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    self.namespace = None
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    self.script_name = SCRIPT_NAME
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.includes = INCLUDES
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.pure_native_methods = False
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.ptr_type = 'long'
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.jni_init_native_name = None
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.eager_called_by_natives = False
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.cpp = 'cpp'
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.javap = 'javap'
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.native_exports = False
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestGenerator(unittest.TestCase):
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def assertObjEquals(self, first, second):
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict_first = first.__dict__
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict_second = second.__dict__
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(dict_first.keys(), dict_second.keys())
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for key, value in dict_first.iteritems():
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (type(value) is list and len(value) and
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          isinstance(type(value[0]), object)):
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertListEquals(value, second.__getattribute__(key))
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actual = second.__getattribute__(key)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals(value, actual,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          'Key ' + key + ': ' + str(value) + '!=' + str(actual))
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def assertListEquals(self, first, second):
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(len(first), len(second))
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for i in xrange(len(first)):
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if isinstance(first[i], object):
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertObjEquals(first[i], second[i])
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assertEquals(first[i], second[i])
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def assertTextEquals(self, golden_text, generated_text):
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if not self.compareText(golden_text, generated_text):
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      self.fail('Golden text mismatch.')
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def compareText(self, golden_text, generated_text):
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    def FilterText(text):
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return [
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          l.strip() for l in text.split('\n')
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          if not l.startswith('// Copyright')
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ]
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    stripped_golden = FilterText(golden_text)
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    stripped_generated = FilterText(generated_text)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if stripped_golden == stripped_generated:
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return True
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    print self.id()
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for line in difflib.context_diff(stripped_golden, stripped_generated):
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      print line
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    print '\n\nGenerated'
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    print '=' * 80
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    print generated_text
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    print '=' * 80
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    print 'Run with:'
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    print 'REBASELINE=1', sys.argv[0]
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    print 'to regenerate the data files.'
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def _ReadGoldenFile(self, golden_file):
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if not os.path.exists(golden_file):
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return None
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    with file(golden_file, 'r') as f:
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return f.read()
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def assertGoldenTextEquals(self, generated_text):
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    script_dir = os.path.dirname(sys.argv[0])
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    # This is the caller test method.
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    caller = inspect.stack()[1][3]
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertTrue(caller.startswith('test'),
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    'assertGoldenTextEquals can only be called from a '
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    'test* method, not %s' % caller)
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    golden_file = os.path.join(script_dir, caller + '.golden')
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    golden_text = self._ReadGoldenFile(golden_file)
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if os.environ.get(REBASELINE_ENV):
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if golden_text != generated_text:
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        with file(golden_file, 'w') as f:
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          f.write(generated_text)
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertTextEquals(golden_text, generated_text)
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def testInspectCaller(self):
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    def willRaise():
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      # This function can only be called from a test* method.
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      self.assertGoldenTextEquals('')
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertRaises(AssertionError, willRaise)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNatives(self):
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_data = """"
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interface OnFrameAvailableListener {}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private native int nativeInit();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private native void nativeDestroy(int nativeChromeBrowserProvider);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private native long nativeAddBookmark(
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int nativeChromeBrowserProvider,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            String url, String title, boolean isFolder, long parentId);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static native String nativeGetDomainAndRegistry(String url);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static native void nativeCreateHistoricalTabFromState(
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            byte[] state, int tab_index);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private native byte[] nativeGetStateAsByteArray(View view);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static native String[] nativeGetAutofillProfileGUIDs();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private native void nativeSetRecognitionResults(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int sessionId, String[] results);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private native long nativeAddBookmarkFromAPI(
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int nativeChromeBrowserProvider,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            String url, Long created, Boolean isBookmark,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Long date, byte[] favicon, String title, Integer visits);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    native int nativeFindAll(String find);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static native OnFrameAvailableListener nativeGetInnerClass();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private native Bitmap nativeQueryBitmap(
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int nativeChromeBrowserProvider,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            String[] projection, String selection,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            String[] selectionArgs, String sortOrder);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private native void nativeGotOrientation(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int nativeDataFetcherImplAndroid,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            double alpha, double beta, double gamma);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    jni_generator.JniParams.SetFullyQualifiedClass(
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'org/chromium/example/jni_generator/SampleForTests')
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jni_generator.JniParams.ExtractImportsAndInnerClasses(test_data)
1540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    natives = jni_generator.ExtractNatives(test_data, 'int')
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    golden_natives = [
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='int', static=False,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='Init',
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     params=[],
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='function'),
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='void', static=False, name='Destroy',
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     params=[Param(datatype='int',
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='nativeChromeBrowserProvider')],
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='method',
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     p0_type='ChromeBrowserProvider'),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='long', static=False, name='AddBookmark',
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     params=[Param(datatype='int',
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='nativeChromeBrowserProvider'),
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='String',
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='url'),
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='String',
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='title'),
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='boolean',
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='isFolder'),
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='long',
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='parentId')],
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='method',
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     p0_type='ChromeBrowserProvider'),
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='String', static=True,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='GetDomainAndRegistry',
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     params=[Param(datatype='String',
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='url')],
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='function'),
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='void', static=True,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='CreateHistoricalTabFromState',
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     params=[Param(datatype='byte[]',
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='state'),
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='int',
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='tab_index')],
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='function'),
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='byte[]', static=False,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='GetStateAsByteArray',
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     params=[Param(datatype='View', name='view')],
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='function'),
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='String[]', static=True,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='GetAutofillProfileGUIDs', params=[],
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='function'),
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='void', static=False,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='SetRecognitionResults',
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     params=[Param(datatype='int', name='sessionId'),
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='String[]', name='results')],
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='function'),
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='long', static=False,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='AddBookmarkFromAPI',
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     params=[Param(datatype='int',
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='nativeChromeBrowserProvider'),
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='String',
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='url'),
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='Long',
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='created'),
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='Boolean',
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='isBookmark'),
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='Long',
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='date'),
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='byte[]',
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='favicon'),
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='String',
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='title'),
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='Integer',
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='visits')],
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='method',
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     p0_type='ChromeBrowserProvider'),
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='int', static=False,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='FindAll',
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     params=[Param(datatype='String',
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='find')],
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='function'),
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='OnFrameAvailableListener', static=True,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='GetInnerClass',
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     params=[],
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='function'),
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='Bitmap',
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     static=False,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='QueryBitmap',
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     params=[Param(datatype='int',
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='nativeChromeBrowserProvider'),
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='String[]',
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='projection'),
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='String',
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='selection'),
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='String[]',
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='selectionArgs'),
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='String',
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='sortOrder'),
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ],
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='method',
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     p0_type='ChromeBrowserProvider'),
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='void', static=False,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='GotOrientation',
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     params=[Param(datatype='int',
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='nativeDataFetcherImplAndroid'),
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='double',
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='alpha'),
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='double',
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='beta'),
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Param(datatype='double',
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   name='gamma'),
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ],
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='method',
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     p0_type='content::DataFetcherImplAndroid'),
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListEquals(golden_natives, natives)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             natives, [], [], TestOptions())
277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertGoldenTextEquals(h.GetContent())
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testInnerClassNatives(self):
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_data = """
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class MyInnerClass {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      @NativeCall("MyInnerClass")
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      private native int nativeInit();
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    natives = jni_generator.ExtractNatives(test_data, 'int')
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    golden_natives = [
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='int', static=False,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='Init', params=[],
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name='MyInnerClass',
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='function')
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListEquals(golden_natives, natives)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             natives, [], [], TestOptions())
296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertGoldenTextEquals(h.GetContent())
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testInnerClassNativesMultiple(self):
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_data = """
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class MyInnerClass {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      @NativeCall("MyInnerClass")
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      private native int nativeInit();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class MyOtherInnerClass {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      @NativeCall("MyOtherInnerClass")
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      private native int nativeInit();
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
3090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    natives = jni_generator.ExtractNatives(test_data, 'int')
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    golden_natives = [
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='int', static=False,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='Init', params=[],
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name='MyInnerClass',
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='function'),
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='int', static=False,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='Init', params=[],
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name='MyOtherInnerClass',
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='function')
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListEquals(golden_natives, natives)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             natives, [], [], TestOptions())
323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertGoldenTextEquals(h.GetContent())
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testInnerClassNativesBothInnerAndOuter(self):
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_data = """
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class MyOuterClass {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      private native int nativeInit();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      class MyOtherInnerClass {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @NativeCall("MyOtherInnerClass")
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private native int nativeInit();
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
3350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    natives = jni_generator.ExtractNatives(test_data, 'int')
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    golden_natives = [
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='int', static=False,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='Init', params=[],
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name=None,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='function'),
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NativeMethod(return_type='int', static=False,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     name='Init', params=[],
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     java_class_name='MyOtherInnerClass',
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     type='function')
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListEquals(golden_natives, natives)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             natives, [], [], TestOptions())
349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertGoldenTextEquals(h.GetContent())
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCalledByNatives(self):
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_data = """"
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    import android.graphics.Bitmap;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    import android.view.View;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    import java.io.InputStream;
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    import java.util.List;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class InnerClass {}
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @CalledByNative
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InnerClass showConfirmInfoBar(int nativeInfoBar,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            String buttonOk, String buttonCancel, String title, Bitmap icon) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        InfoBar infobar = new ConfirmInfoBar(nativeInfoBar, mContext,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             buttonOk, buttonCancel,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             title, icon);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return infobar;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @CalledByNative
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InnerClass showAutoLoginInfoBar(int nativeInfoBar,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            String realm, String account, String args) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutoLoginInfoBar infobar = new AutoLoginInfoBar(nativeInfoBar, mContext,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                realm, account, args);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (infobar.displayedAccountCount() == 0)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            infobar = null;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return infobar;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @CalledByNative("InfoBar")
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void dismiss();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SuppressWarnings("unused")
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @CalledByNative
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static boolean shouldShowAutoLogin(View view,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            String realm, String account, String args) {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AccountManagerContainer accountManagerContainer =
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new AccountManagerContainer((Activity)contentView.getContext(),
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            realm, account, args);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        String[] logins = accountManagerContainer.getAccountLogins(null);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return logins.length != 0;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @CalledByNative
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static InputStream openUrl(String url) {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return null;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @CalledByNative
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private void activateHardwareAcceleration(final boolean activated,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            final int iPid, final int iType,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            final int iPrimaryID, final int iSecondaryID) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!activated) {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @CalledByNativeUnchecked
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private void uncheckedCall(int iParam);
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @CalledByNative
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public byte[] returnByteArray();
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @CalledByNative
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public boolean[] returnBooleanArray();
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @CalledByNative
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public char[] returnCharArray();
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @CalledByNative
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public short[] returnShortArray();
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @CalledByNative
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public int[] returnIntArray();
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @CalledByNative
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public long[] returnLongArray();
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @CalledByNative
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public double[] returnDoubleArray();
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @CalledByNative
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public Object[] returnObjectArray();
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @CalledByNative
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public byte[][] returnArrayOfByteArray();
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @CalledByNative
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public Bitmap.CompressFormat getCompressFormat();
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @CalledByNative
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public List<Bitmap.CompressFormat> getCompressFormatList();
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jni_generator.JniParams.SetFullyQualifiedClass('org/chromium/Foo')
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jni_generator.JniParams.ExtractImportsAndInnerClasses(test_data)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    called_by_natives = jni_generator.ExtractCalledByNatives(test_data)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    golden_called_by_natives = [
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CalledByNative(
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return_type='InnerClass',
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            system_class=False,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static=False,
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name='showConfirmInfoBar',
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            method_id_var_name='showConfirmInfoBar',
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            java_class_name='',
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            params=[Param(datatype='int', name='nativeInfoBar'),
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='String', name='buttonOk'),
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='String', name='buttonCancel'),
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='String', name='title'),
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='Bitmap', name='icon')],
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            env_call=('Object', ''),
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unchecked=False,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ),
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CalledByNative(
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return_type='InnerClass',
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            system_class=False,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static=False,
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name='showAutoLoginInfoBar',
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            method_id_var_name='showAutoLoginInfoBar',
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            java_class_name='',
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            params=[Param(datatype='int', name='nativeInfoBar'),
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='String', name='realm'),
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='String', name='account'),
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='String', name='args')],
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            env_call=('Object', ''),
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unchecked=False,
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ),
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CalledByNative(
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return_type='void',
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            system_class=False,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static=False,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name='dismiss',
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            method_id_var_name='dismiss',
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            java_class_name='InfoBar',
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            params=[],
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            env_call=('Void', ''),
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unchecked=False,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ),
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CalledByNative(
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return_type='boolean',
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            system_class=False,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static=True,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name='shouldShowAutoLogin',
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            method_id_var_name='shouldShowAutoLogin',
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            java_class_name='',
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            params=[Param(datatype='View', name='view'),
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='String', name='realm'),
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='String', name='account'),
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='String', name='args')],
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            env_call=('Boolean', ''),
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unchecked=False,
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ),
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CalledByNative(
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return_type='InputStream',
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            system_class=False,
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static=True,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name='openUrl',
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            method_id_var_name='openUrl',
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            java_class_name='',
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            params=[Param(datatype='String', name='url')],
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            env_call=('Object', ''),
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unchecked=False,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ),
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CalledByNative(
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return_type='void',
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            system_class=False,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static=False,
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name='activateHardwareAcceleration',
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            method_id_var_name='activateHardwareAcceleration',
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            java_class_name='',
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            params=[Param(datatype='boolean', name='activated'),
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='int', name='iPid'),
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='int', name='iType'),
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='int', name='iPrimaryID'),
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Param(datatype='int', name='iSecondaryID'),
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   ],
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            env_call=('Void', ''),
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unchecked=False,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ),
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CalledByNative(
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return_type='void',
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            system_class=False,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static=False,
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name='uncheckedCall',
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            method_id_var_name='uncheckedCall',
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            java_class_name='',
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            params=[Param(datatype='int', name='iParam')],
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            env_call=('Void', ''),
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            unchecked=True,
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ),
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CalledByNative(
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return_type='byte[]',
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            system_class=False,
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            static=False,
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            name='returnByteArray',
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            method_id_var_name='returnByteArray',
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            java_class_name='',
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            params=[],
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            env_call=('Void', ''),
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            unchecked=False,
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ),
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CalledByNative(
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return_type='boolean[]',
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            system_class=False,
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            static=False,
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            name='returnBooleanArray',
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            method_id_var_name='returnBooleanArray',
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            java_class_name='',
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            params=[],
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            env_call=('Void', ''),
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            unchecked=False,
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ),
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CalledByNative(
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return_type='char[]',
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            system_class=False,
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            static=False,
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            name='returnCharArray',
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            method_id_var_name='returnCharArray',
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            java_class_name='',
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            params=[],
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            env_call=('Void', ''),
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            unchecked=False,
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ),
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CalledByNative(
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return_type='short[]',
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            system_class=False,
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            static=False,
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            name='returnShortArray',
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            method_id_var_name='returnShortArray',
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            java_class_name='',
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            params=[],
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            env_call=('Void', ''),
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            unchecked=False,
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ),
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CalledByNative(
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return_type='int[]',
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            system_class=False,
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            static=False,
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            name='returnIntArray',
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            method_id_var_name='returnIntArray',
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            java_class_name='',
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            params=[],
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            env_call=('Void', ''),
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            unchecked=False,
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ),
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CalledByNative(
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return_type='long[]',
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            system_class=False,
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            static=False,
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            name='returnLongArray',
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            method_id_var_name='returnLongArray',
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            java_class_name='',
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            params=[],
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            env_call=('Void', ''),
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            unchecked=False,
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ),
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CalledByNative(
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return_type='double[]',
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            system_class=False,
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            static=False,
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            name='returnDoubleArray',
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            method_id_var_name='returnDoubleArray',
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            java_class_name='',
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            params=[],
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            env_call=('Void', ''),
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            unchecked=False,
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ),
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CalledByNative(
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return_type='Object[]',
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            system_class=False,
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            static=False,
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            name='returnObjectArray',
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            method_id_var_name='returnObjectArray',
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            java_class_name='',
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            params=[],
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            env_call=('Void', ''),
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            unchecked=False,
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ),
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CalledByNative(
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return_type='byte[][]',
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            system_class=False,
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            static=False,
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            name='returnArrayOfByteArray',
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            method_id_var_name='returnArrayOfByteArray',
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            java_class_name='',
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            params=[],
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            env_call=('Void', ''),
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            unchecked=False,
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ),
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CalledByNative(
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return_type='Bitmap.CompressFormat',
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            system_class=False,
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            static=False,
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            name='getCompressFormat',
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            method_id_var_name='getCompressFormat',
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            java_class_name='',
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            params=[],
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            env_call=('Void', ''),
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            unchecked=False,
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ),
643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        CalledByNative(
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return_type='List<Bitmap.CompressFormat>',
645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            system_class=False,
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            static=False,
647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            name='getCompressFormatList',
648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            method_id_var_name='getCompressFormatList',
649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            java_class_name='',
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            params=[],
651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            env_call=('Void', ''),
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            unchecked=False,
653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ),
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertListEquals(golden_called_by_natives, called_by_natives)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
657a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             [], called_by_natives, [],
6584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                             TestOptions())
659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertGoldenTextEquals(h.GetContent())
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCalledByNativeParseError(self):
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jni_generator.ExtractCalledByNatives("""
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@CalledByNative
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public static int foo(); // This one is fine
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@CalledByNative
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scooby doo
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""")
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.fail('Expected a ParseError')
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except jni_generator.ParseError, e:
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEquals(('@CalledByNative', 'scooby doo'), e.context_lines)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testFullyQualifiedClassName(self):
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    contents = """
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2010 The Chromium Authors. All rights reserved.
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package org.chromium.content.browser;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.BuildInfo;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals('org/chromium/content/browser/Foo',
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      jni_generator.ExtractFullyQualifiedJavaClassName(
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          'org/chromium/content/browser/Foo.java', contents))
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals('org/chromium/content/browser/Foo',
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      jni_generator.ExtractFullyQualifiedJavaClassName(
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          'frameworks/Foo.java', contents))
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(SyntaxError,
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      jni_generator.ExtractFullyQualifiedJavaClassName,
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      'com/foo/Bar', 'no PACKAGE line')
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMethodNameMangling(self):
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals('closeV',
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        jni_generator.GetMangledMethodName('close', [], 'void'))
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals('readI_AB_I_I',
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        jni_generator.GetMangledMethodName('read',
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            [Param(name='p1',
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   datatype='byte[]'),
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             Param(name='p2',
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   datatype='int'),
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             Param(name='p3',
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   datatype='int'),],
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             'int'))
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals('openJIIS_JLS',
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        jni_generator.GetMangledMethodName('open',
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            [Param(name='p1',
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   datatype='java/lang/String'),],
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             'java/io/InputStream'))
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  def testFromJavaPGenerics(self):
71358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    contents = """
71458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)public abstract class java.util.HashSet<T> extends java.util.AbstractSet<E>
71558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      implements java.util.Set<E>, java.lang.Cloneable, java.io.Serializable {
71658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    public void dummy();
7171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Signature: ()V
71858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
71958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)"""
7204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
7214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                TestOptions())
72258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    self.assertEquals(1, len(jni_from_javap.called_by_natives))
723a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertGoldenTextEquals(jni_from_javap.GetContent())
72458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  def testSnippnetJavap6_7(self):
7261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    content_javap6 = """
7271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)public class java.util.HashSet {
7281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)public boolean add(java.lang.Object);
7291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Signature: (Ljava/lang/Object;)Z
7301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
7311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)"""
7321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    content_javap7 = """
7341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)public class java.util.HashSet {
7351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)public boolean add(E);
7361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Signature: (Ljava/lang/Object;)Z
7371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
7381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)"""
7391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    jni_from_javap6 = jni_generator.JNIFromJavaP(content_javap6.split('\n'),
7401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                 TestOptions())
7411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    jni_from_javap7 = jni_generator.JNIFromJavaP(content_javap7.split('\n'),
7421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                 TestOptions())
7431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    self.assertTrue(jni_from_javap6.GetContent())
7441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    self.assertTrue(jni_from_javap7.GetContent())
7451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    # Ensure the javap7 is correctly parsed and uses the Signature field rather
7461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    # than the "E" parameter.
7471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    self.assertTextEquals(jni_from_javap6.GetContent(),
7481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                          jni_from_javap7.GetContent())
7491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testFromJavaP(self):
751a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    contents = self._ReadGoldenFile(os.path.join(os.path.dirname(sys.argv[0]),
752a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        'testInputStream.javap'))
7534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
7544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                TestOptions())
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(10, len(jni_from_javap.called_by_natives))
756a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertGoldenTextEquals(jni_from_javap.GetContent())
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  def testConstantsFromJavaP(self):
759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    for f in ['testMotionEvent.javap', 'testMotionEvent.javap7']:
760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      contents = self._ReadGoldenFile(os.path.join(os.path.dirname(sys.argv[0]),
761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          f))
762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  TestOptions())
764a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      self.assertEquals(86, len(jni_from_javap.called_by_natives))
765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      self.assertGoldenTextEquals(jni_from_javap.GetContent())
766a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testREForNatives(self):
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # We should not match "native SyncSetupFlow" inside the comment.
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_data = """
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Invoked when the setup process is complete so we can disconnect from the
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * native-side SyncSetupFlowHandler.
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void destroy() {
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Log.v(TAG, "Destroying native SyncSetupFlow");
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (mNativeSyncSetupFlow != 0) {
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            nativeSyncSetupEnded(mNativeSyncSetupFlow);
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mNativeSyncSetupFlow = 0;
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private native void nativeSyncSetupEnded(
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int nativeAndroidSyncSetupFlowHandler);
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
7844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    jni_from_java = jni_generator.JNIFromJavaSource(
7854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_data, 'foo/bar', TestOptions())
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRaisesOnNonJNIMethod(self):
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_data = """
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class MyInnerClass {
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      private int Foo(int p0) {
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(SyntaxError,
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      jni_generator.JNIFromJavaSource,
7964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      test_data, 'foo/bar', TestOptions())
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testJniSelfDocumentingExample(self):
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script_dir = os.path.dirname(sys.argv[0])
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content = file(os.path.join(script_dir,
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        'java/src/org/chromium/example/jni_generator/SampleForTests.java')
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ).read()
8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    golden_file = os.path.join(script_dir, 'golden_sample_for_tests_jni.h')
8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    golden_content = file(golden_file).read()
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jni_from_java = jni_generator.JNIFromJavaSource(
8064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        content, 'org/chromium/example/jni_generator/SampleForTests',
8074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        TestOptions())
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    generated_text = jni_from_java.GetContent()
8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if not self.compareText(golden_content, generated_text):
8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if os.environ.get(REBASELINE_ENV):
8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        with file(golden_file, 'w') as f:
8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          f.write(generated_text)
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return
8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      self.fail('testJniSelfDocumentingExample')
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNoWrappingPreprocessorLines(self):
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_data = """
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    package com.google.lookhowextremelylongiam.snarf.icankeepthisupallday;
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class ReallyLongClassNamesAreAllTheRage {
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private static native int nativeTest();
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jni_from_java = jni_generator.JNIFromJavaSource(
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_data, ('com/google/lookhowextremelylongiam/snarf/'
8264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    'icankeepthisupallday/ReallyLongClassNamesAreAllTheRage'),
8274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        TestOptions())
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jni_lines = jni_from_java.GetContent().split('\n')
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line = filter(lambda line: line.lstrip().startswith('#ifndef'),
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  jni_lines)[0]
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(len(line) > 80,
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ('Expected #ifndef line to be > 80 chars: ', line))
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  def testJarJarRemapping(self):
835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    test_data = """
836868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    package org.chromium.example.jni_generator;
837868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
838868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    import org.chromium.example2.Test;
839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
8406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    import org.chromium.example3.PrefixFoo;
8416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    import org.chromium.example3.Prefix;
8426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    import org.chromium.example3.Bar$Inner;
8436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
844868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    class Example {
845868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      private static native void nativeTest(Test t);
8466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      private static native void nativeTest2(PrefixFoo t);
8476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      private static native void nativeTest3(Prefix t);
8486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      private static native void nativeTest4(Bar$Inner t);
849868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
850868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    """
851868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    jni_generator.JniParams.SetJarJarMappings(
852868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        """rule org.chromium.example.** com.test.@1
8536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        rule org.chromium.example2.** org.test2.@1
8546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        rule org.chromium.example3.Prefix org.test3.Test
8556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        rule org.chromium.example3.Bar$** org.test3.TestBar$@1""")
856868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    jni_from_java = jni_generator.JNIFromJavaSource(
8574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_data, 'org/chromium/example/jni_generator/Example', TestOptions())
858868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    jni_generator.JniParams.SetJarJarMappings('')
859a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertGoldenTextEquals(jni_from_java.GetContent())
860868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testImports(self):
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    import_header = """
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package org.chromium.content.app;
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.app.Service;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.Context;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.Intent;
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.graphics.SurfaceTexture;
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Bundle;
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.IBinder;
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.ParcelFileDescriptor;
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Process;
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.RemoteException;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.util.Log;
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.Surface;
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.ArrayList;
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.CalledByNative;
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.JNINamespace;
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.app.ContentMain;
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.SandboxedProcessConnection;
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.common.ISandboxedProcessCallback;
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.common.ISandboxedProcessService;
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.common.WillNotRaise.AnException;
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.common.WillRaise.AnException;
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import static org.chromium.Bar.Zoo;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Foo {
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public static class BookmarkNode implements Parcelable {
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public interface PasswordListObserver {
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jni_generator.JniParams.SetFullyQualifiedClass(
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'org/chromium/content/app/Foo')
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jni_generator.JniParams.ExtractImportsAndInnerClasses(import_header)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue('Lorg/chromium/content/common/ISandboxedProcessService' in
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    jni_generator.JniParams._imports)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue('Lorg/chromium/Bar/Zoo' in
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    jni_generator.JniParams._imports)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue('Lorg/chromium/content/app/Foo$BookmarkNode' in
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    jni_generator.JniParams._inner_classes)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue('Lorg/chromium/content/app/Foo$PasswordListObserver' in
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    jni_generator.JniParams._inner_classes)
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEquals('Lorg/chromium/content/app/ContentMain$Inner;',
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      jni_generator.JniParams.JavaToJni('ContentMain.Inner'))
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertRaises(SyntaxError,
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      jni_generator.JniParams.JavaToJni,
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      'AnException')
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testJniParamsJavaToJni(self):
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTextEquals('I', JniParams.JavaToJni('int'))
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTextEquals('[B', JniParams.JavaToJni('byte[]'))
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTextEquals(
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        '[Ljava/nio/ByteBuffer;', JniParams.JavaToJni('java/nio/ByteBuffer[]'))
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  def testNativesLong(self):
9250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    test_options = TestOptions()
9260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    test_options.ptr_type = 'long'
9270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    test_data = """"
9280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    private native void nativeDestroy(long nativeChromeBrowserProvider);
9290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    """
9300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    jni_generator.JniParams.ExtractImportsAndInnerClasses(test_data)
9310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    natives = jni_generator.ExtractNatives(test_data, test_options.ptr_type)
9320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    golden_natives = [
9330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        NativeMethod(return_type='void', static=False, name='Destroy',
9340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     params=[Param(datatype='long',
9350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                   name='nativeChromeBrowserProvider')],
9360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     java_class_name=None,
9370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     type='method',
9380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     p0_type='ChromeBrowserProvider',
9390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     ptr_type=test_options.ptr_type),
9400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    ]
9410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    self.assertListEquals(golden_natives, natives)
9420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
943a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             natives, [], [], test_options)
944a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self.assertGoldenTextEquals(h.GetContent())
9450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
9465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testPureNativeMethodsOption(self):
9475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_data = """
9485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    package org.chromium.example.jni_generator;
9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    /** The pointer to the native Test. */
9515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    long nativeTest;
9525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    class Test {
9545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        private static native long nativeMethod(long nativeTest, int arg1);
9555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
9565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    """
9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options = TestOptions()
9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options.pure_native_methods = True
9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    jni_from_java = jni_generator.JNIFromJavaSource(
9605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        test_data, 'org/chromium/example/jni_generator/Test', options)
9615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertGoldenTextEquals(jni_from_java.GetContent())
9625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testJNIInitNativeNameOption(self):
9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_data = """
9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    package org.chromium.example.jni_generator;
9665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    /** The pointer to the native Test. */
9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    long nativeTest;
9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    class Test {
9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        private static native boolean nativeInitNativeClass();
9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        private static native int nativeMethod(long nativeTest, int arg1);
9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    """
9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options = TestOptions()
9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options.jni_init_native_name = 'nativeInitNativeClass'
9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    jni_from_java = jni_generator.JNIFromJavaSource(
9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        test_data, 'org/chromium/example/jni_generator/Test', options)
9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertGoldenTextEquals(jni_from_java.GetContent())
9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testEagerCalledByNativesOption(self):
9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_data = """
9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    package org.chromium.example.jni_generator;
9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    /** The pointer to the native Test. */
9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    long nativeTest;
9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    class Test {
9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        private static native boolean nativeInitNativeClass();
9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        private static native int nativeMethod(long nativeTest, int arg1);
9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        @CalledByNative
9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        private void testMethodWithParam(int iParam);
9935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        @CalledByNative
9945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        private static int testStaticMethodWithParam(int iParam);
9955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        @CalledByNative
9965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        private static double testMethodWithNoParam();
9975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        @CalledByNative
9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        private static String testStaticMethodWithNoParam();
9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    """
10015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options = TestOptions()
10025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options.jni_init_native_name = 'nativeInitNativeClass'
10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    options.eager_called_by_natives = True
10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    jni_from_java = jni_generator.JNIFromJavaSource(
10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        test_data, 'org/chromium/example/jni_generator/Test', options)
10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertGoldenTextEquals(jni_from_java.GetContent())
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def testNativeExportsOption(self):
10096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test_data = """
10106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    package org.chromium.example.jni_generator;
10116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
10126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    /** The pointer to the native Test. */
10136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    long nativeTest;
10146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
10156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    class Test {
10166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private static native boolean nativeInitNativeClass();
10176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private static native int nativeStaticMethod(long nativeTest, int arg1);
10186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private native int nativeMethod(long nativeTest, int arg1);
10196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @CalledByNative
10206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private void testMethodWithParam(int iParam);
10216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @CalledByNative
10226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private String testMethodWithParamAndReturn(int iParam);
10236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @CalledByNative
10246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private static int testStaticMethodWithParam(int iParam);
10256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @CalledByNative
10266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private static double testMethodWithNoParam();
10276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @CalledByNative
10286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private static String testStaticMethodWithNoParam();
10296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
10306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        class MyInnerClass {
10316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          @NativeCall("MyInnerClass")
10326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          private native int nativeInit();
10336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
10346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        class MyOtherInnerClass {
10356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          @NativeCall("MyOtherInnerClass")
10366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          private native int nativeInit();
10376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
10386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
10396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    """
10406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    options = TestOptions()
10416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    options.jni_init_native_name = 'nativeInitNativeClass'
10426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    options.native_exports = True
10436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    jni_from_java = jni_generator.JNIFromJavaSource(
10446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test_data, 'org/chromium/example/jni_generator/SampleForTests', options)
10456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertGoldenTextEquals(jni_from_java.GetContent())
10466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1047effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def testOuterInnerRaises(self):
1048effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    test_data = """
1049effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    package org.chromium.media;
1050effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1051effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    @CalledByNative
1052effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    static int getCaptureFormatWidth(VideoCapture.CaptureFormat format) {
1053effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        return format.getWidth();
1054effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
1055effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    """
1056effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    def willRaise():
1057effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      jni_generator.JNIFromJavaSource(
1058effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          test_data,
1059effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          'org/chromium/media/VideoCaptureFactory',
1060effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          TestOptions())
1061effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self.assertRaises(SyntaxError, willRaise)
1062effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1063010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testImplicitImport(self):
1064010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    test_data = """
1065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    package org.chromium.android_webview;
1066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1067010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    %(IMPORT)s
1068010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    @CalledByNative
1070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    private static void clientCertificatesCleared(Runnable callback) {
1071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        if (callbaback == null) return;
1072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        callback.run();
1073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
1074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    """
1075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    def generate(import_clause):
1076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      jni_generator.JNIFromJavaSource(
1077010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          test_data % {'IMPORT': import_clause},
1078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          'org/chromium/android_webview/AwContentStatics',
1079010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          TestOptions())
1080010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # Ensure it raises without the import.
1081010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertRaises(SyntaxError, lambda: generate(''))
1082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1083010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # Ensure it's fine with the import.
1084010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    generate('import java.lang.Runnable;')
1085010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1086cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def testSingleJNIAdditionalImport(self):
1087cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    test_data = """
1088cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    package org.chromium.foo;
1089cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1090cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    @JNIAdditionalImport(Bar.class)
1091cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    class Foo {
1092cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1093cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    @CalledByNative
1094cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    private static void calledByNative(Bar.Callback callback) {
1095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
1096cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1097cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    private static native void nativeDoSomething(Bar.Callback callback);
1098cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
1099cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """
1100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    jni_from_java = jni_generator.JNIFromJavaSource(test_data,
1101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                    'org/chromium/foo/Foo',
1102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                    TestOptions())
1103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.assertGoldenTextEquals(jni_from_java.GetContent())
1104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def testMultipleJNIAdditionalImport(self):
1106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    test_data = """
1107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    package org.chromium.foo;
1108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    @JNIAdditionalImport({Bar1.class, Bar2.class})
1110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    class Foo {
1111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    @CalledByNative
1113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    private static void calledByNative(Bar1.Callback callback1,
1114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       Bar2.Callback callback2) {
1115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
1116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    private static native void nativeDoSomething(Bar1.Callback callback1,
1118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 Bar2.Callback callback2);
1119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
1120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """
1121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    jni_from_java = jni_generator.JNIFromJavaSource(test_data,
1122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                    'org/chromium/foo/Foo',
1123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                    TestOptions())
1124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.assertGoldenTextEquals(jni_from_java.GetContent())
1125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unittest.main()
1129