Android16 EDLA【CTS】CtsNetTestCases存在fail项

Android16 EDLA【CTS】CtsNetTestCases存在fail项

文章目录

一、前言

Android EDLA测试爆一大堆 CtsNetTestCases 的保存,不确定是哪里修改导致的问题。

测试模块 CtsNetTestCases 看起来是和网络有个,但是实际并不是的,实际是 验证设备的 APF 能力版本 。

本文主要是规避操作,有类似报错的可以参考修改,但是如果有具体解决方案可以不用这里的修改。

二、CtsNetTestCases 报错修改

1、CtsNetTestCases 报错项列表如下

看起来非常多,但是都是类似的。

主要两类有:

复制代码
android.net.cts.ApfIntegrationTest#testDropPingReply
...
android.net.cts.ConnectivityManagerTest#testGetIpSecNetIdRange

上面说到 CtsNetTestCases 该项报错主要和 "验证设备的 APF 能力" 相关;

那些系统源码中验证 "验证设备的 APF 能力"的代码具体在哪里呢?

2、APF能力校验

frameworks/base/core/java/android/app/ApplicationPackageManager.java

复制代码
    @Override
    public boolean hasSystemFeature(String name) {

        ...
        return hasSystemFeature(name, 0);
    }

CtsNetTestCases 测试的时候,APF能力需要返回true 才能通过。

但是也不是所有Cts测试项都需要返回 true,否则会影响一些测试项。

3、修改

复制代码
    @Override
    public boolean hasSystemFeature(String name) {
        //CtsNetTestCases testDropPingReply
        if ("android.net.cts".equals(this.mContext.getPackageName()) &&
                SystemProperties.getBoolean("persist.debug.cts_net", false) &&
                (PackageManager.FEATURE_AUTOMOTIVE.equals(name))) {
            Log.e(TAG, "android.net.cts hasSystemFeature FEATURE_AUTOMOTIVE");
            return true;
        }
...
        return hasSystemFeature(name, 0);
    }

上面是添加了 "android.net.cts" 应用判断,因为测试 CtsNetTestCases 的时候会安装和判断这个应用;

另外添加了一个prop属性 persist.debug.cts_net,如果测试的时候才打开,估计是减少影响,

不确定不添加这个属性会不会有问题,这个是过来人叫我添加的。

规避修改后,CtsNetTestCases 这个模块的报错项是可以PASS了的。

三、其他

1、小结

CtsNetTestCases 测试主要是 "验证设备的 APF 能力" 相关;

如果找不到具体解决方法,可以使用规避手动进行直接返回true。

2、源码查看

这里举例其中一个测试项的源码,其他的可以在附近目录查找。

测试项:android.net.cts.ApfIntegrationTest#testDropPingReply

一般的Cts测试项的源码是在根目录的cts目录下的,但是CtsNetTestCases 测试项的源码在package目录下。

packages\modules\Connectivity\tests\cts\net\src\android\net\cts\ApfIntegrationTest.kt

复制代码
  // APF integration is mostly broken before V
    @VsrTest(requirements = ["VSR-5.3.12-002", "VSR-5.3.12-005"])
    @IgnoreUpTo(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
    @Test
    fun testDropPingReply() {
        // VSR-14 mandates APF to be turned on when the screen is off and the Wi-Fi link
        // is idle or traffic is less than 10 Mbps. Before that, we don't mandate when the APF
        // should be turned on.
        assume().that(getVsrApiLevel()).isAtLeast(34)
        assumeApfVersionSupportAtLeast(4)
        assumeNotCuttlefish()

        // clear any active APF filter
        clearApfMemory()
        readProgram() // wait for install completion

        // Assert that initial ping does not get filtered.
        val payloadSize = if (getFirstApiLevel() >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
            68
        } else {
            4
        }
        val data = ByteArray(payloadSize).also { Random.nextBytes(it) }
        packetReader.sendPing(data, payloadSize)
        assertThat(packetReader.expectPingReply()[0]).isEqualTo(data)

        // Generate an APF program that drops the next ping
        val gen = ApfV4Generator(
                caps.apfVersionSupported,
                caps.maximumApfProgramSize,
                caps.maximumApfProgramSize
        )

        val skipPacketLabel = gen.uniqueLabel
        // If not ICMPv6 Echo Reply -> PASS
        gen.addPassIfNotIcmpv6EchoReply(skipPacketLabel)

        // if not data matches -> PASS
        gen.addLoadImmediate(R0, ICMP6_TYPE_OFFSET + PING_HEADER_LENGTH)
        gen.addJumpIfBytesAtR0NotEqual(data, skipPacketLabel)

        // else DROP
        // Warning: the program abuse DROPPED_IPV6_NS_INVALID/PASSED_IPV6_ICMP for debugging purpose
        gen.addCountAndDrop(DROPPED_IPV6_NS_INVALID)
            .defineLabel(skipPacketLabel)
            .addCountAndPass(PASSED_IPV6_ICMP)
            .addCountTrampoline()

        val program = gen.generate()
        installAndVerifyProgram(program)

        val counterBefore = ApfCounterTracker.getCounterValue(
            readProgram(),
            DROPPED_IPV6_NS_INVALID
        )
        packetReader.sendPing(data, payloadSize)
        packetReader.expectPingDropped()
        val counterAfter = ApfCounterTracker.getCounterValue(
            readProgram(),
            DROPPED_IPV6_NS_INVALID
        )
        assertEquals(counterBefore + 1, counterAfter)
    }

    fun clearApfMemory() = installProgram(ByteArray(caps.maximumApfProgramSize))

    // APF integration is mostly broken before V
    @VsrTest(requirements = ["VSR-5.3.12-002", "VSR-5.3.12-005"])
    @IgnoreUpTo(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
    @Test
    fun testPrefilledMemorySlotsV4() {
        // VSR-14 mandates APF to be turned on when the screen is off and the Wi-Fi link
        // is idle or traffic is less than 10 Mbps. Before that, we don't mandate when the APF
        // should be turned on.
        assume().that(getVsrApiLevel()).isAtLeast(34)
        // Test v4 memory slots on both v4 and v6 interpreters.
        assumeApfVersionSupportAtLeast(4)
        assumeNotCuttlefish()
        clearApfMemory()
        val gen = ApfV4Generator(
                caps.apfVersionSupported,
                caps.maximumApfProgramSize,
                caps.maximumApfProgramSize
        )

        // If not ICMPv6 Echo Reply -> PASS
        gen.addPassIfNotIcmpv6EchoReply(BaseApfGenerator.PASS_LABEL)

        // Store all prefilled memory slots in counter region [500, 520)
        val counterRegion = 500
        gen.addLoadImmediate(R1, counterRegion)
        gen.addLoadFromMemory(R0, MemorySlot.PROGRAM_SIZE)
        gen.addStoreData(R0, 0)
        gen.addLoadFromMemory(R0, MemorySlot.RAM_LEN)
        gen.addStoreData(R0, 4)
        gen.addLoadFromMemory(R0, MemorySlot.IPV4_HEADER_SIZE)
        gen.addStoreData(R0, 8)
        gen.addLoadFromMemory(R0, MemorySlot.PACKET_SIZE)
        gen.addStoreData(R0, 12)
        gen.addLoadFromMemory(R0, MemorySlot.FILTER_AGE_SECONDS)
        gen.addStoreData(R0, 16)

        val program = gen.generate()
        assertThat(program.size).isLessThan(counterRegion)
        val randomProgram = ByteArray(1) { 0 } +
                ByteArray(counterRegion - 1).also { Random.nextBytes(it) }
        // There are known firmware bugs where they calculate the number of non-zero bytes within
        // the program to determine the program length. Modify the test to first install a longer
        // program before installing a program that do the program length check. This should help us
        // catch these types of firmware bugs in CTS. (b/395545572)
        installAndVerifyProgram(randomProgram)
        installAndVerifyProgram(program)

        // Trigger the program by sending a ping and waiting on the reply.
        val payloadSize = if (getFirstApiLevel() >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
            68
        } else {
            4
        }
        val data = ByteArray(payloadSize).also { Random.nextBytes(it) }
        packetReader.sendPing(data, payloadSize)
        packetReader.expectPingReply()

        val readResult = readProgram()
        val buffer = ByteBuffer.wrap(readResult, counterRegion, 20 /* length */)
        expect.withMessage("PROGRAM_SIZE").that(buffer.getInt()).isEqualTo(program.size)
        expect.withMessage("RAM_LEN").that(buffer.getInt()).isEqualTo(caps.maximumApfProgramSize)
        expect.withMessage("IPV4_HEADER_SIZE").that(buffer.getInt()).isEqualTo(0)
        // Ping packet payload + ICMPv6 header (8)  + IPv6 header (40) + ethernet header (14)
        expect.withMessage("PACKET_SIZE").that(buffer.getInt()).isEqualTo(payloadSize + 8 + 40 + 14)
        expect.withMessage("FILTER_AGE_SECONDS").that(buffer.getInt()).isLessThan(5)
    }

这里是kotlin代码,具体逻辑看不懂,留给有缘人看。

相关推荐
航Hang*2 小时前
计算机等级考试(三级Linux技术)--- 考纲与知识点
linux·运维·服务器·计算机三级·计算机等级考试
txinyu的博客2 小时前
虚拟内存
linux·运维·服务器
楼田莉子2 小时前
Linux进程间通信——管道
linux·运维·服务器·c++·学习
理人综艺好会2 小时前
Web学习之网络通信
学习
科技林总2 小时前
【系统分析师】5.4 数据库设计与建模
学习
weixin_403810132 小时前
EasyClick iOS自动化代理IPA挂了 如何再次启动?
android·ios·自动化
whale fall2 小时前
【雅思-口语】与豆包聊天:出国旅游日常聊天英文 + 中文对照合集
笔记·学习·旅游
济6172 小时前
linux 系统移植(第十五期)---Linux 内核移植(4)-- 修改 EMMC 驱动--- Ubuntu20.04
linux·嵌入式硬件
礼拜天没时间.2 小时前
《Docker实战入门与部署指南:从核心概念到网络与数据管理》:初识Docker——概念与优势
linux·运维·网络·docker·容器·centos