| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Tests for jni_generator.py. | 6 """Tests for jni_generator.py. |
| 7 | 7 |
| 8 This test suite contains various tests for the JNI generator. | 8 This test suite contains various tests for the JNI generator. |
| 9 It exercises the low-level parser all the way up to the | 9 It exercises the low-level parser all the way up to the |
| 10 code generator and ensures the output matches a golden | 10 code generator and ensures the output matches a golden |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 # files. | 30 # files. |
| 31 REBASELINE_ENV = 'REBASELINE' | 31 REBASELINE_ENV = 'REBASELINE' |
| 32 | 32 |
| 33 class TestOptions(object): | 33 class TestOptions(object): |
| 34 """The mock options object which is passed to the jni_generator.py script.""" | 34 """The mock options object which is passed to the jni_generator.py script.""" |
| 35 | 35 |
| 36 def __init__(self): | 36 def __init__(self): |
| 37 self.namespace = None | 37 self.namespace = None |
| 38 self.script_name = SCRIPT_NAME | 38 self.script_name = SCRIPT_NAME |
| 39 self.includes = INCLUDES | 39 self.includes = INCLUDES |
| 40 self.pure_native_methods = False | |
| 41 self.ptr_type = 'long' | 40 self.ptr_type = 'long' |
| 42 self.jni_init_native_name = None | |
| 43 self.eager_called_by_natives = False | |
| 44 self.cpp = 'cpp' | 41 self.cpp = 'cpp' |
| 45 self.javap = 'javap' | 42 self.javap = 'javap' |
| 46 self.native_exports = False | 43 self.native_exports = False |
| 47 self.native_exports_optional = False | 44 self.native_exports_optional = False |
| 48 | 45 |
| 49 class TestGenerator(unittest.TestCase): | 46 class TestGenerator(unittest.TestCase): |
| 50 def assertObjEquals(self, first, second): | 47 def assertObjEquals(self, first, second): |
| 51 dict_first = first.__dict__ | 48 dict_first = first.__dict__ |
| 52 dict_second = second.__dict__ | 49 dict_second = second.__dict__ |
| 53 self.assertEquals(dict_first.keys(), dict_second.keys()) | 50 self.assertEquals(dict_first.keys(), dict_second.keys()) |
| (...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 jni_from_java = jni_generator.JNIFromJavaSource( | 843 jni_from_java = jni_generator.JNIFromJavaSource( |
| 847 test_data, ('com/google/lookhowextremelylongiam/snarf/' | 844 test_data, ('com/google/lookhowextremelylongiam/snarf/' |
| 848 'icankeepthisupallday/ReallyLongClassNamesAreAllTheRage'), | 845 'icankeepthisupallday/ReallyLongClassNamesAreAllTheRage'), |
| 849 TestOptions()) | 846 TestOptions()) |
| 850 jni_lines = jni_from_java.GetContent().split('\n') | 847 jni_lines = jni_from_java.GetContent().split('\n') |
| 851 line = filter(lambda line: line.lstrip().startswith('#ifndef'), | 848 line = filter(lambda line: line.lstrip().startswith('#ifndef'), |
| 852 jni_lines)[0] | 849 jni_lines)[0] |
| 853 self.assertTrue(len(line) > 80, | 850 self.assertTrue(len(line) > 80, |
| 854 ('Expected #ifndef line to be > 80 chars: ', line)) | 851 ('Expected #ifndef line to be > 80 chars: ', line)) |
| 855 | 852 |
| 856 def testJarJarRemapping(self): | |
| 857 test_data = """ | |
| 858 package org.chromium.example.jni_generator; | |
| 859 | |
| 860 import org.chromium.example2.Test; | |
| 861 | |
| 862 import org.chromium.example3.PrefixFoo; | |
| 863 import org.chromium.example3.Prefix; | |
| 864 import org.chromium.example3.Bar$Inner; | |
| 865 | |
| 866 class Example { | |
| 867 private static native void nativeTest(Test t); | |
| 868 private static native void nativeTest2(PrefixFoo t); | |
| 869 private static native void nativeTest3(Prefix t); | |
| 870 private static native void nativeTest4(Bar$Inner t); | |
| 871 } | |
| 872 """ | |
| 873 jni_generator.JniParams.SetJarJarMappings( | |
| 874 """rule org.chromium.example.** com.test.@1 | |
| 875 rule org.chromium.example2.** org.test2.@1 | |
| 876 rule org.chromium.example3.Prefix org.test3.Test | |
| 877 rule org.chromium.example3.Bar$** org.test3.TestBar$@1""") | |
| 878 jni_from_java = jni_generator.JNIFromJavaSource( | |
| 879 test_data, 'org/chromium/example/jni_generator/Example', TestOptions()) | |
| 880 jni_generator.JniParams.SetJarJarMappings('') | |
| 881 self.assertGoldenTextEquals(jni_from_java.GetContent()) | |
| 882 | |
| 883 def testImports(self): | 853 def testImports(self): |
| 884 import_header = """ | 854 import_header = """ |
| 885 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 855 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 886 // Use of this source code is governed by a BSD-style license that can be | 856 // Use of this source code is governed by a BSD-style license that can be |
| 887 // found in the LICENSE file. | 857 // found in the LICENSE file. |
| 888 | 858 |
| 889 package org.chromium.content.app; | 859 package org.chromium.content.app; |
| 890 | 860 |
| 891 import android.app.Service; | 861 import android.app.Service; |
| 892 import android.content.Context; | 862 import android.content.Context; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 958 java_class_name=None, | 928 java_class_name=None, |
| 959 type='method', | 929 type='method', |
| 960 p0_type='ChromeBrowserProvider', | 930 p0_type='ChromeBrowserProvider', |
| 961 ptr_type=test_options.ptr_type), | 931 ptr_type=test_options.ptr_type), |
| 962 ] | 932 ] |
| 963 self.assertListEquals(golden_natives, natives) | 933 self.assertListEquals(golden_natives, natives) |
| 964 h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni', | 934 h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni', |
| 965 natives, [], [], test_options) | 935 natives, [], [], test_options) |
| 966 self.assertGoldenTextEquals(h.GetContent()) | 936 self.assertGoldenTextEquals(h.GetContent()) |
| 967 | 937 |
| 968 def testPureNativeMethodsOption(self): | |
| 969 test_data = """ | |
| 970 package org.chromium.example.jni_generator; | |
| 971 | |
| 972 /** The pointer to the native Test. */ | |
| 973 long nativeTest; | |
| 974 | |
| 975 class Test { | |
| 976 private static native long nativeMethod(long nativeTest, int arg1); | |
| 977 } | |
| 978 """ | |
| 979 options = TestOptions() | |
| 980 options.pure_native_methods = True | |
| 981 jni_from_java = jni_generator.JNIFromJavaSource( | |
| 982 test_data, 'org/chromium/example/jni_generator/Test', options) | |
| 983 self.assertGoldenTextEquals(jni_from_java.GetContent()) | |
| 984 | |
| 985 def testJNIInitNativeNameOption(self): | |
| 986 test_data = """ | |
| 987 package org.chromium.example.jni_generator; | |
| 988 | |
| 989 /** The pointer to the native Test. */ | |
| 990 long nativeTest; | |
| 991 | |
| 992 class Test { | |
| 993 private static native boolean nativeInitNativeClass(); | |
| 994 private static native int nativeMethod(long nativeTest, int arg1); | |
| 995 } | |
| 996 """ | |
| 997 options = TestOptions() | |
| 998 options.jni_init_native_name = 'nativeInitNativeClass' | |
| 999 jni_from_java = jni_generator.JNIFromJavaSource( | |
| 1000 test_data, 'org/chromium/example/jni_generator/Test', options) | |
| 1001 self.assertGoldenTextEquals(jni_from_java.GetContent()) | |
| 1002 | |
| 1003 def testEagerCalledByNativesOption(self): | |
| 1004 test_data = """ | |
| 1005 package org.chromium.example.jni_generator; | |
| 1006 | |
| 1007 /** The pointer to the native Test. */ | |
| 1008 long nativeTest; | |
| 1009 | |
| 1010 class Test { | |
| 1011 private static native boolean nativeInitNativeClass(); | |
| 1012 private static native int nativeMethod(long nativeTest, int arg1); | |
| 1013 @CalledByNative | |
| 1014 private void testMethodWithParam(int iParam); | |
| 1015 @CalledByNative | |
| 1016 private static int testStaticMethodWithParam(int iParam); | |
| 1017 @CalledByNative | |
| 1018 private static double testMethodWithNoParam(); | |
| 1019 @CalledByNative | |
| 1020 private static String testStaticMethodWithNoParam(); | |
| 1021 } | |
| 1022 """ | |
| 1023 options = TestOptions() | |
| 1024 options.jni_init_native_name = 'nativeInitNativeClass' | |
| 1025 options.eager_called_by_natives = True | |
| 1026 jni_from_java = jni_generator.JNIFromJavaSource( | |
| 1027 test_data, 'org/chromium/example/jni_generator/Test', options) | |
| 1028 self.assertGoldenTextEquals(jni_from_java.GetContent()) | |
| 1029 | |
| 1030 def runNativeExportsOption(self, optional): | 938 def runNativeExportsOption(self, optional): |
| 1031 test_data = """ | 939 test_data = """ |
| 1032 package org.chromium.example.jni_generator; | 940 package org.chromium.example.jni_generator; |
| 1033 | 941 |
| 1034 /** The pointer to the native Test. */ | 942 /** The pointer to the native Test. */ |
| 1035 long nativeTest; | 943 long nativeTest; |
| 1036 | 944 |
| 1037 class Test { | 945 class Test { |
| 1038 private static native boolean nativeInitNativeClass(); | |
| 1039 private static native int nativeStaticMethod(long nativeTest, int arg1); | 946 private static native int nativeStaticMethod(long nativeTest, int arg1); |
| 1040 private native int nativeMethod(long nativeTest, int arg1); | 947 private native int nativeMethod(long nativeTest, int arg1); |
| 1041 @CalledByNative | 948 @CalledByNative |
| 1042 private void testMethodWithParam(int iParam); | 949 private void testMethodWithParam(int iParam); |
| 1043 @CalledByNative | 950 @CalledByNative |
| 1044 private String testMethodWithParamAndReturn(int iParam); | 951 private String testMethodWithParamAndReturn(int iParam); |
| 1045 @CalledByNative | 952 @CalledByNative |
| 1046 private static int testStaticMethodWithParam(int iParam); | 953 private static int testStaticMethodWithParam(int iParam); |
| 1047 @CalledByNative | 954 @CalledByNative |
| 1048 private static double testMethodWithNoParam(); | 955 private static double testMethodWithNoParam(); |
| 1049 @CalledByNative | 956 @CalledByNative |
| 1050 private static String testStaticMethodWithNoParam(); | 957 private static String testStaticMethodWithNoParam(); |
| 1051 | 958 |
| 1052 class MyInnerClass { | 959 class MyInnerClass { |
| 1053 @NativeCall("MyInnerClass") | 960 @NativeCall("MyInnerClass") |
| 1054 private native int nativeInit(); | 961 private native int nativeInit(); |
| 1055 } | 962 } |
| 1056 class MyOtherInnerClass { | 963 class MyOtherInnerClass { |
| 1057 @NativeCall("MyOtherInnerClass") | 964 @NativeCall("MyOtherInnerClass") |
| 1058 private native int nativeInit(); | 965 private native int nativeInit(); |
| 1059 } | 966 } |
| 1060 } | 967 } |
| 1061 """ | 968 """ |
| 1062 options = TestOptions() | 969 options = TestOptions() |
| 1063 options.jni_init_native_name = 'nativeInitNativeClass' | |
| 1064 options.native_exports = True | 970 options.native_exports = True |
| 1065 options.native_exports_optional = optional | 971 options.native_exports_optional = optional |
| 1066 jni_from_java = jni_generator.JNIFromJavaSource( | 972 jni_from_java = jni_generator.JNIFromJavaSource( |
| 1067 test_data, 'org/chromium/example/jni_generator/SampleForTests', options) | 973 test_data, 'org/chromium/example/jni_generator/SampleForTests', options) |
| 1068 return jni_from_java.GetContent() | 974 return jni_from_java.GetContent() |
| 1069 | 975 |
| 1070 def testNativeExportsOption(self): | 976 def testNativeExportsOption(self): |
| 1071 content = self.runNativeExportsOption(False) | 977 content = self.runNativeExportsOption(False) |
| 1072 self.assertGoldenTextEquals(content) | 978 self.assertGoldenTextEquals(content) |
| 1073 | 979 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1149 test_result = unittest.main(argv=argv[0:1], exit=False) | 1055 test_result = unittest.main(argv=argv[0:1], exit=False) |
| 1150 | 1056 |
| 1151 if test_result.result.wasSuccessful() and options.stamp: | 1057 if test_result.result.wasSuccessful() and options.stamp: |
| 1152 TouchStamp(options.stamp) | 1058 TouchStamp(options.stamp) |
| 1153 | 1059 |
| 1154 return not test_result.result.wasSuccessful() | 1060 return not test_result.result.wasSuccessful() |
| 1155 | 1061 |
| 1156 | 1062 |
| 1157 if __name__ == '__main__': | 1063 if __name__ == '__main__': |
| 1158 sys.exit(main(sys.argv)) | 1064 sys.exit(main(sys.argv)) |
| OLD | NEW |