16KB: Move CopyEfsTest to device/google/gs-common
Additional changes 1. Android.bp lint/formatting error was resolved. 2. The regex pattern on line 78 in CopyEfsTest.java: "line.split("(?<![\\\\])\s+")" was updated to "line.split("(?<![\\\\])\\s+")" to resolve a presubmit error as \s is a special character in Java. (see https://errorprone.info/bugpattern/MisleadingEscapedSpace) Bug: 390502355 Test: atest CopyEfsTest for Pixel 8 & 9 targets Flag: EXEMPT bugfix Change-Id: Iebcda9859666ff595b50b8105b7e841591ba3c67
This commit is contained in:
parent
fe6e700db0
commit
a61947b1c5
3 changed files with 208 additions and 0 deletions
38
16kb/CopyEfsTest/Android.bp
Normal file
38
16kb/CopyEfsTest/Android.bp
Normal file
|
@ -0,0 +1,38 @@
|
|||
// Copyright (C) 2025 The Android Open Source Project
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package {
|
||||
default_applicable_licenses: ["device_google_gs-common_license"],
|
||||
}
|
||||
|
||||
java_test_host {
|
||||
name: "CopyEfsTest",
|
||||
// Include all test java files
|
||||
srcs: ["src/**/*.java"],
|
||||
static_libs: [
|
||||
"junit",
|
||||
"platform-test-annotations",
|
||||
"truth",
|
||||
],
|
||||
libs: [
|
||||
"tradefed",
|
||||
"compatibility-host-util",
|
||||
"compatibility-tradefed",
|
||||
],
|
||||
test_suites: [
|
||||
"device-tests",
|
||||
"device-pixel-tests",
|
||||
],
|
||||
test_config: "AndroidTest.xml",
|
||||
}
|
40
16kb/CopyEfsTest/AndroidTest.xml
Normal file
40
16kb/CopyEfsTest/AndroidTest.xml
Normal file
|
@ -0,0 +1,40 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2025 The Android Open Source Project
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<configuration description="Runs 16K developer option test.">
|
||||
<option name="test-suite-tag" value="apct"/>
|
||||
|
||||
<target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer">
|
||||
<option name="force-root" value="true" />
|
||||
</target_preparer>
|
||||
|
||||
<test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
|
||||
<option name="jar" value="CopyEfsTest.jar" />
|
||||
</test>
|
||||
|
||||
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
|
||||
<!-- Unlock screen -->
|
||||
<option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
|
||||
<!-- Dismiss keyguard, in case it's set as "Swipe to unlock" -->
|
||||
<option name="run-command" value="wm dismiss-keyguard" />
|
||||
<!-- Collapse notifications -->
|
||||
<option name="run-command" value="cmd statusbar collapse" />
|
||||
<!-- dismiss all system dialogs before launch test -->
|
||||
<option name="run-command" value="am broadcast -a android.intent.action.CLOSE_SYSTEM_DIALOGS" />
|
||||
</target_preparer>
|
||||
|
||||
</configuration>
|
130
16kb/CopyEfsTest/src/com/android/test/CopyEfsTest.java
Normal file
130
16kb/CopyEfsTest/src/com/android/test/CopyEfsTest.java
Normal file
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
* Copyright (C) 2025 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assume.assumeTrue;
|
||||
import org.junit.Before;
|
||||
import org.junit.After;
|
||||
|
||||
import android.platform.test.annotations.AppModeFull;
|
||||
|
||||
import com.android.tradefed.device.DeviceNotAvailableException;
|
||||
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
|
||||
import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
|
||||
import com.android.tradefed.testtype.junit4.DeviceTestRunOptions;
|
||||
import com.android.tradefed.util.CommandResult;
|
||||
import com.android.tradefed.util.RunUtil;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.StringReader;
|
||||
|
||||
@RunWith(DeviceJUnit4ClassRunner.class)
|
||||
public class CopyEfsTest extends BaseHostJUnit4Test {
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
getDevice().enableAdbRoot();
|
||||
|
||||
getDevice().executeShellCommand("rm -rf /data/local/tmp/efs_test");
|
||||
getDevice().executeShellCommand("mkdir -p /data/local/tmp/efs_test/mnt");
|
||||
getDevice().executeShellCommand("mkdir -p /data/local/tmp/efs_test/dump");
|
||||
}
|
||||
|
||||
@Test
|
||||
@AppModeFull
|
||||
public void copyEfsTest() throws Exception {
|
||||
assumeTrue(getDevice().executeShellCommand("getconf PAGESIZE").trim().equals("4096"));
|
||||
|
||||
testDumpF2FS("efs");
|
||||
testDumpF2FS("efs_backup");
|
||||
testDumpF2FS("modem_userdata");
|
||||
testDumpF2FS("persist");
|
||||
}
|
||||
|
||||
private CommandResult RunAndCheckAdbCmd(String cmd) throws DeviceNotAvailableException {
|
||||
CommandResult r = getDevice().executeShellV2Command(cmd);
|
||||
assertEquals("Failed to run " + cmd, Integer.valueOf(0), r.getExitCode());
|
||||
return r;
|
||||
}
|
||||
|
||||
// Remove timestamps because ls on device does not support --time-style.
|
||||
// Format is [permissions] [links] [uid] [gid] [size] time [name/symlink]
|
||||
// time may vary greatly in formatting
|
||||
// symlinks will be of the form a -> b
|
||||
// So we can check for -> in the second to last spot to determine what position the timestamp ends at
|
||||
// Remove totals because on disk block usage may change depending on filesystem
|
||||
private String removeTimestamps(String input) {
|
||||
StringBuilder output = new StringBuilder();
|
||||
for (String line : input.split("\n")) {
|
||||
String[] tokens = line.split("(?<![\\\\])\\s+");
|
||||
if (tokens[0].equals("total"))
|
||||
continue;
|
||||
if (tokens.length < 3) {
|
||||
output.append(line + "\n");
|
||||
continue;
|
||||
}
|
||||
int name_offset = 1;
|
||||
if (tokens[tokens.length - 2].equals("->"))
|
||||
name_offset = 3;
|
||||
for (int i=0; i<tokens.length; i++) {
|
||||
if (i >= 5 && i < tokens.length - name_offset)
|
||||
continue;
|
||||
if (i != 0)
|
||||
output.append(" ");
|
||||
output.append(tokens[i]);
|
||||
}
|
||||
output.append("\n");
|
||||
}
|
||||
return output.toString();
|
||||
}
|
||||
|
||||
private void testDumpF2FS(String name) throws Exception {
|
||||
RunAndCheckAdbCmd(String.format("cp /dev/block/by-name/%s /data/local/tmp/efs_test/%s.img", name, name));
|
||||
|
||||
// The device was mounted r/w. To get a clean image, we run fsck, and then mount to allow mount time fixes to happen.
|
||||
// We can then dump and mount read only to ensure the contents should be the same.
|
||||
RunAndCheckAdbCmd(String.format("fsck.f2fs -f /data/local/tmp/efs_test/%s.img", name));
|
||||
RunAndCheckAdbCmd(String.format("mount /data/local/tmp/efs_test/%s.img /data/local/tmp/efs_test/mnt", name));
|
||||
RunAndCheckAdbCmd("umount /data/local/tmp/efs_test/mnt");
|
||||
|
||||
RunAndCheckAdbCmd(String.format("dump.f2fs -rfPLo /data/local/tmp/efs_test/dump /data/local/tmp/efs_test/%s.img", name));
|
||||
RunAndCheckAdbCmd(String.format("mount -r /data/local/tmp/efs_test/%s.img /data/local/tmp/efs_test/mnt", name));
|
||||
|
||||
CommandResult r = RunAndCheckAdbCmd("diff -rq --no-dereference /data/local/tmp/efs_test/mnt /data/local/tmp/efs_test/dump");
|
||||
assertEquals(r.getStdout(), "");
|
||||
|
||||
String ls_cmd = "cd /data/local/tmp/efs_test/%s;ls -AlnR .";
|
||||
CommandResult mnt_ls = RunAndCheckAdbCmd(String.format(ls_cmd, "mnt"));
|
||||
CommandResult dump_ls = RunAndCheckAdbCmd(String.format(ls_cmd, "dump"));
|
||||
assertEquals(removeTimestamps(mnt_ls.getStdout()), removeTimestamps(dump_ls.getStdout()));
|
||||
|
||||
getDevice().executeShellCommand("umount /data/local/tmp/efs_test/mnt");
|
||||
getDevice().executeShellCommand("rm -rf /data/local/tmp/efs_test/dump/*");
|
||||
getDevice().executeShellCommand("rm /data/local/tmp/efs_test/" + name + ".img");
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception {
|
||||
getDevice().executeShellCommand("umount /data/local/tmp/efs_test/mnt");
|
||||
getDevice().executeShellCommand("rm -rf /data/local/tmp/efs_test");
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue