Back to Repositories

Testing Multiple Extension File Handling in Apktool APK Decoder

This test suite validates APK file decoding functionality in Apktool, specifically focusing on handling files with multiple extensions. It ensures proper processing of unknown file types with double extensions during the APK decoding process.

Test Coverage Overview

The test coverage focuses on APK decoding edge cases involving files with multiple extensions. Key areas tested include:

  • Verification of files with multiple dot separators in filenames
  • Handling of unknown file types in assets directory
  • Processing of split assets with complex naming patterns

Implementation Analysis

The testing approach utilizes JUnit framework with a focused single test case methodology. The implementation leverages ApkDecoder and ExtFile classes to process APK contents, with specific attention to the doNotCompress list validation.

Key patterns include resource directory copying, APK decoding, and assertion-based verification of file path handling.

Technical Details

Testing tools and configuration include:

  • JUnit test framework
  • Apache Commons Lang3 for string manipulation
  • Custom BaseTest extension for common functionality
  • TestUtils for resource management
  • ExtFile wrapper for file handling

Best Practices Demonstrated

The test demonstrates several quality testing practices:

  • Proper test setup using @BeforeClass annotation
  • Clear test case isolation and focus
  • Effective use of inheritance for common test functionality
  • Resource cleanup and management
  • Specific assertion targeting for validation

ibotpeaches/apktool

brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/DoubleExtensionUnknownFileTest.java

            
/*
 *  Copyright (C) 2010 Ryszard Wiśniewski <[email protected]>
 *  Copyright (C) 2010 Connor Tumbleson <[email protected]>
 *
 *  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
 *
 *       https://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 brut.androlib.decode;

import brut.androlib.ApkDecoder;
import brut.androlib.BaseTest;
import brut.androlib.TestUtils;
import brut.androlib.apk.ApkInfo;
import brut.directory.ExtFile;
import brut.common.BrutException;
import org.apache.commons.lang3.StringUtils;

import org.junit.*;
import static org.junit.Assert.*;

public class DoubleExtensionUnknownFileTest extends BaseTest {
    private static final String TEST_APK = "issue1244.apk";

    @BeforeClass
    public static void beforeClass() throws Exception {
        TestUtils.copyResourceDir(DoubleExtensionUnknownFileTest.class, "decode/issue1244", sTmpDir);
    }

    @Test
    public void multipleExtensionUnknownFileTest() throws BrutException {
        ExtFile testApk = new ExtFile(sTmpDir, TEST_APK);
        ExtFile testDir = new ExtFile(testApk + ".out");
        new ApkDecoder(testApk, sConfig).decode(testDir);

        ApkInfo testInfo = ApkInfo.load(testDir);
        for (String path : testInfo.doNotCompress) {
            if (StringUtils.countMatches(path, ".") > 1) {
                assertTrue(path.equals("assets/bin/Data/sharedassets1.assets.split0"));
            }
        }
    }
}