xref: /aosp_15_r20/libnativehelper/tests/JniSafeRegisterNativeMethods_test.cpp (revision 0797b24ee566c78eb48500180cb4bf71f81c8aab)
1*0797b24eSAndroid Build Coastguard Worker /*
2*0797b24eSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*0797b24eSAndroid Build Coastguard Worker  *
4*0797b24eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*0797b24eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*0797b24eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*0797b24eSAndroid Build Coastguard Worker  *
8*0797b24eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*0797b24eSAndroid Build Coastguard Worker  *
10*0797b24eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*0797b24eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*0797b24eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*0797b24eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*0797b24eSAndroid Build Coastguard Worker  * limitations under the License.
15*0797b24eSAndroid Build Coastguard Worker  */
16*0797b24eSAndroid Build Coastguard Worker 
17*0797b24eSAndroid Build Coastguard Worker #include <gtest/gtest.h>
18*0797b24eSAndroid Build Coastguard Worker #include <sstream>
19*0797b24eSAndroid Build Coastguard Worker 
20*0797b24eSAndroid Build Coastguard Worker #define PARSE_FAILURES_NONFATAL  // return empty optionals wherever possible instead of asserting.
21*0797b24eSAndroid Build Coastguard Worker #include "nativehelper/jni_macros.h"
22*0797b24eSAndroid Build Coastguard Worker 
23*0797b24eSAndroid Build Coastguard Worker template <typename T>
stringify_helper(const T & val)24*0797b24eSAndroid Build Coastguard Worker std::string stringify_helper(const T& val) {
25*0797b24eSAndroid Build Coastguard Worker   std::stringstream ss;
26*0797b24eSAndroid Build Coastguard Worker   ss << val;
27*0797b24eSAndroid Build Coastguard Worker   return ss.str();
28*0797b24eSAndroid Build Coastguard Worker }
29*0797b24eSAndroid Build Coastguard Worker 
30*0797b24eSAndroid Build Coastguard Worker #define EXPECT_STRINGIFY_EQ(x, y) EXPECT_EQ(stringify_helper(x), stringify_helper(y))
31*0797b24eSAndroid Build Coastguard Worker 
TEST(JniSafeRegisterNativeMethods,StringParsing)32*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, StringParsing) {
33*0797b24eSAndroid Build Coastguard Worker   using namespace nativehelper::detail;  // NOLINT
34*0797b24eSAndroid Build Coastguard Worker 
35*0797b24eSAndroid Build Coastguard Worker   // Super basic bring-up tests for core functionality.
36*0797b24eSAndroid Build Coastguard Worker 
37*0797b24eSAndroid Build Coastguard Worker   {
38*0797b24eSAndroid Build Coastguard Worker     constexpr ConstexprStringView v_str = "V";
39*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ(1u, v_str.size());
40*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ(false, v_str.empty());
41*0797b24eSAndroid Build Coastguard Worker 
42*0797b24eSAndroid Build Coastguard Worker     std::stringstream ss;
43*0797b24eSAndroid Build Coastguard Worker     ss << v_str;
44*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ("V", ss.str());
45*0797b24eSAndroid Build Coastguard Worker   }
46*0797b24eSAndroid Build Coastguard Worker 
47*0797b24eSAndroid Build Coastguard Worker   {
48*0797b24eSAndroid Build Coastguard Worker     auto parse = ParseSingleTypeDescriptor("", /*allow_void*/true);
49*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ("", parse->token);
50*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ("", parse->remainder);
51*0797b24eSAndroid Build Coastguard Worker   }
52*0797b24eSAndroid Build Coastguard Worker 
53*0797b24eSAndroid Build Coastguard Worker   {
54*0797b24eSAndroid Build Coastguard Worker     auto parse = ParseSingleTypeDescriptor("V", /*allow_void*/true);
55*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ("V", parse->token);
56*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ("", parse->remainder);
57*0797b24eSAndroid Build Coastguard Worker   }
58*0797b24eSAndroid Build Coastguard Worker 
59*0797b24eSAndroid Build Coastguard Worker   {
60*0797b24eSAndroid Build Coastguard Worker     auto parse = ParseSingleTypeDescriptor("[I");
61*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ("[I", parse->token);
62*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ("", parse->remainder);
63*0797b24eSAndroid Build Coastguard Worker   }
64*0797b24eSAndroid Build Coastguard Worker 
65*0797b24eSAndroid Build Coastguard Worker   {
66*0797b24eSAndroid Build Coastguard Worker     auto parse = ParseSingleTypeDescriptor("LObject;");
67*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ("LObject;", parse->token);
68*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ("", parse->remainder);
69*0797b24eSAndroid Build Coastguard Worker   }
70*0797b24eSAndroid Build Coastguard Worker 
71*0797b24eSAndroid Build Coastguard Worker   {
72*0797b24eSAndroid Build Coastguard Worker     auto parse = ParseSingleTypeDescriptor("LBadObject);");
73*0797b24eSAndroid Build Coastguard Worker     EXPECT_FALSE(parse.has_value());
74*0797b24eSAndroid Build Coastguard Worker   }
75*0797b24eSAndroid Build Coastguard Worker 
76*0797b24eSAndroid Build Coastguard Worker   {
77*0797b24eSAndroid Build Coastguard Worker     auto parse = ParseSingleTypeDescriptor("LBadObject(;");
78*0797b24eSAndroid Build Coastguard Worker     EXPECT_FALSE(parse.has_value());
79*0797b24eSAndroid Build Coastguard Worker   }
80*0797b24eSAndroid Build Coastguard Worker 
81*0797b24eSAndroid Build Coastguard Worker   {
82*0797b24eSAndroid Build Coastguard Worker     auto parse = ParseSingleTypeDescriptor("LBadObject[;");
83*0797b24eSAndroid Build Coastguard Worker     EXPECT_FALSE(parse.has_value());
84*0797b24eSAndroid Build Coastguard Worker   }
85*0797b24eSAndroid Build Coastguard Worker 
86*0797b24eSAndroid Build Coastguard Worker   // Stringify is used for convenience to make writing out tests easier.
87*0797b24eSAndroid Build Coastguard Worker   // Transforms as "(XYZ)W" -> "args={X,Y,Z}, ret=W"
88*0797b24eSAndroid Build Coastguard Worker 
89*0797b24eSAndroid Build Coastguard Worker #define PARSE_SIGNATURE_AS_LIST(str) (ParseSignatureAsList<sizeof(str)>(str))
90*0797b24eSAndroid Build Coastguard Worker 
91*0797b24eSAndroid Build Coastguard Worker   {
92*0797b24eSAndroid Build Coastguard Worker     constexpr auto jni_descriptor = PARSE_SIGNATURE_AS_LIST("()V");
93*0797b24eSAndroid Build Coastguard Worker     EXPECT_STRINGIFY_EQ("args={}, ret=V", jni_descriptor);
94*0797b24eSAndroid Build Coastguard Worker   }
95*0797b24eSAndroid Build Coastguard Worker 
96*0797b24eSAndroid Build Coastguard Worker   {
97*0797b24eSAndroid Build Coastguard Worker     constexpr auto
98*0797b24eSAndroid Build Coastguard Worker         jni_descriptor = PARSE_SIGNATURE_AS_LIST("()Ljava/lang/Object;");
99*0797b24eSAndroid Build Coastguard Worker     EXPECT_STRINGIFY_EQ("args={}, ret=Ljava/lang/Object;", jni_descriptor);
100*0797b24eSAndroid Build Coastguard Worker   }
101*0797b24eSAndroid Build Coastguard Worker 
102*0797b24eSAndroid Build Coastguard Worker   {
103*0797b24eSAndroid Build Coastguard Worker     constexpr auto jni_descriptor = PARSE_SIGNATURE_AS_LIST("()[I");
104*0797b24eSAndroid Build Coastguard Worker     EXPECT_STRINGIFY_EQ("args={}, ret=[I", jni_descriptor);
105*0797b24eSAndroid Build Coastguard Worker   }
106*0797b24eSAndroid Build Coastguard Worker 
107*0797b24eSAndroid Build Coastguard Worker #define EXPECT_OK_SIGNATURE_PARSE(signature, args, ret) \
108*0797b24eSAndroid Build Coastguard Worker   do { \
109*0797b24eSAndroid Build Coastguard Worker     constexpr auto jni_descriptor = PARSE_SIGNATURE_AS_LIST(signature); \
110*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ(true, jni_descriptor.has_value());                        \
111*0797b24eSAndroid Build Coastguard Worker     EXPECT_STRINGIFY_EQ("args={" args "}, ret=" ret, jni_descriptor);   \
112*0797b24eSAndroid Build Coastguard Worker   } while (0)
113*0797b24eSAndroid Build Coastguard Worker 
114*0797b24eSAndroid Build Coastguard Worker   // Exhaustive tests for successful parsing.
115*0797b24eSAndroid Build Coastguard Worker 
116*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()V", /*args*/"", /*ret*/"V");
117*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()Z", /*args*/"", /*ret*/"Z");
118*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()B", /*args*/"", /*ret*/"B");
119*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()C", /*args*/"", /*ret*/"C");
120*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()S", /*args*/"", /*ret*/"S");
121*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()I", /*args*/"", /*ret*/"I");
122*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()F", /*args*/"", /*ret*/"F");
123*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()J", /*args*/"", /*ret*/"J");
124*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()D", /*args*/"", /*ret*/"D");
125*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()Ljava/lang/Object;", /*args*/"", /*ret*/"Ljava/lang/Object;");
126*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()[Ljava/lang/Object;", /*args*/"", /*ret*/"[Ljava/lang/Object;");
127*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()[I", /*args*/"", /*ret*/"[I");
128*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()[[I", /*args*/"", /*ret*/"[[I");
129*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("()[[[I", /*args*/"", /*ret*/"[[[I");
130*0797b24eSAndroid Build Coastguard Worker 
131*0797b24eSAndroid Build Coastguard Worker 
132*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("(Z)V", /*args*/"Z", /*ret*/"V");
133*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("(B)V", /*args*/"B", /*ret*/"V");
134*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("(C)D", /*args*/"C", /*ret*/"D");
135*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("(S)V", /*args*/"S", /*ret*/"V");
136*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("(I)V", /*args*/"I", /*ret*/"V");
137*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("(F)V", /*args*/"F", /*ret*/"V");
138*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("(J)F", /*args*/"J", /*ret*/"F");
139*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("(D)V", /*args*/"D", /*ret*/"V");
140*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("(Ljava/lang/Object;)V", "Ljava/lang/Object;", "V");
141*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("([Ljava/lang/Object;)V",
142*0797b24eSAndroid Build Coastguard Worker                             "[Ljava/lang/Object;",
143*0797b24eSAndroid Build Coastguard Worker                             "V");
144*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("([I)V", /*ret*/"[I", "V");
145*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("([[I)V", /*ret*/"[[I", "V");
146*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("([[[I)V", /*ret*/"[[[I", "V");
147*0797b24eSAndroid Build Coastguard Worker 
148*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("(ZIJ)V", /*args*/"Z,I,J", /*ret*/"V");
149*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("(B[IJ)V", /*args*/"B,[I,J", /*ret*/"V");
150*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("(Ljava/lang/Object;B)D",
151*0797b24eSAndroid Build Coastguard Worker                             /*args*/"Ljava/lang/Object;,B",
152*0797b24eSAndroid Build Coastguard Worker                             /*ret*/"D");
153*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("(Ljava/lang/Object;Ljava/lang/String;IF)D",
154*0797b24eSAndroid Build Coastguard Worker                             /*args*/"Ljava/lang/Object;,Ljava/lang/String;,I,F",
155*0797b24eSAndroid Build Coastguard Worker                             /*ret*/"D");
156*0797b24eSAndroid Build Coastguard Worker   EXPECT_OK_SIGNATURE_PARSE("([[[Ljava/lang/Object;Ljava/lang/String;IF)D",
157*0797b24eSAndroid Build Coastguard Worker                             /*args*/"[[[Ljava/lang/Object;,Ljava/lang/String;,I,F",
158*0797b24eSAndroid Build Coastguard Worker                             /*ret*/"D");
159*0797b24eSAndroid Build Coastguard Worker 
160*0797b24eSAndroid Build Coastguard Worker   /*
161*0797b24eSAndroid Build Coastguard Worker    * Test Failures in Parsing
162*0797b24eSAndroid Build Coastguard Worker    */
163*0797b24eSAndroid Build Coastguard Worker 
164*0797b24eSAndroid Build Coastguard Worker #define EXPECT_FAILED_SIGNATURE_PARSE(jni_descriptor) \
165*0797b24eSAndroid Build Coastguard Worker   EXPECT_STRINGIFY_EQ(ConstexprOptional<JniSignatureDescriptor<sizeof(jni_descriptor)>>{},\
166*0797b24eSAndroid Build Coastguard Worker                       ParseSignatureAsList<sizeof(jni_descriptor)>(jni_descriptor))
167*0797b24eSAndroid Build Coastguard Worker 
168*0797b24eSAndroid Build Coastguard Worker   // For the failures to work we must turn off 'PARSE_FAILURES_FATAL'.
169*0797b24eSAndroid Build Coastguard Worker   // Otherwise they immediately cause a crash, which is actually the desired behavior
170*0797b24eSAndroid Build Coastguard Worker   // when this is used by the end-user in REGISTER_NATIVE_METHOD.
171*0797b24eSAndroid Build Coastguard Worker   {
172*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("");
173*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("A");
174*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE(")");
175*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("V");
176*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("(");
177*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("(A");
178*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("()");
179*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("()A");
180*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("()VV");
181*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("()L");
182*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("()L;");
183*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("()BAD;");
184*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("()Ljava/lang/Object");
185*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("()Ljava/lang/Object;X");
186*0797b24eSAndroid Build Coastguard Worker 
187*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("(V)V");
188*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("(ILcat)V");
189*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("([dog)V");
190*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("(IV)V");
191*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("([V)V");
192*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("([[V)V");
193*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("()v");
194*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("()i");
195*0797b24eSAndroid Build Coastguard Worker     EXPECT_FAILED_SIGNATURE_PARSE("()f");
196*0797b24eSAndroid Build Coastguard Worker   }
197*0797b24eSAndroid Build Coastguard Worker 
198*0797b24eSAndroid Build Coastguard Worker }
199*0797b24eSAndroid Build Coastguard Worker 
200*0797b24eSAndroid Build Coastguard Worker #define EXPECT_IS_VALID_JNI_ARGUMENT_TYPE(expected, expr) \
201*0797b24eSAndroid Build Coastguard Worker  { constexpr bool is_valid = (expr); \
202*0797b24eSAndroid Build Coastguard Worker    EXPECT_EQ(expected, is_valid) << #expr; \
203*0797b24eSAndroid Build Coastguard Worker  }
204*0797b24eSAndroid Build Coastguard Worker 
205*0797b24eSAndroid Build Coastguard Worker // Basic smoke tests for parameter validity.
206*0797b24eSAndroid Build Coastguard Worker // See below for more exhaustive tests.
TEST(JniSafeRegisterNativeMethods,ParameterTypes)207*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, ParameterTypes) {
208*0797b24eSAndroid Build Coastguard Worker   using namespace nativehelper::detail;  // NOLINT
209*0797b24eSAndroid Build Coastguard Worker   EXPECT_TRUE(IsJniParameterCountValid(kCriticalNative, 0u));
210*0797b24eSAndroid Build Coastguard Worker   EXPECT_TRUE(IsJniParameterCountValid(kCriticalNative, 1u));
211*0797b24eSAndroid Build Coastguard Worker   EXPECT_TRUE(IsJniParameterCountValid(kCriticalNative, 2u));
212*0797b24eSAndroid Build Coastguard Worker   EXPECT_TRUE(IsJniParameterCountValid(kCriticalNative, 3u));
213*0797b24eSAndroid Build Coastguard Worker   EXPECT_TRUE(IsJniParameterCountValid(kCriticalNative, 4u));
214*0797b24eSAndroid Build Coastguard Worker 
215*0797b24eSAndroid Build Coastguard Worker   EXPECT_FALSE(IsJniParameterCountValid(kNormalNative, 0u));
216*0797b24eSAndroid Build Coastguard Worker   EXPECT_FALSE(IsJniParameterCountValid(kNormalNative, 1u));
217*0797b24eSAndroid Build Coastguard Worker   EXPECT_TRUE(IsJniParameterCountValid(kNormalNative, 2u));
218*0797b24eSAndroid Build Coastguard Worker   EXPECT_TRUE(IsJniParameterCountValid(kNormalNative, 3u));
219*0797b24eSAndroid Build Coastguard Worker   EXPECT_TRUE(IsJniParameterCountValid(kNormalNative, 4u));
220*0797b24eSAndroid Build Coastguard Worker 
221*0797b24eSAndroid Build Coastguard Worker   EXPECT_TRUE((IsValidJniParameter<void>(kNormalNative, kReturnPosition)));
222*0797b24eSAndroid Build Coastguard Worker   EXPECT_IS_VALID_JNI_ARGUMENT_TYPE(true,(is_valid_jni_argument_type<kNormalNative, /*pos*/0u, JNIEnv*>::value));
223*0797b24eSAndroid Build Coastguard Worker   EXPECT_IS_VALID_JNI_ARGUMENT_TYPE(true,(is_valid_jni_argument_type<kNormalNative, /*pos*/1u, jobject>::value));
224*0797b24eSAndroid Build Coastguard Worker   EXPECT_IS_VALID_JNI_ARGUMENT_TYPE(true,(is_valid_jni_argument_type<kNormalNative, /*pos*/1u, jclass>::value));
225*0797b24eSAndroid Build Coastguard Worker   EXPECT_IS_VALID_JNI_ARGUMENT_TYPE(false,(is_valid_jni_argument_type<kNormalNative, /*pos*/1u, jstring>::value));
226*0797b24eSAndroid Build Coastguard Worker }
227*0797b24eSAndroid Build Coastguard Worker 
228*0797b24eSAndroid Build Coastguard Worker struct TestReturnAnything {
229*0797b24eSAndroid Build Coastguard Worker   template <typename T>
operator TTestReturnAnything230*0797b24eSAndroid Build Coastguard Worker   operator T() const {  // NOLINT
231*0797b24eSAndroid Build Coastguard Worker     return T{};
232*0797b24eSAndroid Build Coastguard Worker   }
233*0797b24eSAndroid Build Coastguard Worker };
234*0797b24eSAndroid Build Coastguard Worker 
235*0797b24eSAndroid Build Coastguard Worker namespace test_jni {
empty_fn()236*0797b24eSAndroid Build Coastguard Worker   void empty_fn() {}
237*0797b24eSAndroid Build Coastguard Worker }
238*0797b24eSAndroid Build Coastguard Worker struct TestJni {
239*0797b24eSAndroid Build Coastguard Worker 
240*0797b24eSAndroid Build Coastguard Worker #pragma clang diagnostic push
241*0797b24eSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wunused-parameter"
242*0797b24eSAndroid Build Coastguard Worker 
243*0797b24eSAndroid Build Coastguard Worker   // Always bad.
bad_cptrTestJni244*0797b24eSAndroid Build Coastguard Worker   static void bad_cptr(const char* ptr) {}
bad_ret_ptrTestJni245*0797b24eSAndroid Build Coastguard Worker   static void* bad_ret_ptr() { return nullptr; }
bad_ret_envTestJni246*0797b24eSAndroid Build Coastguard Worker   static JNIEnv* bad_ret_env() { return nullptr; }
bad_wrongplace_envTestJni247*0797b24eSAndroid Build Coastguard Worker   static void bad_wrongplace_env(jobject, JNIEnv*) {}
bad_wrongplace_env2TestJni248*0797b24eSAndroid Build Coastguard Worker   static void bad_wrongplace_env2(jobject, jobject, JNIEnv*) {}
v_eTestJni249*0797b24eSAndroid Build Coastguard Worker   static void v_e(JNIEnv*) {}
v_eiTestJni250*0797b24eSAndroid Build Coastguard Worker   static void v_ei(JNIEnv*, jint l) {}
v_elTestJni251*0797b24eSAndroid Build Coastguard Worker   static void v_el(JNIEnv*, jlong l) {}
v_etTestJni252*0797b24eSAndroid Build Coastguard Worker   static void v_et(JNIEnv*, jstring) {}
o_noneTestJni253*0797b24eSAndroid Build Coastguard Worker   static jobject o_none() { return nullptr; }
bad_noref_jint_normTestJni254*0797b24eSAndroid Build Coastguard Worker   static void bad_noref_jint_norm(JNIEnv*, jclass, jint&) {}
bad_noref_jint_critTestJni255*0797b24eSAndroid Build Coastguard Worker   static void bad_noref_jint_crit(jint&) {}
256*0797b24eSAndroid Build Coastguard Worker 
257*0797b24eSAndroid Build Coastguard Worker   // Good depending on the context:
258*0797b24eSAndroid Build Coastguard Worker 
259*0797b24eSAndroid Build Coastguard Worker   // CriticalNative
empty_fnTestJni260*0797b24eSAndroid Build Coastguard Worker   static void empty_fn() {}
int_fnTestJni261*0797b24eSAndroid Build Coastguard Worker   static jint int_fn() { return 0; }
262*0797b24eSAndroid Build Coastguard Worker 
v_TestJni263*0797b24eSAndroid Build Coastguard Worker   static void v_() {}
264*0797b24eSAndroid Build Coastguard Worker   // Note: volatile,const don't participate in the function signature
265*0797b24eSAndroid Build Coastguard Worker   // but we still have these here to clarify that it is indeed allowed.
v_vol_iTestJni266*0797b24eSAndroid Build Coastguard Worker   static void v_vol_i(volatile jint) {}
v_const_iTestJni267*0797b24eSAndroid Build Coastguard Worker   static void v_const_i(const jint) {}
v_iTestJni268*0797b24eSAndroid Build Coastguard Worker   static void v_i(jint) {}
v_lTestJni269*0797b24eSAndroid Build Coastguard Worker   static void v_l(jlong) {}
v_libTestJni270*0797b24eSAndroid Build Coastguard Worker   static void v_lib(jlong, jint, jboolean) {}
s_libTestJni271*0797b24eSAndroid Build Coastguard Worker   static jshort s_lib(jlong, jint, jboolean) { return 0; }
272*0797b24eSAndroid Build Coastguard Worker 
273*0797b24eSAndroid Build Coastguard Worker   // Normal or FastNative.
v_eoTestJni274*0797b24eSAndroid Build Coastguard Worker   static void v_eo(JNIEnv*, jobject) {}
v_eooTestJni275*0797b24eSAndroid Build Coastguard Worker   static void v_eoo(JNIEnv*, jobject, jobject) {}
v_ekTestJni276*0797b24eSAndroid Build Coastguard Worker   static void v_ek(JNIEnv*, jclass) {}
v_eolibTestJni277*0797b24eSAndroid Build Coastguard Worker   static void v_eolib(JNIEnv*, jobject, jlong, jint, jboolean) {}
s_eolAibATestJni278*0797b24eSAndroid Build Coastguard Worker   static jshort s_eolAibA(JNIEnv*, jobject, jlongArray, jint, jbooleanArray) { return 0; }
279*0797b24eSAndroid Build Coastguard Worker 
280*0797b24eSAndroid Build Coastguard Worker #define DEC_TEST_FN_IMPL(name, ret_t, ...) \
281*0797b24eSAndroid Build Coastguard Worker   static ret_t name (__VA_ARGS__) { return TestReturnAnything{}; }
282*0797b24eSAndroid Build Coastguard Worker 
283*0797b24eSAndroid Build Coastguard Worker #define DEC_TEST_FN(name, correct, ret_t, ...) \
284*0797b24eSAndroid Build Coastguard Worker   DEC_TEST_FN_IMPL(normal_ ## name, ret_t, JNIEnv*, jobject, __VA_ARGS__) \
285*0797b24eSAndroid Build Coastguard Worker   DEC_TEST_FN_IMPL(normal2_ ## name, ret_t, JNIEnv*, jclass, __VA_ARGS__) \
286*0797b24eSAndroid Build Coastguard Worker   DEC_TEST_FN_IMPL(critical_ ## name, ret_t, __VA_ARGS__)
287*0797b24eSAndroid Build Coastguard Worker 
288*0797b24eSAndroid Build Coastguard Worker #define DEC_TEST_FN0(name, correct, ret_t) \
289*0797b24eSAndroid Build Coastguard Worker   DEC_TEST_FN_IMPL(normal_ ## name, ret_t, JNIEnv*, jobject) \
290*0797b24eSAndroid Build Coastguard Worker   DEC_TEST_FN_IMPL(normal2_ ## name, ret_t, JNIEnv*, jclass) \
291*0797b24eSAndroid Build Coastguard Worker   DEC_TEST_FN_IMPL(critical_ ## name, ret_t)
292*0797b24eSAndroid Build Coastguard Worker 
293*0797b24eSAndroid Build Coastguard Worker #define JNI_TEST_FN(FN, FN0) \
294*0797b24eSAndroid Build Coastguard Worker   FN0(a0,CRITICAL,void) \
295*0797b24eSAndroid Build Coastguard Worker   FN0(a ,CRITICAL,jboolean) \
296*0797b24eSAndroid Build Coastguard Worker   FN0(a1,CRITICAL,jbyte) \
297*0797b24eSAndroid Build Coastguard Worker   FN0(g, CRITICAL,jchar) \
298*0797b24eSAndroid Build Coastguard Worker   FN0(c, CRITICAL,jshort) \
299*0797b24eSAndroid Build Coastguard Worker   FN0(b, CRITICAL,jint) \
300*0797b24eSAndroid Build Coastguard Worker   FN0(f, CRITICAL,jlong) \
301*0797b24eSAndroid Build Coastguard Worker   FN0(d, CRITICAL,jfloat) \
302*0797b24eSAndroid Build Coastguard Worker   FN0(e, CRITICAL,jdouble) \
303*0797b24eSAndroid Build Coastguard Worker   FN0(f2,NORMAL  ,jobject) \
304*0797b24eSAndroid Build Coastguard Worker   FN0(f3,NORMAL  ,jclass) \
305*0797b24eSAndroid Build Coastguard Worker   FN0(fr,NORMAL  ,jstring) \
306*0797b24eSAndroid Build Coastguard Worker   FN0(fa,NORMAL  ,jarray) \
307*0797b24eSAndroid Build Coastguard Worker   FN0(fb,NORMAL  ,jobjectArray) \
308*0797b24eSAndroid Build Coastguard Worker   FN0(fc,NORMAL  ,jbooleanArray) \
309*0797b24eSAndroid Build Coastguard Worker   FN0(fd,NORMAL  ,jcharArray) \
310*0797b24eSAndroid Build Coastguard Worker   FN0(fe,NORMAL  ,jshortArray) \
311*0797b24eSAndroid Build Coastguard Worker   FN0(ff,NORMAL  ,jintArray) \
312*0797b24eSAndroid Build Coastguard Worker   FN0(fg,NORMAL  ,jlongArray) \
313*0797b24eSAndroid Build Coastguard Worker   FN0(fk,NORMAL  ,jfloatArray) \
314*0797b24eSAndroid Build Coastguard Worker   FN0(fi,NORMAL  ,jdoubleArray) \
315*0797b24eSAndroid Build Coastguard Worker   FN0(fl,NORMAL  ,jthrowable) \
316*0797b24eSAndroid Build Coastguard Worker   FN(aa, CRITICAL,jboolean,jboolean) \
317*0797b24eSAndroid Build Coastguard Worker   FN(ax, CRITICAL,jbyte,jbyte) \
318*0797b24eSAndroid Build Coastguard Worker   FN(ag, CRITICAL,jchar,jchar) \
319*0797b24eSAndroid Build Coastguard Worker   FN(ac, CRITICAL,jshort,jshort) \
320*0797b24eSAndroid Build Coastguard Worker   FN(ac2,CRITICAL,jshort,jshort,jchar) \
321*0797b24eSAndroid Build Coastguard Worker   FN(ab, CRITICAL,jint,jint) \
322*0797b24eSAndroid Build Coastguard Worker   FN(af, CRITICAL,jlong,jlong) \
323*0797b24eSAndroid Build Coastguard Worker   FN(ad, CRITICAL,jfloat,jfloat) \
324*0797b24eSAndroid Build Coastguard Worker   FN(ae, CRITICAL,jdouble,jdouble) \
325*0797b24eSAndroid Build Coastguard Worker   FN(af2,NORMAL  ,jobject,jobject) \
326*0797b24eSAndroid Build Coastguard Worker   FN(af3,NORMAL  ,jclass,jclass) \
327*0797b24eSAndroid Build Coastguard Worker   FN(afr,NORMAL  ,jstring,jstring) \
328*0797b24eSAndroid Build Coastguard Worker   FN(afa,NORMAL  ,jarray,jarray) \
329*0797b24eSAndroid Build Coastguard Worker   FN(afb,NORMAL  ,jobjectArray,jobjectArray) \
330*0797b24eSAndroid Build Coastguard Worker   FN(afc,NORMAL  ,jbooleanArray,jbooleanArray) \
331*0797b24eSAndroid Build Coastguard Worker   FN(afd,NORMAL  ,jcharArray,jcharArray) \
332*0797b24eSAndroid Build Coastguard Worker   FN(afe,NORMAL  ,jshortArray,jshortArray) \
333*0797b24eSAndroid Build Coastguard Worker   FN(aff,NORMAL  ,jintArray,jintArray) \
334*0797b24eSAndroid Build Coastguard Worker   FN(afg,NORMAL  ,jlongArray,jlongArray) \
335*0797b24eSAndroid Build Coastguard Worker   FN(afk,NORMAL  ,jfloatArray,jfloatArray) \
336*0797b24eSAndroid Build Coastguard Worker   FN(afi,NORMAL  ,jdoubleArray,jdoubleArray) \
337*0797b24eSAndroid Build Coastguard Worker   FN(agi,NORMAL  ,jdoubleArray,jdoubleArray,jobject) \
338*0797b24eSAndroid Build Coastguard Worker   FN(afl,NORMAL  ,jthrowable,jthrowable) \
339*0797b24eSAndroid Build Coastguard Worker   \
340*0797b24eSAndroid Build Coastguard Worker   FN0(z0,ILLEGAL ,JNIEnv*) \
341*0797b24eSAndroid Build Coastguard Worker   FN(z1, ILLEGAL ,void, JNIEnv*) \
342*0797b24eSAndroid Build Coastguard Worker   FN(z2, ILLEGAL ,JNIEnv*, JNIEnv*) \
343*0797b24eSAndroid Build Coastguard Worker   FN(z3, ILLEGAL ,void, void*) \
344*0797b24eSAndroid Build Coastguard Worker   FN0(z4,ILLEGAL ,void*) \
345*0797b24eSAndroid Build Coastguard Worker 
346*0797b24eSAndroid Build Coastguard Worker #define JNI_TEST_FN_BOTH(x) JNI_TEST_FN(x,x)
347*0797b24eSAndroid Build Coastguard Worker 
348*0797b24eSAndroid Build Coastguard Worker // we generate a return statement because some functions are non-void.
349*0797b24eSAndroid Build Coastguard Worker // disable the useless warning about returning from a non-void function.
350*0797b24eSAndroid Build Coastguard Worker #pragma clang diagnostic push
351*0797b24eSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wreturn-type"
352*0797b24eSAndroid Build Coastguard Worker   JNI_TEST_FN(DEC_TEST_FN, DEC_TEST_FN0);
353*0797b24eSAndroid Build Coastguard Worker #pragma clang diagnostic pop
354*0797b24eSAndroid Build Coastguard Worker 
355*0797b24eSAndroid Build Coastguard Worker   // TODO: probably should be an x-macro table
356*0797b24eSAndroid Build Coastguard Worker   // and that way we can add critical/normal to it as well
357*0797b24eSAndroid Build Coastguard Worker   // and also the type descriptor, and reuse this for multiple tests.
358*0797b24eSAndroid Build Coastguard Worker 
359*0797b24eSAndroid Build Coastguard Worker #pragma clang diagnostic pop
360*0797b24eSAndroid Build Coastguard Worker };
361*0797b24eSAndroid Build Coastguard Worker // Note: Using function-local structs does not work.
362*0797b24eSAndroid Build Coastguard Worker // Template parameters must have linkage, which function-local structs lack.
363*0797b24eSAndroid Build Coastguard Worker 
TEST(JniSafeRegisterNativeMethods,FunctionTypes)364*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, FunctionTypes) {
365*0797b24eSAndroid Build Coastguard Worker   using namespace nativehelper::detail;  // NOLINT
366*0797b24eSAndroid Build Coastguard Worker   // The exact error messages are not tested but they would be seen in the compiler
367*0797b24eSAndroid Build Coastguard Worker   // stack trace when used from a constexpr context.
368*0797b24eSAndroid Build Coastguard Worker 
369*0797b24eSAndroid Build Coastguard Worker #define IS_VALID_JNI_FUNCTION_TYPE(native_kind, func) \
370*0797b24eSAndroid Build Coastguard Worker     (IsValidJniFunctionType<native_kind, decltype(func), (func)>())
371*0797b24eSAndroid Build Coastguard Worker #define IS_VALID_NORMAL_JNI_FUNCTION_TYPE(func) IS_VALID_JNI_FUNCTION_TYPE(kNormalNative, func)
372*0797b24eSAndroid Build Coastguard Worker #define IS_VALID_CRITICAL_JNI_FUNCTION_TYPE(func) IS_VALID_JNI_FUNCTION_TYPE(kCriticalNative, func)
373*0797b24eSAndroid Build Coastguard Worker 
374*0797b24eSAndroid Build Coastguard Worker #define EXPECT_ILLEGAL_JNI_FUNCTION_TYPE(func)                      \
375*0797b24eSAndroid Build Coastguard Worker     do {                                                            \
376*0797b24eSAndroid Build Coastguard Worker        EXPECT_FALSE(IS_VALID_CRITICAL_JNI_FUNCTION_TYPE(func));    \
377*0797b24eSAndroid Build Coastguard Worker        EXPECT_FALSE(IS_VALID_NORMAL_JNI_FUNCTION_TYPE(func));      \
378*0797b24eSAndroid Build Coastguard Worker     } while (false)
379*0797b24eSAndroid Build Coastguard Worker 
380*0797b24eSAndroid Build Coastguard Worker #define EXPECT_NORMAL_JNI_FUNCTION_TYPE(func)                       \
381*0797b24eSAndroid Build Coastguard Worker     do {                                                            \
382*0797b24eSAndroid Build Coastguard Worker        EXPECT_FALSE(IS_VALID_CRITICAL_JNI_FUNCTION_TYPE(func));    \
383*0797b24eSAndroid Build Coastguard Worker        EXPECT_TRUE(IS_VALID_NORMAL_JNI_FUNCTION_TYPE(func));       \
384*0797b24eSAndroid Build Coastguard Worker     } while (false)
385*0797b24eSAndroid Build Coastguard Worker 
386*0797b24eSAndroid Build Coastguard Worker #define EXPECT_CRITICAL_JNI_FUNCTION_TYPE(func)                    \
387*0797b24eSAndroid Build Coastguard Worker   do {                                                             \
388*0797b24eSAndroid Build Coastguard Worker      EXPECT_TRUE(IS_VALID_CRITICAL_JNI_FUNCTION_TYPE(func));      \
389*0797b24eSAndroid Build Coastguard Worker      EXPECT_FALSE(IS_VALID_NORMAL_JNI_FUNCTION_TYPE(func));       \
390*0797b24eSAndroid Build Coastguard Worker   } while (false)
391*0797b24eSAndroid Build Coastguard Worker 
392*0797b24eSAndroid Build Coastguard Worker   {
393*0797b24eSAndroid Build Coastguard Worker     EXPECT_ILLEGAL_JNI_FUNCTION_TYPE(TestJni::bad_cptr);
394*0797b24eSAndroid Build Coastguard Worker     EXPECT_ILLEGAL_JNI_FUNCTION_TYPE(TestJni::bad_ret_ptr);
395*0797b24eSAndroid Build Coastguard Worker     EXPECT_ILLEGAL_JNI_FUNCTION_TYPE(TestJni::bad_ret_env);
396*0797b24eSAndroid Build Coastguard Worker     EXPECT_ILLEGAL_JNI_FUNCTION_TYPE(TestJni::bad_wrongplace_env);
397*0797b24eSAndroid Build Coastguard Worker     EXPECT_ILLEGAL_JNI_FUNCTION_TYPE(TestJni::bad_wrongplace_env2);
398*0797b24eSAndroid Build Coastguard Worker 
399*0797b24eSAndroid Build Coastguard Worker     EXPECT_CRITICAL_JNI_FUNCTION_TYPE(TestJni::empty_fn);
400*0797b24eSAndroid Build Coastguard Worker     EXPECT_CRITICAL_JNI_FUNCTION_TYPE(test_jni::empty_fn);
401*0797b24eSAndroid Build Coastguard Worker     EXPECT_CRITICAL_JNI_FUNCTION_TYPE(TestJni::int_fn);
402*0797b24eSAndroid Build Coastguard Worker 
403*0797b24eSAndroid Build Coastguard Worker     EXPECT_CRITICAL_JNI_FUNCTION_TYPE(TestJni::v_);
404*0797b24eSAndroid Build Coastguard Worker     EXPECT_CRITICAL_JNI_FUNCTION_TYPE(TestJni::v_vol_i);
405*0797b24eSAndroid Build Coastguard Worker     EXPECT_CRITICAL_JNI_FUNCTION_TYPE(TestJni::v_const_i);
406*0797b24eSAndroid Build Coastguard Worker     EXPECT_CRITICAL_JNI_FUNCTION_TYPE(TestJni::v_i);
407*0797b24eSAndroid Build Coastguard Worker     EXPECT_CRITICAL_JNI_FUNCTION_TYPE(TestJni::v_l);
408*0797b24eSAndroid Build Coastguard Worker 
409*0797b24eSAndroid Build Coastguard Worker     EXPECT_ILLEGAL_JNI_FUNCTION_TYPE(TestJni::v_e);
410*0797b24eSAndroid Build Coastguard Worker     EXPECT_ILLEGAL_JNI_FUNCTION_TYPE(TestJni::v_ei);
411*0797b24eSAndroid Build Coastguard Worker     EXPECT_ILLEGAL_JNI_FUNCTION_TYPE(TestJni::v_el);
412*0797b24eSAndroid Build Coastguard Worker     EXPECT_ILLEGAL_JNI_FUNCTION_TYPE(TestJni::v_et);
413*0797b24eSAndroid Build Coastguard Worker 
414*0797b24eSAndroid Build Coastguard Worker     EXPECT_NORMAL_JNI_FUNCTION_TYPE(TestJni::v_eo);
415*0797b24eSAndroid Build Coastguard Worker     EXPECT_NORMAL_JNI_FUNCTION_TYPE(TestJni::v_ek);
416*0797b24eSAndroid Build Coastguard Worker 
417*0797b24eSAndroid Build Coastguard Worker     EXPECT_ILLEGAL_JNI_FUNCTION_TYPE(TestJni::o_none);
418*0797b24eSAndroid Build Coastguard Worker     EXPECT_ILLEGAL_JNI_FUNCTION_TYPE(TestJni::bad_noref_jint_norm);
419*0797b24eSAndroid Build Coastguard Worker     EXPECT_ILLEGAL_JNI_FUNCTION_TYPE(TestJni::bad_noref_jint_crit);
420*0797b24eSAndroid Build Coastguard Worker   }
421*0797b24eSAndroid Build Coastguard Worker 
422*0797b24eSAndroid Build Coastguard Worker   enum class TestJniKind {
423*0797b24eSAndroid Build Coastguard Worker     ILLEGAL,
424*0797b24eSAndroid Build Coastguard Worker     NORMAL,
425*0797b24eSAndroid Build Coastguard Worker     CRITICAL
426*0797b24eSAndroid Build Coastguard Worker   };
427*0797b24eSAndroid Build Coastguard Worker 
428*0797b24eSAndroid Build Coastguard Worker   // ILLEGAL signatures are always illegal.
429*0797b24eSAndroid Build Coastguard Worker   bool kExpected_ILLEGAL_against_NORMAL = false;
430*0797b24eSAndroid Build Coastguard Worker   bool kExpected_ILLEGAL_against_CRITICAL = false;
431*0797b24eSAndroid Build Coastguard Worker   // NORMAL signatures are only legal for Normal JNI.
432*0797b24eSAndroid Build Coastguard Worker   bool kExpected_NORMAL_against_NORMAL = true;
433*0797b24eSAndroid Build Coastguard Worker   bool kExpected_NORMAL_against_CRITICAL = false;
434*0797b24eSAndroid Build Coastguard Worker   // CRITICAL signatures are legal for both Normal+Critical JNI.
435*0797b24eSAndroid Build Coastguard Worker   bool kExpected_CRITICAL_against_CRITICAL = true;
436*0797b24eSAndroid Build Coastguard Worker   bool kExpected_CRITICAL_against_NORMAL = true;
437*0797b24eSAndroid Build Coastguard Worker   // Note that we munge normal and critical type signatures separately
438*0797b24eSAndroid Build Coastguard Worker   // and that a normal_ prefixed is always a bad critical signature,
439*0797b24eSAndroid Build Coastguard Worker   // and a critical_ prefixed signature is always a bad normal signature.
440*0797b24eSAndroid Build Coastguard Worker   // See JNI_TEST_FN_MAKE_TEST for the implementation of this logic.
441*0797b24eSAndroid Build Coastguard Worker 
442*0797b24eSAndroid Build Coastguard Worker #undef EXPECTED_FOR
443*0797b24eSAndroid Build Coastguard Worker #define EXPECTED_FOR(jni_kind, context) \
444*0797b24eSAndroid Build Coastguard Worker   (kExpected_ ## jni_kind ## _against_ ## context)
445*0797b24eSAndroid Build Coastguard Worker 
446*0797b24eSAndroid Build Coastguard Worker   {
447*0797b24eSAndroid Build Coastguard Worker #define JNI_TEST_FN_MAKE_TEST(name, jni_kind, ...) \
448*0797b24eSAndroid Build Coastguard Worker      do {                                                            \
449*0797b24eSAndroid Build Coastguard Worker        EXPECT_EQ(EXPECTED_FOR(jni_kind, NORMAL),                     \
450*0797b24eSAndroid Build Coastguard Worker                  IS_VALID_NORMAL_JNI_FUNCTION_TYPE(TestJni::normal_ ## name));  \
451*0797b24eSAndroid Build Coastguard Worker        EXPECT_FALSE(IS_VALID_CRITICAL_JNI_FUNCTION_TYPE(TestJni::normal_ ## name)); \
452*0797b24eSAndroid Build Coastguard Worker        EXPECT_EQ(EXPECTED_FOR(jni_kind, NORMAL),                     \
453*0797b24eSAndroid Build Coastguard Worker                  IS_VALID_NORMAL_JNI_FUNCTION_TYPE(TestJni::normal2_ ## name)); \
454*0797b24eSAndroid Build Coastguard Worker        EXPECT_FALSE(IS_VALID_CRITICAL_JNI_FUNCTION_TYPE(TestJni::normal2_ ## name)); \
455*0797b24eSAndroid Build Coastguard Worker        EXPECT_EQ(EXPECTED_FOR(jni_kind, CRITICAL),                   \
456*0797b24eSAndroid Build Coastguard Worker                  IS_VALID_CRITICAL_JNI_FUNCTION_TYPE(TestJni::critical_ ## name)); \
457*0797b24eSAndroid Build Coastguard Worker        EXPECT_FALSE(IS_VALID_NORMAL_JNI_FUNCTION_TYPE(TestJni::critical_ ## name)); \
458*0797b24eSAndroid Build Coastguard Worker     } while (false);
459*0797b24eSAndroid Build Coastguard Worker 
460*0797b24eSAndroid Build Coastguard Worker     JNI_TEST_FN_BOTH(JNI_TEST_FN_MAKE_TEST);
461*0797b24eSAndroid Build Coastguard Worker   }
462*0797b24eSAndroid Build Coastguard Worker }
463*0797b24eSAndroid Build Coastguard Worker 
464*0797b24eSAndroid Build Coastguard Worker #define EXPECT_CONSTEXPR_EQ(lhs, rhs) \
465*0797b24eSAndroid Build Coastguard Worker  { constexpr auto lhs_val = (lhs);    \
466*0797b24eSAndroid Build Coastguard Worker    constexpr auto rhs_val = (rhs);    \
467*0797b24eSAndroid Build Coastguard Worker    EXPECT_EQ(lhs_val, rhs_val) << "LHS: " << #lhs << ", RHS: " << #rhs; \
468*0797b24eSAndroid Build Coastguard Worker  }
469*0797b24eSAndroid Build Coastguard Worker 
TEST(JniSafeRegisterNativeMethods,FunctionTypeDescriptorConversion)470*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, FunctionTypeDescriptorConversion) {
471*0797b24eSAndroid Build Coastguard Worker   using namespace nativehelper::detail;  // NOLINT
472*0797b24eSAndroid Build Coastguard Worker   {
473*0797b24eSAndroid Build Coastguard Worker     constexpr auto cvrt = MaybeMakeReifiedJniSignature<kCriticalNative,
474*0797b24eSAndroid Build Coastguard Worker                                                        decltype(TestJni::v_i),
475*0797b24eSAndroid Build Coastguard Worker                                                        TestJni::v_i>();
476*0797b24eSAndroid Build Coastguard Worker     ASSERT_TRUE(cvrt.has_value());
477*0797b24eSAndroid Build Coastguard Worker     EXPECT_CONSTEXPR_EQ(2u, cvrt->max_size);
478*0797b24eSAndroid Build Coastguard Worker     EXPECT_CONSTEXPR_EQ(1u, cvrt->args.size());
479*0797b24eSAndroid Build Coastguard Worker     EXPECT_STRINGIFY_EQ("args={jint}, ret=void", cvrt.value());
480*0797b24eSAndroid Build Coastguard Worker   }
481*0797b24eSAndroid Build Coastguard Worker 
482*0797b24eSAndroid Build Coastguard Worker   {
483*0797b24eSAndroid Build Coastguard Worker     constexpr auto cvrt = MaybeMakeReifiedJniSignature<kNormalNative,
484*0797b24eSAndroid Build Coastguard Worker                                                        decltype(TestJni::v_i),
485*0797b24eSAndroid Build Coastguard Worker                                                        TestJni::v_i>();
486*0797b24eSAndroid Build Coastguard Worker     EXPECT_FALSE(cvrt.has_value());
487*0797b24eSAndroid Build Coastguard Worker   }
488*0797b24eSAndroid Build Coastguard Worker 
489*0797b24eSAndroid Build Coastguard Worker   {
490*0797b24eSAndroid Build Coastguard Worker     constexpr auto cvrt = MaybeMakeReifiedJniSignature<kNormalNative,
491*0797b24eSAndroid Build Coastguard Worker                                                        decltype(TestJni::normal_agi),
492*0797b24eSAndroid Build Coastguard Worker                                                        TestJni::normal_agi>();
493*0797b24eSAndroid Build Coastguard Worker     ASSERT_TRUE(cvrt.has_value());
494*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ(2u, cvrt->args.size());
495*0797b24eSAndroid Build Coastguard Worker     EXPECT_STRINGIFY_EQ("args={jdoubleArray,jobject}, ret=jdoubleArray", cvrt.value());
496*0797b24eSAndroid Build Coastguard Worker   }
497*0797b24eSAndroid Build Coastguard Worker 
498*0797b24eSAndroid Build Coastguard Worker   {
499*0797b24eSAndroid Build Coastguard Worker     constexpr auto cvrt = MaybeMakeReifiedJniSignature<kCriticalNative,
500*0797b24eSAndroid Build Coastguard Worker                                                        decltype(TestJni::critical_ac2),
501*0797b24eSAndroid Build Coastguard Worker                                                        TestJni::critical_ac2>();
502*0797b24eSAndroid Build Coastguard Worker     ASSERT_TRUE(cvrt.has_value());
503*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ(2u, cvrt->args.size());
504*0797b24eSAndroid Build Coastguard Worker     EXPECT_STRINGIFY_EQ("args={jshort,jchar}, ret=jshort", cvrt.value());
505*0797b24eSAndroid Build Coastguard Worker   }
506*0797b24eSAndroid Build Coastguard Worker 
507*0797b24eSAndroid Build Coastguard Worker   // TODO: use JNI_TEST_FN to generate these tests automatically.
508*0797b24eSAndroid Build Coastguard Worker }
509*0797b24eSAndroid Build Coastguard Worker 
510*0797b24eSAndroid Build Coastguard Worker struct test_function_traits {
int_returning_functiontest_function_traits511*0797b24eSAndroid Build Coastguard Worker   static int int_returning_function() { return 0; }
512*0797b24eSAndroid Build Coastguard Worker };
513*0797b24eSAndroid Build Coastguard Worker 
514*0797b24eSAndroid Build Coastguard Worker template <typename T>
515*0797b24eSAndroid Build Coastguard Worker struct apply_return_type {
operator ()apply_return_type516*0797b24eSAndroid Build Coastguard Worker   constexpr int operator()() const {
517*0797b24eSAndroid Build Coastguard Worker     return sizeof(T) == sizeof(int);
518*0797b24eSAndroid Build Coastguard Worker   }
519*0797b24eSAndroid Build Coastguard Worker };
520*0797b24eSAndroid Build Coastguard Worker 
521*0797b24eSAndroid Build Coastguard Worker #define FN_ARGS_PAIR(fn) decltype(fn), (fn)
522*0797b24eSAndroid Build Coastguard Worker 
TEST(JniSafeRegisterNativeMethods,FunctionTraits)523*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, FunctionTraits) {
524*0797b24eSAndroid Build Coastguard Worker   using namespace nativehelper::detail;  // NOLINT
525*0797b24eSAndroid Build Coastguard Worker   using traits_for_int_ret =
526*0797b24eSAndroid Build Coastguard Worker       FunctionTypeMetafunction<FN_ARGS_PAIR(test_function_traits::int_returning_function)>;
527*0797b24eSAndroid Build Coastguard Worker   int applied = traits_for_int_ret::map_return<apply_return_type>();
528*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQ(1, applied);
529*0797b24eSAndroid Build Coastguard Worker 
530*0797b24eSAndroid Build Coastguard Worker   auto arr = traits_for_int_ret::map_args<apply_return_type>();
531*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQ(0u, arr.size());
532*0797b24eSAndroid Build Coastguard Worker }
533*0797b24eSAndroid Build Coastguard Worker 
534*0797b24eSAndroid Build Coastguard Worker struct IntHolder {
535*0797b24eSAndroid Build Coastguard Worker   int value;
536*0797b24eSAndroid Build Coastguard Worker };
537*0797b24eSAndroid Build Coastguard Worker 
GetTestValue(const IntHolder & i)538*0797b24eSAndroid Build Coastguard Worker constexpr int GetTestValue(const IntHolder& i) {
539*0797b24eSAndroid Build Coastguard Worker   return i.value;
540*0797b24eSAndroid Build Coastguard Worker }
541*0797b24eSAndroid Build Coastguard Worker 
GetTestValue(int i)542*0797b24eSAndroid Build Coastguard Worker constexpr int GetTestValue(int i) {
543*0797b24eSAndroid Build Coastguard Worker   return i;
544*0797b24eSAndroid Build Coastguard Worker }
545*0797b24eSAndroid Build Coastguard Worker 
546*0797b24eSAndroid Build Coastguard Worker template <typename T, size_t kMaxSize>
SumUpVector(const nativehelper::detail::ConstexprVector<T,kMaxSize> & vec)547*0797b24eSAndroid Build Coastguard Worker constexpr size_t SumUpVector(const nativehelper::detail::ConstexprVector<T, kMaxSize>& vec) {
548*0797b24eSAndroid Build Coastguard Worker   size_t s = 0;
549*0797b24eSAndroid Build Coastguard Worker   for (const T& elem : vec) {
550*0797b24eSAndroid Build Coastguard Worker     s += static_cast<size_t>(GetTestValue(elem));
551*0797b24eSAndroid Build Coastguard Worker   }
552*0797b24eSAndroid Build Coastguard Worker   return s;
553*0797b24eSAndroid Build Coastguard Worker }
554*0797b24eSAndroid Build Coastguard Worker 
555*0797b24eSAndroid Build Coastguard Worker template <typename T>
make_test_int_vector()556*0797b24eSAndroid Build Coastguard Worker constexpr auto make_test_int_vector() {
557*0797b24eSAndroid Build Coastguard Worker   using namespace nativehelper::detail;  // NOLINT
558*0797b24eSAndroid Build Coastguard Worker   ConstexprVector<T, 5> vec_int;
559*0797b24eSAndroid Build Coastguard Worker   vec_int.push_back(T{1});
560*0797b24eSAndroid Build Coastguard Worker   vec_int.push_back(T{2});
561*0797b24eSAndroid Build Coastguard Worker   vec_int.push_back(T{3});
562*0797b24eSAndroid Build Coastguard Worker   vec_int.push_back(T{4});
563*0797b24eSAndroid Build Coastguard Worker   vec_int.push_back(T{5});
564*0797b24eSAndroid Build Coastguard Worker   return vec_int;
565*0797b24eSAndroid Build Coastguard Worker }
566*0797b24eSAndroid Build Coastguard Worker 
TEST(JniSafeRegisterNativeMethods,ConstexprOptional)567*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, ConstexprOptional) {
568*0797b24eSAndroid Build Coastguard Worker   using namespace nativehelper::detail;  // NOLINT
569*0797b24eSAndroid Build Coastguard Worker 
570*0797b24eSAndroid Build Coastguard Worker   ConstexprOptional<int> int_opt;
571*0797b24eSAndroid Build Coastguard Worker   EXPECT_FALSE(int_opt.has_value());
572*0797b24eSAndroid Build Coastguard Worker 
573*0797b24eSAndroid Build Coastguard Worker   int_opt = ConstexprOptional<int>(12345);
574*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQ(12345, int_opt.value());
575*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQ(12345, *int_opt);
576*0797b24eSAndroid Build Coastguard Worker }
577*0797b24eSAndroid Build Coastguard Worker 
TEST(JniSafeRegisterNativeMethods,ConstexprVector)578*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, ConstexprVector) {
579*0797b24eSAndroid Build Coastguard Worker   using namespace nativehelper::detail;  // NOLINT
580*0797b24eSAndroid Build Coastguard Worker   {
581*0797b24eSAndroid Build Coastguard Worker     constexpr ConstexprVector<IntHolder, 5> vec_int = make_test_int_vector<IntHolder>();
582*0797b24eSAndroid Build Coastguard Worker     constexpr size_t the_sum = SumUpVector(vec_int);
583*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ(15u, the_sum);
584*0797b24eSAndroid Build Coastguard Worker   }
585*0797b24eSAndroid Build Coastguard Worker 
586*0797b24eSAndroid Build Coastguard Worker   {
587*0797b24eSAndroid Build Coastguard Worker     constexpr ConstexprVector<int, 5> vec_int = make_test_int_vector<int>();
588*0797b24eSAndroid Build Coastguard Worker     constexpr size_t the_sum = SumUpVector(vec_int);
589*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ(15u, the_sum);
590*0797b24eSAndroid Build Coastguard Worker   }
591*0797b24eSAndroid Build Coastguard Worker }
592*0797b24eSAndroid Build Coastguard Worker 
593*0797b24eSAndroid Build Coastguard Worker // Need this intermediate function to make a JniDescriptorNode from a string literal.
594*0797b24eSAndroid Build Coastguard Worker // C++ doesn't do implicit conversion through two+ type constructors.
MakeNode(nativehelper::detail::ConstexprStringView str)595*0797b24eSAndroid Build Coastguard Worker constexpr nativehelper::detail::JniDescriptorNode MakeNode(
596*0797b24eSAndroid Build Coastguard Worker     nativehelper::detail::ConstexprStringView str) {
597*0797b24eSAndroid Build Coastguard Worker   return nativehelper::detail::JniDescriptorNode{str};
598*0797b24eSAndroid Build Coastguard Worker }
599*0797b24eSAndroid Build Coastguard Worker 
600*0797b24eSAndroid Build Coastguard Worker #define EXPECT_EQUALISH_JNI_DESCRIPTORS_IMPL(user_desc, derived, cond)                      \
601*0797b24eSAndroid Build Coastguard Worker   do {                                                                                      \
602*0797b24eSAndroid Build Coastguard Worker     constexpr bool res =                                                                    \
603*0797b24eSAndroid Build Coastguard Worker         CompareJniDescriptorNodeErased(MakeNode(user_desc),                                 \
604*0797b24eSAndroid Build Coastguard Worker                                        ReifiedJniTypeTrait::Reify<derived>());              \
605*0797b24eSAndroid Build Coastguard Worker     (void)res;                                                                              \
606*0797b24eSAndroid Build Coastguard Worker     EXPECT_ ## cond(CompareJniDescriptorNodeErased(MakeNode(user_desc),                     \
607*0797b24eSAndroid Build Coastguard Worker                                                    ReifiedJniTypeTrait::Reify<derived>())); \
608*0797b24eSAndroid Build Coastguard Worker   } while (0);
609*0797b24eSAndroid Build Coastguard Worker 
610*0797b24eSAndroid Build Coastguard Worker #define EXPECT_EQUALISH_JNI_DESCRIPTORS(user_desc, derived_desc) \
611*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS_IMPL(user_desc, derived_desc, TRUE)
612*0797b24eSAndroid Build Coastguard Worker 
613*0797b24eSAndroid Build Coastguard Worker #define EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS(user_desc, derived_desc) \
614*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS_IMPL(user_desc, derived_desc, FALSE)
615*0797b24eSAndroid Build Coastguard Worker 
TEST(JniSafeRegisterNativeMethods,CompareJniDescriptorNodeErased)616*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, CompareJniDescriptorNodeErased) {
617*0797b24eSAndroid Build Coastguard Worker   using namespace nativehelper::detail;  // NOLINT
618*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("V", void);
619*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("V", jint);
620*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("Z", jboolean);
621*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("Z", void);
622*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("Z", jobject);
623*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("J", jlong);
624*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("J", jobject);
625*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("J", jthrowable);
626*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("J", jint);
627*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/String;", jstring);
628*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Class;", jclass);
629*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Object;", jobject);
630*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Integer;", jobject);
631*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("[Z", jthrowable);
632*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("[Z", jobjectArray);
633*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Integer;", jintArray);
634*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Integer;", jarray);
635*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Integer;", jarray);
636*0797b24eSAndroid Build Coastguard Worker 
637*0797b24eSAndroid Build Coastguard Worker   // Stricter checks.
638*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Object;", jobjectArray);
639*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/String;", jobject);
640*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Class;", jobject);
641*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("[Z", jobject);
642*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("[Ljava/lang/Object;", jobject);
643*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Object;", jarray);
644*0797b24eSAndroid Build Coastguard Worker 
645*0797b24eSAndroid Build Coastguard Worker   // Permissive checks that are weaker than normal.
646*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Exception;", jobject);
647*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Error;", jobject);
648*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("[Z", jarray);
649*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("[I", jarray);
650*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("[[Z", jarray);
651*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("[[Ljava/lang/Object;", jarray);
652*0797b24eSAndroid Build Coastguard Worker 
653*0797b24eSAndroid Build Coastguard Worker   // jthrowable-related checks.
654*0797b24eSAndroid Build Coastguard Worker   EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Throwable;", jobject);
655*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Throwable;", jthrowable);
656*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Exception;", jthrowable);
657*0797b24eSAndroid Build Coastguard Worker   EXPECT_EQUALISH_JNI_DESCRIPTORS("Ljava/lang/Error;", jthrowable);
658*0797b24eSAndroid Build Coastguard Worker }
659*0797b24eSAndroid Build Coastguard Worker 
660*0797b24eSAndroid Build Coastguard Worker #define EXPECT_SIMILAR_TYPE_DESCRIPTOR_MATCH(type_desc, type)                             \
661*0797b24eSAndroid Build Coastguard Worker   do {                                                                                    \
662*0797b24eSAndroid Build Coastguard Worker     constexpr auto res = ReifiedJniTypeTrait::MostSimilarTypeDescriptor(type_desc);       \
663*0797b24eSAndroid Build Coastguard Worker     EXPECT_TRUE((ReifiedJniTypeTrait::MostSimilarTypeDescriptor(type_desc)).has_value()); \
664*0797b24eSAndroid Build Coastguard Worker     if (res.has_value()) EXPECT_EQ(ReifiedJniTypeTrait::Reify<type>(), res.value());      \
665*0797b24eSAndroid Build Coastguard Worker   } while (false)
666*0797b24eSAndroid Build Coastguard Worker 
667*0797b24eSAndroid Build Coastguard Worker #define EXPECT_SIMILAR_TYPE_DESCRIPTOR_NO_MATCH(type_desc)                \
668*0797b24eSAndroid Build Coastguard Worker   do {                                                                    \
669*0797b24eSAndroid Build Coastguard Worker     auto res = ReifiedJniTypeTrait::MostSimilarTypeDescriptor(type_desc); \
670*0797b24eSAndroid Build Coastguard Worker     EXPECT_FALSE(res.has_value());                                        \
671*0797b24eSAndroid Build Coastguard Worker   } while (false)
672*0797b24eSAndroid Build Coastguard Worker 
673*0797b24eSAndroid Build Coastguard Worker #define JNI_TYPE_TRAIT_MUST_BE_SAME_FN(type_name, type_desc, ...)              \
674*0797b24eSAndroid Build Coastguard Worker   /* skip jarray because it aliases Ljava/lang/Object; */                      \
675*0797b24eSAndroid Build Coastguard Worker   do {                                                                         \
676*0797b24eSAndroid Build Coastguard Worker     constexpr auto str_type_name = ConstexprStringView(#type_name);            \
677*0797b24eSAndroid Build Coastguard Worker     if (str_type_name != "jarray" && str_type_name != "JNIEnv*") {             \
678*0797b24eSAndroid Build Coastguard Worker       EXPECT_SIMILAR_TYPE_DESCRIPTOR_MATCH(type_desc, type_name);              \
679*0797b24eSAndroid Build Coastguard Worker     }                                                                          \
680*0797b24eSAndroid Build Coastguard Worker   } while(false);
681*0797b24eSAndroid Build Coastguard Worker 
TEST(JniSafeRegisterNativeMethods,MostSimilarTypeDescriptor)682*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, MostSimilarTypeDescriptor) {
683*0797b24eSAndroid Build Coastguard Worker   using namespace nativehelper::detail;  // NOLINT
684*0797b24eSAndroid Build Coastguard Worker   EXPECT_SIMILAR_TYPE_DESCRIPTOR_MATCH("Z", jboolean);
685*0797b24eSAndroid Build Coastguard Worker   EXPECT_SIMILAR_TYPE_DESCRIPTOR_MATCH("[[I", jobjectArray);
686*0797b24eSAndroid Build Coastguard Worker   EXPECT_SIMILAR_TYPE_DESCRIPTOR_MATCH("[[Z", jobjectArray);
687*0797b24eSAndroid Build Coastguard Worker   EXPECT_SIMILAR_TYPE_DESCRIPTOR_MATCH("[Ljava/lang/String;", jobjectArray);
688*0797b24eSAndroid Build Coastguard Worker   EXPECT_SIMILAR_TYPE_DESCRIPTOR_MATCH("[Ljava/lang/Integer;", jobjectArray);
689*0797b24eSAndroid Build Coastguard Worker   EXPECT_SIMILAR_TYPE_DESCRIPTOR_NO_MATCH("illegal");
690*0797b24eSAndroid Build Coastguard Worker   EXPECT_SIMILAR_TYPE_DESCRIPTOR_NO_MATCH("?");
691*0797b24eSAndroid Build Coastguard Worker   EXPECT_SIMILAR_TYPE_DESCRIPTOR_NO_MATCH("");
692*0797b24eSAndroid Build Coastguard Worker 
693*0797b24eSAndroid Build Coastguard Worker   DEFINE_JNI_TYPE_TRAIT(JNI_TYPE_TRAIT_MUST_BE_SAME_FN);
694*0797b24eSAndroid Build Coastguard Worker }
695*0797b24eSAndroid Build Coastguard Worker 
696*0797b24eSAndroid Build Coastguard Worker #define ENFORCE_CONSTEXPR(expr) \
697*0797b24eSAndroid Build Coastguard Worker   static_assert(__builtin_constant_p(expr), "Expression must be constexpr")
698*0797b24eSAndroid Build Coastguard Worker 
699*0797b24eSAndroid Build Coastguard Worker #define EXPECT_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION_IMPL(cond, native_kind, func, desc) \
700*0797b24eSAndroid Build Coastguard Worker   do {                                                                        \
701*0797b24eSAndroid Build Coastguard Worker     ENFORCE_CONSTEXPR((MatchJniDescriptorWithFunctionType<                    \
702*0797b24eSAndroid Build Coastguard Worker         native_kind,                                                          \
703*0797b24eSAndroid Build Coastguard Worker         decltype(func),                                                       \
704*0797b24eSAndroid Build Coastguard Worker         func,                                                                 \
705*0797b24eSAndroid Build Coastguard Worker         sizeof(desc)>(desc)));                                                \
706*0797b24eSAndroid Build Coastguard Worker     EXPECT_ ## cond((MatchJniDescriptorWithFunctionType<                      \
707*0797b24eSAndroid Build Coastguard Worker         native_kind,                                                          \
708*0797b24eSAndroid Build Coastguard Worker         decltype(func),                                                       \
709*0797b24eSAndroid Build Coastguard Worker         func,                                                                 \
710*0797b24eSAndroid Build Coastguard Worker         sizeof(desc)>(desc)));                                                \
711*0797b24eSAndroid Build Coastguard Worker   } while(0)
712*0797b24eSAndroid Build Coastguard Worker 
713*0797b24eSAndroid Build Coastguard Worker #define EXPECT_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(native_kind, func, desc) \
714*0797b24eSAndroid Build Coastguard Worker     EXPECT_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION_IMPL(TRUE, native_kind, func, desc)
715*0797b24eSAndroid Build Coastguard Worker 
716*0797b24eSAndroid Build Coastguard Worker #define EXPECT_NO_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(native_kind, func, desc) \
717*0797b24eSAndroid Build Coastguard Worker     EXPECT_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION_IMPL(FALSE, native_kind, func, desc)
718*0797b24eSAndroid Build Coastguard Worker 
TEST(JniSafeRegisterNativeMethods,MatchJniDescriptorWithFunctionType)719*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, MatchJniDescriptorWithFunctionType) {
720*0797b24eSAndroid Build Coastguard Worker   using namespace nativehelper::detail;  // NOLINT
721*0797b24eSAndroid Build Coastguard Worker   // Bad C++ signature.
722*0797b24eSAndroid Build Coastguard Worker   EXPECT_NO_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kCriticalNative, TestJni::bad_cptr, "()V");
723*0797b24eSAndroid Build Coastguard Worker   EXPECT_NO_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kNormalNative, TestJni::bad_cptr, "()V");
724*0797b24eSAndroid Build Coastguard Worker 
725*0797b24eSAndroid Build Coastguard Worker   // JNI type descriptor is not legal (by itself).
726*0797b24eSAndroid Build Coastguard Worker   EXPECT_NO_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kCriticalNative, TestJni::v_, "BAD");
727*0797b24eSAndroid Build Coastguard Worker   EXPECT_NO_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kNormalNative, TestJni::v_eo, "BAD");
728*0797b24eSAndroid Build Coastguard Worker 
729*0797b24eSAndroid Build Coastguard Worker   // Number of parameters in signature vs C++ function does not match.
730*0797b24eSAndroid Build Coastguard Worker   EXPECT_NO_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kCriticalNative, TestJni::v_i, "()V");
731*0797b24eSAndroid Build Coastguard Worker   EXPECT_NO_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kNormalNative, TestJni::v_eoo, "()V");
732*0797b24eSAndroid Build Coastguard Worker 
733*0797b24eSAndroid Build Coastguard Worker   // Return types don't match.
734*0797b24eSAndroid Build Coastguard Worker   EXPECT_NO_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kCriticalNative, TestJni::v_, "()Z");
735*0797b24eSAndroid Build Coastguard Worker   EXPECT_NO_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kFastNative, TestJni::v_eo, "()Z");
736*0797b24eSAndroid Build Coastguard Worker 
737*0797b24eSAndroid Build Coastguard Worker   // Argument types don't match.
738*0797b24eSAndroid Build Coastguard Worker   EXPECT_NO_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kCriticalNative, TestJni::v_i, "(Z)V");
739*0797b24eSAndroid Build Coastguard Worker   EXPECT_NO_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kNormalNative,
740*0797b24eSAndroid Build Coastguard Worker                                                   TestJni::v_eoo,
741*0797b24eSAndroid Build Coastguard Worker                                                   "(Ljava/lang/Class;)V");
742*0797b24eSAndroid Build Coastguard Worker 
743*0797b24eSAndroid Build Coastguard Worker   // OK.
744*0797b24eSAndroid Build Coastguard Worker   EXPECT_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kCriticalNative, TestJni::v_i, "(I)V");
745*0797b24eSAndroid Build Coastguard Worker   EXPECT_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kNormalNative,
746*0797b24eSAndroid Build Coastguard Worker                                                TestJni::v_eoo,
747*0797b24eSAndroid Build Coastguard Worker                                                "(Ljava/lang/Object;)V");
748*0797b24eSAndroid Build Coastguard Worker 
749*0797b24eSAndroid Build Coastguard Worker   EXPECT_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kCriticalNative, TestJni::v_lib, "(JIZ)V");
750*0797b24eSAndroid Build Coastguard Worker   EXPECT_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kNormalNative, TestJni::v_eolib, "(JIZ)V");
751*0797b24eSAndroid Build Coastguard Worker   EXPECT_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kCriticalNative, TestJni::s_lib, "(JIZ)S");
752*0797b24eSAndroid Build Coastguard Worker   EXPECT_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kNormalNative, TestJni::s_eolAibA, "([JI[Z)S");
753*0797b24eSAndroid Build Coastguard Worker }
754*0797b24eSAndroid Build Coastguard Worker 
TEST(JniSafeRegisterNativeMethods,Infer)755*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, Infer) {
756*0797b24eSAndroid Build Coastguard Worker   using namespace nativehelper::detail;  // NOLINT
757*0797b24eSAndroid Build Coastguard Worker   {
758*0797b24eSAndroid Build Coastguard Worker     using Infer_v_eolib_t = InferJniDescriptor<kNormalNative,
759*0797b24eSAndroid Build Coastguard Worker                                                decltype(TestJni::v_eolib),
760*0797b24eSAndroid Build Coastguard Worker                                                TestJni::v_eolib>;
761*0797b24eSAndroid Build Coastguard Worker     EXPECT_CONSTEXPR_EQ(6u, Infer_v_eolib_t::kMaxStringSize);
762*0797b24eSAndroid Build Coastguard Worker     std::string x = Infer_v_eolib_t::GetStringAtRuntime();
763*0797b24eSAndroid Build Coastguard Worker     EXPECT_STRINGIFY_EQ("(JIZ)V", x.c_str());
764*0797b24eSAndroid Build Coastguard Worker   }
765*0797b24eSAndroid Build Coastguard Worker 
766*0797b24eSAndroid Build Coastguard Worker   {
767*0797b24eSAndroid Build Coastguard Worker     using Infer_v_eolib_t = InferJniDescriptor<kNormalNative,
768*0797b24eSAndroid Build Coastguard Worker                                                decltype(TestJni::s_eolAibA),
769*0797b24eSAndroid Build Coastguard Worker                                                TestJni::s_eolAibA>;
770*0797b24eSAndroid Build Coastguard Worker     EXPECT_STRINGIFY_EQ("args={[J,I,[Z}, ret=S", Infer_v_eolib_t::FromFunctionType().value());
771*0797b24eSAndroid Build Coastguard Worker     EXPECT_CONSTEXPR_EQ(8u, Infer_v_eolib_t::kMaxStringSize);
772*0797b24eSAndroid Build Coastguard Worker     std::string x = Infer_v_eolib_t::GetStringAtRuntime();
773*0797b24eSAndroid Build Coastguard Worker     EXPECT_STRINGIFY_EQ("([JI[Z)S", x.c_str());
774*0797b24eSAndroid Build Coastguard Worker   }
775*0797b24eSAndroid Build Coastguard Worker }
776*0797b24eSAndroid Build Coastguard Worker 
777*0797b24eSAndroid Build Coastguard Worker // Test the macro definition only. See other tests above for signature-match testing.
TEST(JniSafeRegisterNativeMethods,MakeCheckedJniNativeMethod)778*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, MakeCheckedJniNativeMethod) {
779*0797b24eSAndroid Build Coastguard Worker   // Ensure the temporary variables don't conflict with other local vars of same name.
780*0797b24eSAndroid Build Coastguard Worker   JNINativeMethod tmp_native_method;  // shadow test.
781*0797b24eSAndroid Build Coastguard Worker   (void) tmp_native_method;
782*0797b24eSAndroid Build Coastguard Worker   bool is_signature_valid = true;  // shadow test.
783*0797b24eSAndroid Build Coastguard Worker   (void) is_signature_valid;
784*0797b24eSAndroid Build Coastguard Worker 
785*0797b24eSAndroid Build Coastguard Worker   // Ensure it works with critical.
786*0797b24eSAndroid Build Coastguard Worker   {
787*0797b24eSAndroid Build Coastguard Worker     JNINativeMethod m =
788*0797b24eSAndroid Build Coastguard Worker         MAKE_CHECKED_JNI_NATIVE_METHOD(kCriticalNative,
789*0797b24eSAndroid Build Coastguard Worker                                        "v_lib",
790*0797b24eSAndroid Build Coastguard Worker                                        "(JIZ)V",
791*0797b24eSAndroid Build Coastguard Worker                                        TestJni::v_lib);
792*0797b24eSAndroid Build Coastguard Worker     (void)m;
793*0797b24eSAndroid Build Coastguard Worker   }
794*0797b24eSAndroid Build Coastguard Worker 
795*0797b24eSAndroid Build Coastguard Worker   // Ensure it works with normal.
796*0797b24eSAndroid Build Coastguard Worker   {
797*0797b24eSAndroid Build Coastguard Worker     JNINativeMethod m =
798*0797b24eSAndroid Build Coastguard Worker         MAKE_CHECKED_JNI_NATIVE_METHOD(kNormalNative,
799*0797b24eSAndroid Build Coastguard Worker                                        "v_eolib",
800*0797b24eSAndroid Build Coastguard Worker                                        "(JIZ)V",
801*0797b24eSAndroid Build Coastguard Worker                                        TestJni::v_eolib);
802*0797b24eSAndroid Build Coastguard Worker     (void)m;
803*0797b24eSAndroid Build Coastguard Worker   }
804*0797b24eSAndroid Build Coastguard Worker 
805*0797b24eSAndroid Build Coastguard Worker   // Make sure macros properly expand inside of an array.
806*0797b24eSAndroid Build Coastguard Worker   {
807*0797b24eSAndroid Build Coastguard Worker     JNINativeMethod m_array[] = {
808*0797b24eSAndroid Build Coastguard Worker         MAKE_CHECKED_JNI_NATIVE_METHOD(kCriticalNative,
809*0797b24eSAndroid Build Coastguard Worker                                        "v_lib",
810*0797b24eSAndroid Build Coastguard Worker                                        "(JIZ)V",
811*0797b24eSAndroid Build Coastguard Worker                                        TestJni::v_lib),
812*0797b24eSAndroid Build Coastguard Worker         MAKE_CHECKED_JNI_NATIVE_METHOD(kNormalNative,
813*0797b24eSAndroid Build Coastguard Worker                                        "v_eolib",
814*0797b24eSAndroid Build Coastguard Worker                                        "(JIZ)V",
815*0797b24eSAndroid Build Coastguard Worker                                        TestJni::v_eolib),
816*0797b24eSAndroid Build Coastguard Worker     };
817*0797b24eSAndroid Build Coastguard Worker     (void)m_array;
818*0797b24eSAndroid Build Coastguard Worker   }
819*0797b24eSAndroid Build Coastguard Worker   {
820*0797b24eSAndroid Build Coastguard Worker     JNINativeMethod m_array_direct[] {
821*0797b24eSAndroid Build Coastguard Worker         MAKE_CHECKED_JNI_NATIVE_METHOD(kCriticalNative,
822*0797b24eSAndroid Build Coastguard Worker                                        "v_lib",
823*0797b24eSAndroid Build Coastguard Worker                                        "(JIZ)V",
824*0797b24eSAndroid Build Coastguard Worker                                        TestJni::v_lib),
825*0797b24eSAndroid Build Coastguard Worker         MAKE_CHECKED_JNI_NATIVE_METHOD(kNormalNative,
826*0797b24eSAndroid Build Coastguard Worker                                        "v_eolib",
827*0797b24eSAndroid Build Coastguard Worker                                        "(JIZ)V",
828*0797b24eSAndroid Build Coastguard Worker                                        TestJni::v_eolib),
829*0797b24eSAndroid Build Coastguard Worker     };
830*0797b24eSAndroid Build Coastguard Worker     (void)m_array_direct;
831*0797b24eSAndroid Build Coastguard Worker   }
832*0797b24eSAndroid Build Coastguard Worker 
833*0797b24eSAndroid Build Coastguard Worker }
834*0797b24eSAndroid Build Coastguard Worker 
835*0797b24eSAndroid Build Coastguard Worker static auto sTestCheckedAtFileScope =
836*0797b24eSAndroid Build Coastguard Worker         MAKE_CHECKED_JNI_NATIVE_METHOD(kCriticalNative,
837*0797b24eSAndroid Build Coastguard Worker                                        "v_lib",
838*0797b24eSAndroid Build Coastguard Worker                                        "(JIZ)V",
839*0797b24eSAndroid Build Coastguard Worker                                        TestJni::v_lib);
840*0797b24eSAndroid Build Coastguard Worker 
841*0797b24eSAndroid Build Coastguard Worker static auto sTestInferredAtFileScope =
842*0797b24eSAndroid Build Coastguard Worker         MAKE_INFERRED_JNI_NATIVE_METHOD(kCriticalNative,
843*0797b24eSAndroid Build Coastguard Worker                                        "v_lib",
844*0797b24eSAndroid Build Coastguard Worker                                        TestJni::v_lib);
845*0797b24eSAndroid Build Coastguard Worker 
TEST(JniSafeRegisterNativeMethods,TestInferredJniNativeMethod)846*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, TestInferredJniNativeMethod) {
847*0797b24eSAndroid Build Coastguard Worker   (void) sTestCheckedAtFileScope;
848*0797b24eSAndroid Build Coastguard Worker   (void) sTestInferredAtFileScope;
849*0797b24eSAndroid Build Coastguard Worker 
850*0797b24eSAndroid Build Coastguard Worker   // Ensure it works with critical.
851*0797b24eSAndroid Build Coastguard Worker   {
852*0797b24eSAndroid Build Coastguard Worker     JNINativeMethod m =
853*0797b24eSAndroid Build Coastguard Worker         MAKE_INFERRED_JNI_NATIVE_METHOD(kCriticalNative,
854*0797b24eSAndroid Build Coastguard Worker                                        "v_lib",
855*0797b24eSAndroid Build Coastguard Worker                                        TestJni::v_lib);
856*0797b24eSAndroid Build Coastguard Worker     (void)m;
857*0797b24eSAndroid Build Coastguard Worker   }
858*0797b24eSAndroid Build Coastguard Worker 
859*0797b24eSAndroid Build Coastguard Worker   // Ensure it works with normal.
860*0797b24eSAndroid Build Coastguard Worker   {
861*0797b24eSAndroid Build Coastguard Worker     JNINativeMethod m =
862*0797b24eSAndroid Build Coastguard Worker         MAKE_INFERRED_JNI_NATIVE_METHOD(kNormalNative,
863*0797b24eSAndroid Build Coastguard Worker                                        "v_eolib",
864*0797b24eSAndroid Build Coastguard Worker                                        TestJni::v_eolib);
865*0797b24eSAndroid Build Coastguard Worker     (void)m;
866*0797b24eSAndroid Build Coastguard Worker   }
867*0797b24eSAndroid Build Coastguard Worker }
868*0797b24eSAndroid Build Coastguard Worker 
TestJniMacros_v_lib(jlong,jint,jboolean)869*0797b24eSAndroid Build Coastguard Worker static void TestJniMacros_v_lib(jlong, jint, jboolean) {}
TestJniMacros_v_lib_od(jlong,jint,jboolean)870*0797b24eSAndroid Build Coastguard Worker static void TestJniMacros_v_lib_od(jlong, jint, jboolean) {}
TestJniMacros_v_eolib(JNIEnv *,jobject,jlong,jint,jboolean)871*0797b24eSAndroid Build Coastguard Worker static void TestJniMacros_v_eolib(JNIEnv*, jobject, jlong, jint, jboolean) {}
TestJniMacros_v_eolib_od(JNIEnv *,jobject,jlong,jint,jboolean)872*0797b24eSAndroid Build Coastguard Worker static void TestJniMacros_v_eolib_od(JNIEnv*, jobject, jlong, jint, jboolean) {}
873*0797b24eSAndroid Build Coastguard Worker 
874*0797b24eSAndroid Build Coastguard Worker #pragma clang diagnostic push
875*0797b24eSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wunused-parameter"
876*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_dataSize(jlong)877*0797b24eSAndroid Build Coastguard Worker static jint android_os_Parcel_dataSize(jlong) { return 0; }
android_os_Parcel_dataAvail(jlong)878*0797b24eSAndroid Build Coastguard Worker static jint android_os_Parcel_dataAvail(jlong) { return 0; }
android_os_Parcel_dataPosition(jlong)879*0797b24eSAndroid Build Coastguard Worker static jint android_os_Parcel_dataPosition(jlong) { return 0; }
android_os_Parcel_dataCapacity(jlong)880*0797b24eSAndroid Build Coastguard Worker static jint android_os_Parcel_dataCapacity(jlong) { return 0; }
android_os_Parcel_setDataSize(JNIEnv *,jclass,jlong,jint)881*0797b24eSAndroid Build Coastguard Worker static jlong android_os_Parcel_setDataSize(JNIEnv*, jclass, jlong, jint) { return 0; }
android_os_Parcel_setDataPosition(jlong,jint)882*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_setDataPosition(jlong, jint) {}
android_os_Parcel_setDataCapacity(JNIEnv *,jclass,jlong,jint)883*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_setDataCapacity(JNIEnv*, jclass, jlong, jint) {}
android_os_Parcel_pushAllowFds(jlong,jboolean)884*0797b24eSAndroid Build Coastguard Worker static jboolean android_os_Parcel_pushAllowFds(jlong, jboolean) { return true; }
android_os_Parcel_restoreAllowFds(jlong,jboolean)885*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_restoreAllowFds(jlong, jboolean) {}
android_os_Parcel_writeByteArray(JNIEnv *,jclass,jlong,jbyteArray,jint,jint)886*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_writeByteArray(JNIEnv*, jclass, jlong, jbyteArray, jint, jint) {}
887*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_writeBlob(JNIEnv *,jclass,jlong,jbyteArray,jint,jint)888*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_writeBlob(JNIEnv*, jclass, jlong, jbyteArray, jint, jint) {}
android_os_Parcel_writeInt(JNIEnv *,jclass,jlong,jint)889*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_writeInt(JNIEnv*, jclass, jlong, jint) {}
android_os_Parcel_writeLong(JNIEnv * env,jclass clazz,jlong nativePtr,jlong val)890*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_writeLong(JNIEnv* env,
891*0797b24eSAndroid Build Coastguard Worker                                         jclass clazz,
892*0797b24eSAndroid Build Coastguard Worker                                         jlong nativePtr,
893*0797b24eSAndroid Build Coastguard Worker                                         jlong val) {}
android_os_Parcel_writeFloat(JNIEnv * env,jclass clazz,jlong nativePtr,jfloat val)894*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_writeFloat(JNIEnv* env,
895*0797b24eSAndroid Build Coastguard Worker                                          jclass clazz,
896*0797b24eSAndroid Build Coastguard Worker                                          jlong nativePtr,
897*0797b24eSAndroid Build Coastguard Worker                                          jfloat val) {}
android_os_Parcel_writeDouble(JNIEnv * env,jclass clazz,jlong nativePtr,jdouble val)898*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_writeDouble(JNIEnv* env,
899*0797b24eSAndroid Build Coastguard Worker                                           jclass clazz,
900*0797b24eSAndroid Build Coastguard Worker                                           jlong nativePtr,
901*0797b24eSAndroid Build Coastguard Worker                                           jdouble val) {}
android_os_Parcel_writeString(JNIEnv * env,jclass clazz,jlong nativePtr,jstring val)902*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_writeString(JNIEnv* env,
903*0797b24eSAndroid Build Coastguard Worker                                           jclass clazz,
904*0797b24eSAndroid Build Coastguard Worker                                           jlong nativePtr,
905*0797b24eSAndroid Build Coastguard Worker                                           jstring val) {}
android_os_Parcel_writeStrongBinder(JNIEnv * env,jclass clazz,jlong nativePtr,jobject object)906*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_writeStrongBinder(JNIEnv* env,
907*0797b24eSAndroid Build Coastguard Worker                                                 jclass clazz,
908*0797b24eSAndroid Build Coastguard Worker                                                 jlong nativePtr,
909*0797b24eSAndroid Build Coastguard Worker                                                 jobject object) {}
android_os_Parcel_writeFileDescriptor(JNIEnv * env,jclass clazz,jlong nativePtr,jobject object)910*0797b24eSAndroid Build Coastguard Worker static jlong android_os_Parcel_writeFileDescriptor(JNIEnv* env,
911*0797b24eSAndroid Build Coastguard Worker                                                    jclass clazz,
912*0797b24eSAndroid Build Coastguard Worker                                                    jlong nativePtr,
913*0797b24eSAndroid Build Coastguard Worker                                                    jobject object) { return 0; }
android_os_Parcel_createByteArray(JNIEnv * env,jclass clazz,jlong nativePtr)914*0797b24eSAndroid Build Coastguard Worker static jbyteArray android_os_Parcel_createByteArray(JNIEnv* env,
915*0797b24eSAndroid Build Coastguard Worker                                                     jclass clazz,
916*0797b24eSAndroid Build Coastguard Worker                                                     jlong nativePtr) { return nullptr; }
917*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_readByteArray(JNIEnv * env,jclass clazz,jlong nativePtr,jbyteArray dest,jint destLen)918*0797b24eSAndroid Build Coastguard Worker static jboolean android_os_Parcel_readByteArray(JNIEnv* env,
919*0797b24eSAndroid Build Coastguard Worker                                                 jclass clazz,
920*0797b24eSAndroid Build Coastguard Worker                                                 jlong nativePtr,
921*0797b24eSAndroid Build Coastguard Worker                                                 jbyteArray dest,
922*0797b24eSAndroid Build Coastguard Worker                                                 jint destLen) { return false; }
android_os_Parcel_readBlob(JNIEnv * env,jclass clazz,jlong nativePtr)923*0797b24eSAndroid Build Coastguard Worker static jbyteArray android_os_Parcel_readBlob(JNIEnv* env,
924*0797b24eSAndroid Build Coastguard Worker                                              jclass clazz,
925*0797b24eSAndroid Build Coastguard Worker                                              jlong nativePtr) { return nullptr; }
926*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_readInt(jlong nativePtr)927*0797b24eSAndroid Build Coastguard Worker static jint android_os_Parcel_readInt(jlong nativePtr) { return 0; }
928*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_readLong(jlong nativePtr)929*0797b24eSAndroid Build Coastguard Worker static jlong android_os_Parcel_readLong(jlong nativePtr) { return 0; }
930*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_readFloat(jlong nativePtr)931*0797b24eSAndroid Build Coastguard Worker static jfloat android_os_Parcel_readFloat(jlong nativePtr) { return 0.0f; }
android_os_Parcel_readDouble(jlong nativePtr)932*0797b24eSAndroid Build Coastguard Worker static jdouble android_os_Parcel_readDouble(jlong nativePtr) { return 0.0; }
933*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_readString(JNIEnv * env,jclass clazz,jlong nativePtr)934*0797b24eSAndroid Build Coastguard Worker static jstring android_os_Parcel_readString(JNIEnv* env,
935*0797b24eSAndroid Build Coastguard Worker                                             jclass clazz,
936*0797b24eSAndroid Build Coastguard Worker                                             jlong nativePtr) { return nullptr; }
937*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_readStrongBinder(JNIEnv * env,jclass clazz,jlong nativePtr)938*0797b24eSAndroid Build Coastguard Worker static jobject android_os_Parcel_readStrongBinder(JNIEnv* env,
939*0797b24eSAndroid Build Coastguard Worker                                                   jclass clazz,
940*0797b24eSAndroid Build Coastguard Worker                                                   jlong nativePtr) { return nullptr; }
941*0797b24eSAndroid Build Coastguard Worker 
942*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_readFileDescriptor(JNIEnv * env,jclass clazz,jlong nativePtr)943*0797b24eSAndroid Build Coastguard Worker static jobject android_os_Parcel_readFileDescriptor(JNIEnv* env,
944*0797b24eSAndroid Build Coastguard Worker                                                     jclass clazz,
945*0797b24eSAndroid Build Coastguard Worker                                                     jlong nativePtr) { return nullptr; }
946*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_openFileDescriptor(JNIEnv * env,jclass clazz,jstring name,jint mode)947*0797b24eSAndroid Build Coastguard Worker static jobject android_os_Parcel_openFileDescriptor(JNIEnv* env,
948*0797b24eSAndroid Build Coastguard Worker                                                     jclass clazz,
949*0797b24eSAndroid Build Coastguard Worker                                                     jstring name,
950*0797b24eSAndroid Build Coastguard Worker                                                     jint mode) { return 0; }
951*0797b24eSAndroid Build Coastguard Worker 
952*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_dupFileDescriptor(JNIEnv * env,jclass clazz,jobject orig)953*0797b24eSAndroid Build Coastguard Worker static jobject android_os_Parcel_dupFileDescriptor(JNIEnv* env,
954*0797b24eSAndroid Build Coastguard Worker                                                    jclass clazz,
955*0797b24eSAndroid Build Coastguard Worker                                                    jobject orig) { return 0; }
956*0797b24eSAndroid Build Coastguard Worker 
957*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_closeFileDescriptor(JNIEnv * env,jclass clazz,jobject object)958*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_closeFileDescriptor(JNIEnv* env,
959*0797b24eSAndroid Build Coastguard Worker                                                   jclass clazz,
960*0797b24eSAndroid Build Coastguard Worker                                                   jobject object) {}
961*0797b24eSAndroid Build Coastguard Worker 
962*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_clearFileDescriptor(JNIEnv * env,jclass clazz,jobject object)963*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_clearFileDescriptor(JNIEnv* env,
964*0797b24eSAndroid Build Coastguard Worker                                                   jclass clazz,
965*0797b24eSAndroid Build Coastguard Worker                                                   jobject object) {}
966*0797b24eSAndroid Build Coastguard Worker 
967*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_create(JNIEnv * env,jclass clazz)968*0797b24eSAndroid Build Coastguard Worker static jlong android_os_Parcel_create(JNIEnv* env, jclass clazz) { return 0; }
969*0797b24eSAndroid Build Coastguard Worker 
970*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_freeBuffer(JNIEnv * env,jclass clazz,jlong nativePtr)971*0797b24eSAndroid Build Coastguard Worker static jlong android_os_Parcel_freeBuffer(JNIEnv* env,
972*0797b24eSAndroid Build Coastguard Worker                                           jclass clazz,
973*0797b24eSAndroid Build Coastguard Worker                                           jlong nativePtr) { return 0; }
974*0797b24eSAndroid Build Coastguard Worker 
975*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_destroy(JNIEnv * env,jclass clazz,jlong nativePtr)976*0797b24eSAndroid Build Coastguard Worker static void  android_os_Parcel_destroy(JNIEnv* env, jclass clazz, jlong nativePtr) {}
977*0797b24eSAndroid Build Coastguard Worker 
978*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_marshall(JNIEnv * env,jclass clazz,jlong nativePtr)979*0797b24eSAndroid Build Coastguard Worker static jbyteArray android_os_Parcel_marshall(JNIEnv* env,
980*0797b24eSAndroid Build Coastguard Worker                                              jclass clazz,
981*0797b24eSAndroid Build Coastguard Worker                                              jlong nativePtr) { return 0; }
982*0797b24eSAndroid Build Coastguard Worker 
983*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_unmarshall(JNIEnv * env,jclass clazz,jlong nativePtr,jbyteArray data,jint offset,jint length)984*0797b24eSAndroid Build Coastguard Worker static jlong android_os_Parcel_unmarshall(JNIEnv* env,
985*0797b24eSAndroid Build Coastguard Worker                                           jclass clazz,
986*0797b24eSAndroid Build Coastguard Worker                                           jlong nativePtr,
987*0797b24eSAndroid Build Coastguard Worker                                           jbyteArray data,
988*0797b24eSAndroid Build Coastguard Worker                                           jint offset,
989*0797b24eSAndroid Build Coastguard Worker                                           jint length) { return 0; }
990*0797b24eSAndroid Build Coastguard Worker 
991*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_compareData(JNIEnv * env,jclass clazz,jlong thisNativePtr,jlong otherNativePtr)992*0797b24eSAndroid Build Coastguard Worker static jint android_os_Parcel_compareData(JNIEnv* env,
993*0797b24eSAndroid Build Coastguard Worker                                           jclass clazz,
994*0797b24eSAndroid Build Coastguard Worker                                           jlong thisNativePtr,
995*0797b24eSAndroid Build Coastguard Worker                                           jlong otherNativePtr) { return 0; }
996*0797b24eSAndroid Build Coastguard Worker 
997*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_appendFrom(JNIEnv * env,jclass clazz,jlong thisNativePtr,jlong otherNativePtr,jint offset,jint length)998*0797b24eSAndroid Build Coastguard Worker static jlong android_os_Parcel_appendFrom(JNIEnv* env,
999*0797b24eSAndroid Build Coastguard Worker                                           jclass clazz,
1000*0797b24eSAndroid Build Coastguard Worker                                           jlong thisNativePtr,
1001*0797b24eSAndroid Build Coastguard Worker                                           jlong otherNativePtr,
1002*0797b24eSAndroid Build Coastguard Worker                                           jint offset,
1003*0797b24eSAndroid Build Coastguard Worker                                           jint length) { return 0; }
1004*0797b24eSAndroid Build Coastguard Worker 
1005*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_hasFileDescriptors(jlong nativePtr)1006*0797b24eSAndroid Build Coastguard Worker static jboolean android_os_Parcel_hasFileDescriptors(jlong nativePtr) { return 0; }
1007*0797b24eSAndroid Build Coastguard Worker 
1008*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_writeInterfaceToken(JNIEnv * env,jclass clazz,jlong nativePtr,jstring name)1009*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_writeInterfaceToken(JNIEnv* env,
1010*0797b24eSAndroid Build Coastguard Worker                                                   jclass clazz,
1011*0797b24eSAndroid Build Coastguard Worker                                                   jlong nativePtr,
1012*0797b24eSAndroid Build Coastguard Worker                                                   jstring name) {}
1013*0797b24eSAndroid Build Coastguard Worker 
1014*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_enforceInterface(JNIEnv * env,jclass clazz,jlong nativePtr,jstring name)1015*0797b24eSAndroid Build Coastguard Worker static void android_os_Parcel_enforceInterface(JNIEnv* env,
1016*0797b24eSAndroid Build Coastguard Worker                                                jclass clazz,
1017*0797b24eSAndroid Build Coastguard Worker                                                jlong nativePtr,
1018*0797b24eSAndroid Build Coastguard Worker                                                jstring name) {}
1019*0797b24eSAndroid Build Coastguard Worker 
1020*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_getGlobalAllocSize(JNIEnv * env,jclass clazz)1021*0797b24eSAndroid Build Coastguard Worker static jlong android_os_Parcel_getGlobalAllocSize(JNIEnv* env, jclass clazz) { return 0; }
1022*0797b24eSAndroid Build Coastguard Worker 
1023*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_getGlobalAllocCount(JNIEnv * env,jclass clazz)1024*0797b24eSAndroid Build Coastguard Worker static jlong android_os_Parcel_getGlobalAllocCount(JNIEnv* env, jclass clazz) { return 0; }
1025*0797b24eSAndroid Build Coastguard Worker 
1026*0797b24eSAndroid Build Coastguard Worker 
android_os_Parcel_getBlobAshmemSize(jlong nativePtr)1027*0797b24eSAndroid Build Coastguard Worker static jlong android_os_Parcel_getBlobAshmemSize(jlong nativePtr) { return 0; }
1028*0797b24eSAndroid Build Coastguard Worker 
1029*0797b24eSAndroid Build Coastguard Worker #pragma clang diagnostic pop
1030*0797b24eSAndroid Build Coastguard Worker 
TEST(JniSafeRegisterNativeMethods,ParcelExample)1031*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, ParcelExample) {
1032*0797b24eSAndroid Build Coastguard Worker   // Test a wide range of automatic signature inferencing.
1033*0797b24eSAndroid Build Coastguard Worker   // This is taken from real code in android_os_Parcel.cpp.
1034*0797b24eSAndroid Build Coastguard Worker 
1035*0797b24eSAndroid Build Coastguard Worker   const JNINativeMethod gParcelMethods[] = {
1036*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1037*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
1038*0797b24eSAndroid Build Coastguard Worker         "nativeDataSize", android_os_Parcel_dataSize),
1039*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1040*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
1041*0797b24eSAndroid Build Coastguard Worker         "nativeDataAvail", android_os_Parcel_dataAvail),
1042*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1043*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
1044*0797b24eSAndroid Build Coastguard Worker         "nativeDataPosition", android_os_Parcel_dataPosition),
1045*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1046*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
1047*0797b24eSAndroid Build Coastguard Worker         "nativeDataCapacity", android_os_Parcel_dataCapacity),
1048*0797b24eSAndroid Build Coastguard Worker     // @FastNative
1049*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_FAST_NATIVE_METHOD_AUTOSIG(
1050*0797b24eSAndroid Build Coastguard Worker         "nativeSetDataSize",  android_os_Parcel_setDataSize),
1051*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1052*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
1053*0797b24eSAndroid Build Coastguard Worker         "nativeSetDataPosition", android_os_Parcel_setDataPosition),
1054*0797b24eSAndroid Build Coastguard Worker     // @FastNative
1055*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_FAST_NATIVE_METHOD_AUTOSIG(
1056*0797b24eSAndroid Build Coastguard Worker         "nativeSetDataCapacity", android_os_Parcel_setDataCapacity),
1057*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1058*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
1059*0797b24eSAndroid Build Coastguard Worker         "nativePushAllowFds", android_os_Parcel_pushAllowFds),
1060*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1061*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
1062*0797b24eSAndroid Build Coastguard Worker         "nativeRestoreAllowFds", android_os_Parcel_restoreAllowFds),
1063*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1064*0797b24eSAndroid Build Coastguard Worker         "nativeWriteByteArray", android_os_Parcel_writeByteArray),
1065*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1066*0797b24eSAndroid Build Coastguard Worker         "nativeWriteBlob", android_os_Parcel_writeBlob),
1067*0797b24eSAndroid Build Coastguard Worker     // @FastNative
1068*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_FAST_NATIVE_METHOD_AUTOSIG(
1069*0797b24eSAndroid Build Coastguard Worker         "nativeWriteInt", android_os_Parcel_writeInt),
1070*0797b24eSAndroid Build Coastguard Worker     // @FastNative
1071*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_FAST_NATIVE_METHOD_AUTOSIG(
1072*0797b24eSAndroid Build Coastguard Worker         "nativeWriteLong", android_os_Parcel_writeLong),
1073*0797b24eSAndroid Build Coastguard Worker     // @FastNative
1074*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_FAST_NATIVE_METHOD_AUTOSIG(
1075*0797b24eSAndroid Build Coastguard Worker         "nativeWriteFloat", android_os_Parcel_writeFloat),
1076*0797b24eSAndroid Build Coastguard Worker     // @FastNative
1077*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_FAST_NATIVE_METHOD_AUTOSIG(
1078*0797b24eSAndroid Build Coastguard Worker         "nativeWriteDouble", android_os_Parcel_writeDouble),
1079*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1080*0797b24eSAndroid Build Coastguard Worker         "nativeWriteString",  android_os_Parcel_writeString),
1081*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD(
1082*0797b24eSAndroid Build Coastguard Worker         "nativeWriteStrongBinder", "(JLandroid/os/IBinder;)V", android_os_Parcel_writeStrongBinder),
1083*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD(
1084*0797b24eSAndroid Build Coastguard Worker         "nativeWriteFileDescriptor", "(JLjava/io/FileDescriptor;)J", android_os_Parcel_writeFileDescriptor),
1085*0797b24eSAndroid Build Coastguard Worker 
1086*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1087*0797b24eSAndroid Build Coastguard Worker         "nativeCreateByteArray", android_os_Parcel_createByteArray),
1088*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1089*0797b24eSAndroid Build Coastguard Worker         "nativeReadByteArray", android_os_Parcel_readByteArray),
1090*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1091*0797b24eSAndroid Build Coastguard Worker         "nativeReadBlob", android_os_Parcel_readBlob),
1092*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1093*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
1094*0797b24eSAndroid Build Coastguard Worker         "nativeReadInt", android_os_Parcel_readInt),
1095*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1096*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
1097*0797b24eSAndroid Build Coastguard Worker         "nativeReadLong", android_os_Parcel_readLong),
1098*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1099*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
1100*0797b24eSAndroid Build Coastguard Worker         "nativeReadFloat", android_os_Parcel_readFloat),
1101*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1102*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
1103*0797b24eSAndroid Build Coastguard Worker         "nativeReadDouble", android_os_Parcel_readDouble),
1104*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1105*0797b24eSAndroid Build Coastguard Worker         "nativeReadString", android_os_Parcel_readString),
1106*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD(
1107*0797b24eSAndroid Build Coastguard Worker         "nativeReadStrongBinder", "(J)Landroid/os/IBinder;", android_os_Parcel_readStrongBinder),
1108*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD(
1109*0797b24eSAndroid Build Coastguard Worker         "nativeReadFileDescriptor", "(J)Ljava/io/FileDescriptor;", android_os_Parcel_readFileDescriptor),
1110*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD(
1111*0797b24eSAndroid Build Coastguard Worker         "openFileDescriptor", "(Ljava/lang/String;I)Ljava/io/FileDescriptor;", android_os_Parcel_openFileDescriptor),
1112*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD(
1113*0797b24eSAndroid Build Coastguard Worker         "dupFileDescriptor", "(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;", android_os_Parcel_dupFileDescriptor),
1114*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD(
1115*0797b24eSAndroid Build Coastguard Worker         "closeFileDescriptor", "(Ljava/io/FileDescriptor;)V", android_os_Parcel_closeFileDescriptor),
1116*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD(
1117*0797b24eSAndroid Build Coastguard Worker         "clearFileDescriptor", "(Ljava/io/FileDescriptor;)V", android_os_Parcel_clearFileDescriptor),
1118*0797b24eSAndroid Build Coastguard Worker 
1119*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1120*0797b24eSAndroid Build Coastguard Worker         "nativeCreate", android_os_Parcel_create),
1121*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1122*0797b24eSAndroid Build Coastguard Worker         "nativeFreeBuffer", android_os_Parcel_freeBuffer),
1123*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1124*0797b24eSAndroid Build Coastguard Worker         "nativeDestroy", android_os_Parcel_destroy),
1125*0797b24eSAndroid Build Coastguard Worker 
1126*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1127*0797b24eSAndroid Build Coastguard Worker         "nativeMarshall", android_os_Parcel_marshall),
1128*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1129*0797b24eSAndroid Build Coastguard Worker         "nativeUnmarshall", android_os_Parcel_unmarshall),
1130*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1131*0797b24eSAndroid Build Coastguard Worker         "nativeCompareData", android_os_Parcel_compareData),
1132*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1133*0797b24eSAndroid Build Coastguard Worker         "nativeAppendFrom", android_os_Parcel_appendFrom),
1134*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1135*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
1136*0797b24eSAndroid Build Coastguard Worker         "nativeHasFileDescriptors", android_os_Parcel_hasFileDescriptors),
1137*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1138*0797b24eSAndroid Build Coastguard Worker         "nativeWriteInterfaceToken", android_os_Parcel_writeInterfaceToken),
1139*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1140*0797b24eSAndroid Build Coastguard Worker         "nativeEnforceInterface", android_os_Parcel_enforceInterface),
1141*0797b24eSAndroid Build Coastguard Worker 
1142*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1143*0797b24eSAndroid Build Coastguard Worker         "getGlobalAllocSize", android_os_Parcel_getGlobalAllocSize),
1144*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_NATIVE_METHOD_AUTOSIG(
1145*0797b24eSAndroid Build Coastguard Worker         "getGlobalAllocCount", android_os_Parcel_getGlobalAllocCount),
1146*0797b24eSAndroid Build Coastguard Worker 
1147*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1148*0797b24eSAndroid Build Coastguard Worker     MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
1149*0797b24eSAndroid Build Coastguard Worker         "nativeGetBlobAshmemSize", android_os_Parcel_getBlobAshmemSize),
1150*0797b24eSAndroid Build Coastguard Worker   };
1151*0797b24eSAndroid Build Coastguard Worker 
1152*0797b24eSAndroid Build Coastguard Worker   const JNINativeMethod gParcelMethodsExpected[] = {
1153*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1154*0797b24eSAndroid Build Coastguard Worker     {"nativeDataSize",            "(J)I", (void*)android_os_Parcel_dataSize},
1155*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1156*0797b24eSAndroid Build Coastguard Worker     {"nativeDataAvail",           "(J)I", (void*)android_os_Parcel_dataAvail},
1157*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1158*0797b24eSAndroid Build Coastguard Worker     {"nativeDataPosition",        "(J)I", (void*)android_os_Parcel_dataPosition},
1159*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1160*0797b24eSAndroid Build Coastguard Worker     {"nativeDataCapacity",        "(J)I", (void*)android_os_Parcel_dataCapacity},
1161*0797b24eSAndroid Build Coastguard Worker     // @FastNative
1162*0797b24eSAndroid Build Coastguard Worker     {"nativeSetDataSize",         "(JI)J", (void*)android_os_Parcel_setDataSize},
1163*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1164*0797b24eSAndroid Build Coastguard Worker     {"nativeSetDataPosition",     "(JI)V", (void*)android_os_Parcel_setDataPosition},
1165*0797b24eSAndroid Build Coastguard Worker     // @FastNative
1166*0797b24eSAndroid Build Coastguard Worker     {"nativeSetDataCapacity",     "(JI)V", (void*)android_os_Parcel_setDataCapacity},
1167*0797b24eSAndroid Build Coastguard Worker 
1168*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1169*0797b24eSAndroid Build Coastguard Worker     {"nativePushAllowFds",        "(JZ)Z", (void*)android_os_Parcel_pushAllowFds},
1170*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1171*0797b24eSAndroid Build Coastguard Worker     {"nativeRestoreAllowFds",     "(JZ)V", (void*)android_os_Parcel_restoreAllowFds},
1172*0797b24eSAndroid Build Coastguard Worker 
1173*0797b24eSAndroid Build Coastguard Worker     {"nativeWriteByteArray",      "(J[BII)V", (void*)android_os_Parcel_writeByteArray},
1174*0797b24eSAndroid Build Coastguard Worker     {"nativeWriteBlob",           "(J[BII)V", (void*)android_os_Parcel_writeBlob},
1175*0797b24eSAndroid Build Coastguard Worker     // @FastNative
1176*0797b24eSAndroid Build Coastguard Worker     {"nativeWriteInt",            "(JI)V", (void*)android_os_Parcel_writeInt},
1177*0797b24eSAndroid Build Coastguard Worker     // @FastNative
1178*0797b24eSAndroid Build Coastguard Worker     {"nativeWriteLong",           "(JJ)V", (void*)android_os_Parcel_writeLong},
1179*0797b24eSAndroid Build Coastguard Worker     // @FastNative
1180*0797b24eSAndroid Build Coastguard Worker     {"nativeWriteFloat",          "(JF)V", (void*)android_os_Parcel_writeFloat},
1181*0797b24eSAndroid Build Coastguard Worker     // @FastNative
1182*0797b24eSAndroid Build Coastguard Worker     {"nativeWriteDouble",         "(JD)V", (void*)android_os_Parcel_writeDouble},
1183*0797b24eSAndroid Build Coastguard Worker     {"nativeWriteString",         "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeString},
1184*0797b24eSAndroid Build Coastguard Worker     {"nativeWriteStrongBinder",   "(JLandroid/os/IBinder;)V", (void*)android_os_Parcel_writeStrongBinder},
1185*0797b24eSAndroid Build Coastguard Worker     {"nativeWriteFileDescriptor", "(JLjava/io/FileDescriptor;)J", (void*)android_os_Parcel_writeFileDescriptor},
1186*0797b24eSAndroid Build Coastguard Worker 
1187*0797b24eSAndroid Build Coastguard Worker     {"nativeCreateByteArray",     "(J)[B", (void*)android_os_Parcel_createByteArray},
1188*0797b24eSAndroid Build Coastguard Worker     {"nativeReadByteArray",       "(J[BI)Z", (void*)android_os_Parcel_readByteArray},
1189*0797b24eSAndroid Build Coastguard Worker     {"nativeReadBlob",            "(J)[B", (void*)android_os_Parcel_readBlob},
1190*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1191*0797b24eSAndroid Build Coastguard Worker     {"nativeReadInt",             "(J)I", (void*)android_os_Parcel_readInt},
1192*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1193*0797b24eSAndroid Build Coastguard Worker     {"nativeReadLong",            "(J)J", (void*)android_os_Parcel_readLong},
1194*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1195*0797b24eSAndroid Build Coastguard Worker     {"nativeReadFloat",           "(J)F", (void*)android_os_Parcel_readFloat},
1196*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1197*0797b24eSAndroid Build Coastguard Worker     {"nativeReadDouble",          "(J)D", (void*)android_os_Parcel_readDouble},
1198*0797b24eSAndroid Build Coastguard Worker     {"nativeReadString",          "(J)Ljava/lang/String;", (void*)android_os_Parcel_readString},
1199*0797b24eSAndroid Build Coastguard Worker     {"nativeReadStrongBinder",    "(J)Landroid/os/IBinder;", (void*)android_os_Parcel_readStrongBinder},
1200*0797b24eSAndroid Build Coastguard Worker     {"nativeReadFileDescriptor",  "(J)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_readFileDescriptor},
1201*0797b24eSAndroid Build Coastguard Worker 
1202*0797b24eSAndroid Build Coastguard Worker     {"openFileDescriptor",        "(Ljava/lang/String;I)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_openFileDescriptor},
1203*0797b24eSAndroid Build Coastguard Worker     {"dupFileDescriptor",         "(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_dupFileDescriptor},
1204*0797b24eSAndroid Build Coastguard Worker     {"closeFileDescriptor",       "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_closeFileDescriptor},
1205*0797b24eSAndroid Build Coastguard Worker     {"clearFileDescriptor",       "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_clearFileDescriptor},
1206*0797b24eSAndroid Build Coastguard Worker 
1207*0797b24eSAndroid Build Coastguard Worker     {"nativeCreate",              "()J", (void*)android_os_Parcel_create},
1208*0797b24eSAndroid Build Coastguard Worker     {"nativeFreeBuffer",          "(J)J", (void*)android_os_Parcel_freeBuffer},
1209*0797b24eSAndroid Build Coastguard Worker     {"nativeDestroy",             "(J)V", (void*)android_os_Parcel_destroy},
1210*0797b24eSAndroid Build Coastguard Worker 
1211*0797b24eSAndroid Build Coastguard Worker     {"nativeMarshall",            "(J)[B", (void*)android_os_Parcel_marshall},
1212*0797b24eSAndroid Build Coastguard Worker     {"nativeUnmarshall",          "(J[BII)J", (void*)android_os_Parcel_unmarshall},
1213*0797b24eSAndroid Build Coastguard Worker     {"nativeCompareData",         "(JJ)I", (void*)android_os_Parcel_compareData},
1214*0797b24eSAndroid Build Coastguard Worker     {"nativeAppendFrom",          "(JJII)J", (void*)android_os_Parcel_appendFrom},
1215*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1216*0797b24eSAndroid Build Coastguard Worker     {"nativeHasFileDescriptors",  "(J)Z", (void*)android_os_Parcel_hasFileDescriptors},
1217*0797b24eSAndroid Build Coastguard Worker     {"nativeWriteInterfaceToken", "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeInterfaceToken},
1218*0797b24eSAndroid Build Coastguard Worker     {"nativeEnforceInterface",    "(JLjava/lang/String;)V", (void*)android_os_Parcel_enforceInterface},
1219*0797b24eSAndroid Build Coastguard Worker 
1220*0797b24eSAndroid Build Coastguard Worker     {"getGlobalAllocSize",        "()J", (void*)android_os_Parcel_getGlobalAllocSize},
1221*0797b24eSAndroid Build Coastguard Worker     {"getGlobalAllocCount",       "()J", (void*)android_os_Parcel_getGlobalAllocCount},
1222*0797b24eSAndroid Build Coastguard Worker 
1223*0797b24eSAndroid Build Coastguard Worker     // @CriticalNative
1224*0797b24eSAndroid Build Coastguard Worker     {"nativeGetBlobAshmemSize",       "(J)J", (void*)android_os_Parcel_getBlobAshmemSize},
1225*0797b24eSAndroid Build Coastguard Worker   };
1226*0797b24eSAndroid Build Coastguard Worker 
1227*0797b24eSAndroid Build Coastguard Worker   ASSERT_EQ(sizeof(gParcelMethodsExpected)/sizeof(JNINativeMethod),
1228*0797b24eSAndroid Build Coastguard Worker             sizeof(gParcelMethods)/sizeof(JNINativeMethod));
1229*0797b24eSAndroid Build Coastguard Worker 
1230*0797b24eSAndroid Build Coastguard Worker 
1231*0797b24eSAndroid Build Coastguard Worker   for (size_t i = 0; i < sizeof(gParcelMethods) / sizeof(JNINativeMethod); ++i) {
1232*0797b24eSAndroid Build Coastguard Worker     const JNINativeMethod& actual = gParcelMethods[i];
1233*0797b24eSAndroid Build Coastguard Worker     const JNINativeMethod& expected = gParcelMethodsExpected[i];
1234*0797b24eSAndroid Build Coastguard Worker 
1235*0797b24eSAndroid Build Coastguard Worker     EXPECT_STREQ(expected.name, actual.name);
1236*0797b24eSAndroid Build Coastguard Worker     EXPECT_STREQ(expected.signature, actual.signature) << expected.name;
1237*0797b24eSAndroid Build Coastguard Worker     EXPECT_EQ(expected.fnPtr, actual.fnPtr) << expected.name;
1238*0797b24eSAndroid Build Coastguard Worker   }
1239*0797b24eSAndroid Build Coastguard Worker }
1240*0797b24eSAndroid Build Coastguard Worker 
TEST(JniSafeRegisterNativeMethods,JniMacros)1241*0797b24eSAndroid Build Coastguard Worker TEST(JniSafeRegisterNativeMethods, JniMacros) {
1242*0797b24eSAndroid Build Coastguard Worker   JNINativeMethod tmp_native_method;  // shadow variable check.
1243*0797b24eSAndroid Build Coastguard Worker   (void)tmp_native_method;
1244*0797b24eSAndroid Build Coastguard Worker   using Infer_t = int;  // shadow using check.
1245*0797b24eSAndroid Build Coastguard Worker   Infer_t unused;
1246*0797b24eSAndroid Build Coastguard Worker   (void)unused;
1247*0797b24eSAndroid Build Coastguard Worker 
1248*0797b24eSAndroid Build Coastguard Worker   MAKE_JNI_CRITICAL_NATIVE_METHOD("v_lib", "(JIZ)V", TestJniMacros_v_lib);
1249*0797b24eSAndroid Build Coastguard Worker   MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG("v_lib", TestJniMacros_v_lib);
1250*0797b24eSAndroid Build Coastguard Worker   CRITICAL_NATIVE_METHOD(TestJniMacros, v_lib, "(JIZ)V");
1251*0797b24eSAndroid Build Coastguard Worker   OVERLOADED_CRITICAL_NATIVE_METHOD(TestJniMacros, v_lib, "(JIZ)V", v_lib_od);
1252*0797b24eSAndroid Build Coastguard Worker   CRITICAL_NATIVE_METHOD_AUTOSIG(TestJniMacros, v_lib);
1253*0797b24eSAndroid Build Coastguard Worker 
1254*0797b24eSAndroid Build Coastguard Worker   MAKE_JNI_FAST_NATIVE_METHOD("v_eolib", "(JIZ)V", TestJniMacros_v_eolib);
1255*0797b24eSAndroid Build Coastguard Worker   MAKE_JNI_FAST_NATIVE_METHOD_AUTOSIG("v_eolib", TestJniMacros_v_eolib);
1256*0797b24eSAndroid Build Coastguard Worker   FAST_NATIVE_METHOD(TestJniMacros, v_eolib, "(JIZ)V");
1257*0797b24eSAndroid Build Coastguard Worker   OVERLOADED_FAST_NATIVE_METHOD(TestJniMacros, v_eolib, "(JIZ)V", v_eolib_od);
1258*0797b24eSAndroid Build Coastguard Worker   FAST_NATIVE_METHOD_AUTOSIG(TestJniMacros, v_eolib);
1259*0797b24eSAndroid Build Coastguard Worker 
1260*0797b24eSAndroid Build Coastguard Worker   MAKE_JNI_NATIVE_METHOD("v_eolib", "(JIZ)V", TestJniMacros_v_eolib);
1261*0797b24eSAndroid Build Coastguard Worker   MAKE_JNI_NATIVE_METHOD_AUTOSIG("v_eolib", TestJniMacros_v_eolib);
1262*0797b24eSAndroid Build Coastguard Worker   NATIVE_METHOD(TestJniMacros, v_eolib, "(JIZ)V");
1263*0797b24eSAndroid Build Coastguard Worker   OVERLOADED_NATIVE_METHOD(TestJniMacros, v_eolib, "(JIZ)V", v_eolib_od);
1264*0797b24eSAndroid Build Coastguard Worker   NATIVE_METHOD_AUTOSIG(TestJniMacros, v_eolib);
1265*0797b24eSAndroid Build Coastguard Worker 
1266*0797b24eSAndroid Build Coastguard Worker   _NATIVEHELPER_JNI_MAKE_METHOD_OLD(kNormalNative, "v_eolib", "(JIZ)V", TestJniMacros_v_eolib);
1267*0797b24eSAndroid Build Coastguard Worker   tmp_native_method =
1268*0797b24eSAndroid Build Coastguard Worker       _NATIVEHELPER_JNI_MAKE_METHOD_OLD(kNormalNative, "v_eolib", "(JIZ)V", TestJniMacros_v_eolib);
1269*0797b24eSAndroid Build Coastguard Worker }
1270