Merge "Fix race condition in NetworkWatchListTest" am: de39ae42ac
Original change: https://android-review.googlesource.com/c/platform/packages/modules/Connectivity/+/1511070 Change-Id: I14fa977efaf51d591409a8a4c2c547bba7d8bed1
This commit is contained in:
@@ -22,11 +22,13 @@ import static org.junit.Assert.assertNotEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assume.assumeTrue;
|
||||
|
||||
import android.app.UiAutomation;
|
||||
import android.content.Context;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.platform.test.annotations.AppModeFull;
|
||||
import android.os.FileUtils;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.platform.test.annotations.AppModeFull;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.test.InstrumentationRegistry;
|
||||
import androidx.test.filters.SmallTest;
|
||||
@@ -117,42 +119,9 @@ public class NetworkWatchlistTest {
|
||||
return formatter.toString();
|
||||
}
|
||||
|
||||
private void saveResourceToFile(String res, String filePath) throws IOException {
|
||||
// App can't access /data/local/tmp directly, so we pipe resource to file through stdin.
|
||||
ParcelFileDescriptor stdin = pipeFromStdin(filePath);
|
||||
pipeResourceToFileDescriptor(res, stdin);
|
||||
}
|
||||
|
||||
/* Pipe stdin to a file in filePath. Returns PFD for stdin. */
|
||||
private ParcelFileDescriptor pipeFromStdin(String filePath) {
|
||||
// Not all devices have symlink for /dev/stdin, so use /proc/self/fd/0 directly.
|
||||
// /dev/stdin maps to /proc/self/fd/0.
|
||||
return runRwCommand("cp /proc/self/fd/0 " + filePath)[1];
|
||||
}
|
||||
|
||||
private void pipeResourceToFileDescriptor(String res, ParcelFileDescriptor pfd)
|
||||
throws IOException {
|
||||
InputStream resStream = getClass().getClassLoader().getResourceAsStream(res);
|
||||
FileOutputStream fdStream = new ParcelFileDescriptor.AutoCloseOutputStream(pfd);
|
||||
|
||||
FileUtils.copy(resStream, fdStream);
|
||||
|
||||
try {
|
||||
fdStream.close();
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
|
||||
private static String runCommand(String command) throws IOException {
|
||||
return SystemUtil.runShellCommand(InstrumentationRegistry.getInstrumentation(), command);
|
||||
}
|
||||
|
||||
private static ParcelFileDescriptor[] runRwCommand(String command) {
|
||||
return InstrumentationRegistry.getInstrumentation()
|
||||
.getUiAutomation().executeShellCommandRw(command);
|
||||
}
|
||||
|
||||
private void setWatchlistConfig(String watchlistConfigFile) throws Exception {
|
||||
Log.w("NetworkWatchlistTest", "Setting watchlist config " + watchlistConfigFile
|
||||
+ " in " + Thread.currentThread().getName());
|
||||
cleanup();
|
||||
saveResourceToFile(watchlistConfigFile, TMP_CONFIG_PATH);
|
||||
final String cmdResult = runCommand(
|
||||
@@ -160,4 +129,44 @@ public class NetworkWatchlistTest {
|
||||
assertThat(cmdResult).contains("Success");
|
||||
cleanup();
|
||||
}
|
||||
|
||||
private void saveResourceToFile(String res, String filePath) throws IOException {
|
||||
final UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation()
|
||||
.getUiAutomation();
|
||||
// App can't access /data/local/tmp directly, so we pipe resource to file through stdin.
|
||||
// Not all devices have symlink for /dev/stdin, so use /proc/self/fd/0 directly.
|
||||
// /dev/stdin maps to /proc/self/fd/0.
|
||||
final ParcelFileDescriptor[] fileDescriptors = uiAutomation.executeShellCommandRw(
|
||||
"cp /proc/self/fd/0 " + filePath);
|
||||
|
||||
ParcelFileDescriptor stdin = fileDescriptors[1];
|
||||
ParcelFileDescriptor stdout = fileDescriptors[0];
|
||||
|
||||
pipeResourceToFileDescriptor(res, stdin);
|
||||
|
||||
// Wait for the process to close its stdout - which should mean it has completed.
|
||||
consumeFile(stdout);
|
||||
}
|
||||
|
||||
private void consumeFile(ParcelFileDescriptor pfd) throws IOException {
|
||||
try (InputStream stream = new ParcelFileDescriptor.AutoCloseInputStream(pfd)) {
|
||||
for (;;) {
|
||||
if (stream.read() == -1) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void pipeResourceToFileDescriptor(String res, ParcelFileDescriptor pfd)
|
||||
throws IOException {
|
||||
try (InputStream resStream = getClass().getClassLoader().getResourceAsStream(res);
|
||||
FileOutputStream fdStream = new ParcelFileDescriptor.AutoCloseOutputStream(pfd)) {
|
||||
FileUtils.copy(resStream, fdStream);
|
||||
}
|
||||
}
|
||||
|
||||
private static String runCommand(String command) throws IOException {
|
||||
return SystemUtil.runShellCommand(InstrumentationRegistry.getInstrumentation(), command);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user