xref: /aosp_15_r20/external/libchrome/base/test/multiprocess_test_android.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/test/multiprocess_test.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <string.h>
8*635a8641SAndroid Build Coastguard Worker #include <vector>
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker #include "base/android/jni_android.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/android/jni_array.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/android/scoped_java_ref.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/base_switches.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/command_line.h"
15*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
16*635a8641SAndroid Build Coastguard Worker #include "jni/MainReturnCodeResult_jni.h"
17*635a8641SAndroid Build Coastguard Worker #include "jni/MultiprocessTestClientLauncher_jni.h"
18*635a8641SAndroid Build Coastguard Worker 
19*635a8641SAndroid Build Coastguard Worker namespace base {
20*635a8641SAndroid Build Coastguard Worker 
21*635a8641SAndroid Build Coastguard Worker // A very basic implementation for Android. On Android tests can run in an APK
22*635a8641SAndroid Build Coastguard Worker // and we don't have an executable to exec*. This implementation does the bare
23*635a8641SAndroid Build Coastguard Worker // minimum to execute the method specified by procname (in the child process).
24*635a8641SAndroid Build Coastguard Worker //  - All options except |fds_to_remap| are ignored.
25*635a8641SAndroid Build Coastguard Worker //
26*635a8641SAndroid Build Coastguard Worker // NOTE: This MUST NOT run on the main thread of the NativeTest application.
SpawnMultiProcessTestChild(const std::string & procname,const CommandLine & base_command_line,const LaunchOptions & options)27*635a8641SAndroid Build Coastguard Worker Process SpawnMultiProcessTestChild(const std::string& procname,
28*635a8641SAndroid Build Coastguard Worker                                    const CommandLine& base_command_line,
29*635a8641SAndroid Build Coastguard Worker                                    const LaunchOptions& options) {
30*635a8641SAndroid Build Coastguard Worker   JNIEnv* env = android::AttachCurrentThread();
31*635a8641SAndroid Build Coastguard Worker   DCHECK(env);
32*635a8641SAndroid Build Coastguard Worker 
33*635a8641SAndroid Build Coastguard Worker   std::vector<int> fd_keys;
34*635a8641SAndroid Build Coastguard Worker   std::vector<int> fd_fds;
35*635a8641SAndroid Build Coastguard Worker   for (auto& iter : options.fds_to_remap) {
36*635a8641SAndroid Build Coastguard Worker     fd_keys.push_back(iter.second);
37*635a8641SAndroid Build Coastguard Worker     fd_fds.push_back(iter.first);
38*635a8641SAndroid Build Coastguard Worker   }
39*635a8641SAndroid Build Coastguard Worker 
40*635a8641SAndroid Build Coastguard Worker   android::ScopedJavaLocalRef<jobjectArray> fds =
41*635a8641SAndroid Build Coastguard Worker       android::Java_MultiprocessTestClientLauncher_makeFdInfoArray(
42*635a8641SAndroid Build Coastguard Worker           env, base::android::ToJavaIntArray(env, fd_keys),
43*635a8641SAndroid Build Coastguard Worker           base::android::ToJavaIntArray(env, fd_fds));
44*635a8641SAndroid Build Coastguard Worker 
45*635a8641SAndroid Build Coastguard Worker   CommandLine command_line(base_command_line);
46*635a8641SAndroid Build Coastguard Worker   if (!command_line.HasSwitch(switches::kTestChildProcess)) {
47*635a8641SAndroid Build Coastguard Worker     command_line.AppendSwitchASCII(switches::kTestChildProcess, procname);
48*635a8641SAndroid Build Coastguard Worker   }
49*635a8641SAndroid Build Coastguard Worker 
50*635a8641SAndroid Build Coastguard Worker   android::ScopedJavaLocalRef<jobjectArray> j_argv =
51*635a8641SAndroid Build Coastguard Worker       android::ToJavaArrayOfStrings(env, command_line.argv());
52*635a8641SAndroid Build Coastguard Worker   jint pid = android::Java_MultiprocessTestClientLauncher_launchClient(
53*635a8641SAndroid Build Coastguard Worker       env, j_argv, fds);
54*635a8641SAndroid Build Coastguard Worker   return Process(pid);
55*635a8641SAndroid Build Coastguard Worker }
56*635a8641SAndroid Build Coastguard Worker 
WaitForMultiprocessTestChildExit(const Process & process,TimeDelta timeout,int * exit_code)57*635a8641SAndroid Build Coastguard Worker bool WaitForMultiprocessTestChildExit(const Process& process,
58*635a8641SAndroid Build Coastguard Worker                                       TimeDelta timeout,
59*635a8641SAndroid Build Coastguard Worker                                       int* exit_code) {
60*635a8641SAndroid Build Coastguard Worker   JNIEnv* env = android::AttachCurrentThread();
61*635a8641SAndroid Build Coastguard Worker   DCHECK(env);
62*635a8641SAndroid Build Coastguard Worker 
63*635a8641SAndroid Build Coastguard Worker   base::android::ScopedJavaLocalRef<jobject> result_code =
64*635a8641SAndroid Build Coastguard Worker       android::Java_MultiprocessTestClientLauncher_waitForMainToReturn(
65*635a8641SAndroid Build Coastguard Worker           env, process.Pid(), static_cast<int32_t>(timeout.InMilliseconds()));
66*635a8641SAndroid Build Coastguard Worker   if (result_code.is_null() ||
67*635a8641SAndroid Build Coastguard Worker       Java_MainReturnCodeResult_hasTimedOut(env, result_code)) {
68*635a8641SAndroid Build Coastguard Worker     return false;
69*635a8641SAndroid Build Coastguard Worker   }
70*635a8641SAndroid Build Coastguard Worker   if (exit_code) {
71*635a8641SAndroid Build Coastguard Worker     *exit_code = Java_MainReturnCodeResult_getReturnCode(env, result_code);
72*635a8641SAndroid Build Coastguard Worker   }
73*635a8641SAndroid Build Coastguard Worker   return true;
74*635a8641SAndroid Build Coastguard Worker }
75*635a8641SAndroid Build Coastguard Worker 
TerminateMultiProcessTestChild(const Process & process,int exit_code,bool wait)76*635a8641SAndroid Build Coastguard Worker bool TerminateMultiProcessTestChild(const Process& process,
77*635a8641SAndroid Build Coastguard Worker                                     int exit_code,
78*635a8641SAndroid Build Coastguard Worker                                     bool wait) {
79*635a8641SAndroid Build Coastguard Worker   JNIEnv* env = android::AttachCurrentThread();
80*635a8641SAndroid Build Coastguard Worker   DCHECK(env);
81*635a8641SAndroid Build Coastguard Worker 
82*635a8641SAndroid Build Coastguard Worker   return android::Java_MultiprocessTestClientLauncher_terminate(
83*635a8641SAndroid Build Coastguard Worker       env, process.Pid(), exit_code, wait);
84*635a8641SAndroid Build Coastguard Worker }
85*635a8641SAndroid Build Coastguard Worker 
86*635a8641SAndroid Build Coastguard Worker }  // namespace base
87