| /* |
| * Copyright (C) 2017 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.server; |
| |
| import static junit.framework.Assert.*; |
| |
| import androidx.test.filters.SmallTest; |
| import androidx.test.runner.AndroidJUnit4; |
| |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| @SmallTest |
| @RunWith(AndroidJUnit4.class) |
| public class BootReceiverFixFsckFsStatTest { |
| |
| private static final String PARTITION = "userdata"; |
| |
| @Test |
| public void testTreeOptimization() { |
| final String[] logs = { |
| "e2fsck 1.43.3 (04-Sep-2016)", |
| "Pass 1: Checking inodes, blocks, and sizes", |
| "Inode 877141 extent tree (at level 1) could be shorter. Fix? yes", |
| " ", |
| "Pass 1E: Optimizing extent trees", |
| "Pass 2: Checking directory structure", |
| "Pass 3: Checking directory connectivity", |
| "Pass 4: Checking reference counts", |
| "Pass 5: Checking group summary information", |
| "[QUOTA WARNING] Usage inconsistent for ID 10038:actual (71667712, 1000) != expected (71671808, 1000)", |
| "Update quota info for quota type 0? yes", |
| " ", |
| "[QUOTA WARNING] Usage inconsistent for ID 10038:actual (59555840, 953) != expected (59559936, 953)", |
| "Update quota info for quota type 1? yes", |
| " ", |
| "/dev/block/platform/soc/624000.ufshc/by-name/userdata: ***** FILE SYSTEM WAS MODIFIED *****" |
| }; |
| doTestFsckFsStat(logs, 0x405, 0x5, 0, logs.length); |
| |
| final String[] doubleLogs = new String[logs.length * 2]; |
| System.arraycopy(logs, 0, doubleLogs, 0, logs.length); |
| System.arraycopy(logs, 0, doubleLogs, logs.length, logs.length); |
| doTestFsckFsStat(doubleLogs, 0x401, 0x1, 0, logs.length); |
| doTestFsckFsStat(doubleLogs, 0x402, 0x2, logs.length, logs.length * 2); |
| } |
| |
| @Test |
| public void testQuotaOnly() { |
| final String[] logs = { |
| "e2fsck 1.43.3 (04-Sep-2016)", |
| "Pass 1: Checking inodes, blocks, and sizes", |
| "Pass 1E: Optimizing extent trees", |
| "Pass 2: Checking directory structure", |
| "Pass 3: Checking directory connectivity", |
| "Pass 4: Checking reference counts", |
| "Pass 5: Checking group summary information", |
| "[QUOTA WARNING] Usage inconsistent for ID 10038:actual (71667712, 1000) != expected (71671808, 1000)", |
| "Update quota info for quota type 0? yes", |
| " ", |
| "[QUOTA WARNING] Usage inconsistent for ID 10038:actual (59555840, 953) != expected (59559936, 953)", |
| "Update quota info for quota type 1? yes", |
| " ", |
| "/dev/block/platform/soc/624000.ufshc/by-name/userdata: ***** FILE SYSTEM WAS MODIFIED *****" |
| }; |
| // quota fix without tree optimization is an error. |
| doTestFsckFsStat(logs, 0x405, 0x405, 0, logs.length); |
| } |
| |
| @Test |
| public void testOrphaned() { |
| final String[] logs = { |
| "e2fsck 1.43.3 (04-Sep-2016)", |
| "Pass 1: Checking inodes, blocks, and sizes", |
| "Inodes that were part of a corrupted orphan linked list found. Fix? yes", |
| " ", |
| "Inode 589877 was part of the orphaned inode list. FIXED.", |
| " ", |
| "Inode 589878 was part of the orphaned inode list. FIXED.", |
| " ", |
| "Pass 2: Checking directory structure", |
| "Pass 3: Checking directory connectivity", |
| "Pass 4: Checking reference counts", |
| "Pass 5: Checking group summary information", |
| " ", |
| "/dev/block/platform/soc/624000.ufshc/by-name/userdata: ***** FILE SYSTEM WAS MODIFIED *****" |
| }; |
| doTestFsckFsStat(logs, 0x405, 0x405, 0, logs.length); |
| } |
| |
| @Test |
| public void testTimestampAdjustment() { |
| final String[] logs = { |
| "e2fsck 1.43.3 (04-Sep-2016)", |
| "Pass 1: Checking inodes, blocks, and sizes", |
| "Timestamp(s) on inode 508580 beyond 2310-04-04 are likely pre-1970.", |
| "Fix? yes", |
| " ", |
| "Pass 1E: Optimizing extent trees", |
| "Pass 2: Checking directory structure", |
| "Pass 3: Checking directory connectivity", |
| "Pass 4: Checking reference counts", |
| "Pass 5: Checking group summary information", |
| " ", |
| "/dev/block/platform/soc/624000.ufshc/by-name/userdata: ***** FILE SYSTEM WAS MODIFIED *****" |
| }; |
| doTestFsckFsStat(logs, 0x405, 0x5, 0, logs.length); |
| } |
| |
| @Test |
| public void testTimestampAdjustmentNoFixLine() { |
| final String[] logs = { |
| "e2fsck 1.43.3 (04-Sep-2016)", |
| "Pass 1: Checking inodes, blocks, and sizes", |
| "Timestamp(s) on inode 508580 beyond 2310-04-04 are likely pre-1970.", |
| " ", |
| "Pass 1E: Optimizing extent trees", |
| "Pass 2: Checking directory structure", |
| "Pass 3: Checking directory connectivity", |
| "Pass 4: Checking reference counts", |
| "Pass 5: Checking group summary information", |
| " ", |
| "/dev/block/platform/soc/624000.ufshc/by-name/userdata: ***** FILE SYSTEM WAS MODIFIED *****" |
| }; |
| doTestFsckFsStat(logs, 0x405, 0x5, 0, logs.length); |
| } |
| |
| @Test |
| public void testTimestampAdjustmentWithQuotaFix() { |
| final String[] logs = { |
| "e2fsck 1.43.3 (04-Sep-2016)", |
| "Pass 1: Checking inodes, blocks, and sizes", |
| "Timestamp(s) on inode 508580 beyond 2310-04-04 are likely pre-1970.", |
| "Fix? yes", |
| " ", |
| "Pass 1E: Optimizing extent trees", |
| "Pass 2: Checking directory structure", |
| "Pass 3: Checking directory connectivity", |
| "Pass 4: Checking reference counts", |
| "Pass 5: Checking group summary information", |
| "[QUOTA WARNING] Usage inconsistent for ID 10038:actual (71667712, 1000) != expected (71671808, 1000)", |
| "Update quota info for quota type 0? yes", |
| " ", |
| "[QUOTA WARNING] Usage inconsistent for ID 10038:actual (59555840, 953) != expected (59559936, 953)", |
| "Update quota info for quota type 1? yes", |
| " ", |
| "/dev/block/platform/soc/624000.ufshc/by-name/userdata: ***** FILE SYSTEM WAS MODIFIED *****" |
| }; |
| doTestFsckFsStat(logs, 0x405, 0x405, 0, logs.length); |
| } |
| |
| @Test |
| public void testAllNonFixes() { |
| final String[] logs = { |
| "e2fsck 1.43.3 (04-Sep-2016)", |
| "Pass 1: Checking inodes, blocks, and sizes", |
| "Timestamp(s) on inode 508580 beyond 2310-04-04 are likely pre-1970.", |
| "Fix? yes", |
| "Inode 877141 extent tree (at level 1) could be shorter. Fix? yes", |
| " ", |
| "Pass 1E: Optimizing extent trees", |
| "Pass 2: Checking directory structure", |
| "Pass 3: Checking directory connectivity", |
| "Pass 4: Checking reference counts", |
| "Pass 5: Checking group summary information", |
| "[QUOTA WARNING] Usage inconsistent for ID 10038:actual (71667712, 1000) != expected (71671808, 1000)", |
| "Update quota info for quota type 0? yes", |
| " ", |
| "[QUOTA WARNING] Usage inconsistent for ID 10038:actual (59555840, 953) != expected (59559936, 953)", |
| "Update quota info for quota type 1? yes", |
| " ", |
| "/dev/block/platform/soc/624000.ufshc/by-name/userdata: ***** FILE SYSTEM WAS MODIFIED *****" |
| }; |
| doTestFsckFsStat(logs, 0x405, 0x5, 0, logs.length); |
| } |
| |
| private void doTestFsckFsStat(String[] lines, int statOrg, int statUpdated, int startLineNumber, |
| int endLineNumber) { |
| assertEquals(statUpdated, BootReceiver.fixFsckFsStat(PARTITION, statOrg, lines, |
| startLineNumber, endLineNumber)); |
| } |
| } |