blob: 62c9cbb83243774d6c64e401a044d2aa1ee30454 [file] [log] [blame]
Mårten Kongstadf242ec82024-04-16 17:12:26 +02001/*
2 * Copyright (C) 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.checkflaggedapis
17
Mårten Kongstad387ff6c2024-04-16 12:42:14 +020018import android.aconfig.Aconfig
Mårten Kongstad18ff19a2024-04-26 05:48:57 +020019import android.aconfig.Aconfig.flag_state.DISABLED
20import android.aconfig.Aconfig.flag_state.ENABLED
Mårten Kongstad387ff6c2024-04-16 12:42:14 +020021import java.io.ByteArrayInputStream
22import java.io.ByteArrayOutputStream
Mårten Kongstad9238a3a2024-04-16 13:19:50 +020023import java.io.InputStream
Mårten Kongstad20de4052024-04-16 11:33:56 +020024import org.junit.Assert.assertEquals
Mårten Kongstadf242ec82024-04-16 17:12:26 +020025import org.junit.Test
26import org.junit.runner.RunWith
Mårten Kongstad7cc21742024-04-18 10:23:20 +020027import org.junit.runners.JUnit4
Mårten Kongstadf242ec82024-04-16 17:12:26 +020028
Mårten Kongstad20de4052024-04-16 11:33:56 +020029private val API_SIGNATURE =
30 """
31 // Signature format: 2.0
32 package android {
Mårten Kongstad18ff19a2024-04-26 05:48:57 +020033 @FlaggedApi("android.flag.foo") public final class Clazz {
Mårten Kongstad20de4052024-04-16 11:33:56 +020034 ctor public Clazz();
35 field @FlaggedApi("android.flag.foo") public static final int FOO = 1; // 0x1
36 }
Mårten Kongstad18ff19a2024-04-26 05:48:57 +020037 @FlaggedApi("android.flag.bar") public static class Clazz.Builder {
38 }
Mårten Kongstad20de4052024-04-16 11:33:56 +020039 }
40"""
41 .trim()
42
Mårten Kongstadb673d3b2024-04-16 18:34:20 +020043private val API_VERSIONS =
44 """
45 <?xml version="1.0" encoding="utf-8"?>
46 <api version="3">
47 <class name="android/Clazz" since="1">
48 <method name="&lt;init>()V"/>
49 <field name="FOO"/>
50 </class>
Mårten Kongstad18ff19a2024-04-26 05:48:57 +020051 <class name="android/Clazz${"$"}Builder" since="2">
52 </class>
Mårten Kongstadb673d3b2024-04-16 18:34:20 +020053 </api>
54"""
55 .trim()
56
Mårten Kongstad18ff19a2024-04-26 05:48:57 +020057private fun generateFlagsProto(
58 fooState: Aconfig.flag_state,
59 barState: Aconfig.flag_state
60): InputStream {
61 val fooFlag =
Mårten Kongstad9238a3a2024-04-16 13:19:50 +020062 Aconfig.parsed_flag
63 .newBuilder()
64 .setPackage("android.flag")
65 .setName("foo")
66 .setState(fooState)
67 .setPermission(Aconfig.flag_permission.READ_ONLY)
68 .build()
Mårten Kongstad18ff19a2024-04-26 05:48:57 +020069 val barFlag =
70 Aconfig.parsed_flag
71 .newBuilder()
72 .setPackage("android.flag")
73 .setName("bar")
74 .setState(barState)
75 .setPermission(Aconfig.flag_permission.READ_ONLY)
76 .build()
77 val flags =
78 Aconfig.parsed_flags.newBuilder().addParsedFlag(fooFlag).addParsedFlag(barFlag).build()
Mårten Kongstad9238a3a2024-04-16 13:19:50 +020079 val binaryProto = ByteArrayOutputStream()
Mårten Kongstad18ff19a2024-04-26 05:48:57 +020080 flags.writeTo(binaryProto)
Mårten Kongstad9238a3a2024-04-16 13:19:50 +020081 return ByteArrayInputStream(binaryProto.toByteArray())
82}
83
Mårten Kongstad7cc21742024-04-18 10:23:20 +020084@RunWith(JUnit4::class)
85class CheckFlaggedApisTest {
Mårten Kongstad20de4052024-04-16 11:33:56 +020086 @Test
87 fun testParseApiSignature() {
Mårten Kongstad18ff19a2024-04-26 05:48:57 +020088 val expected =
89 setOf(
90 Pair(Symbol("android.Clazz"), Flag("android.flag.foo")),
91 Pair(Symbol("android.Clazz.FOO"), Flag("android.flag.foo")),
92 Pair(Symbol("android.Clazz.Builder"), Flag("android.flag.bar")),
93 )
Mårten Kongstad20de4052024-04-16 11:33:56 +020094 val actual = parseApiSignature("in-memory", API_SIGNATURE.byteInputStream())
95 assertEquals(expected, actual)
96 }
Mårten Kongstad387ff6c2024-04-16 12:42:14 +020097
98 @Test
99 fun testParseFlagValues() {
Mårten Kongstad18ff19a2024-04-26 05:48:57 +0200100 val expected: Map<Flag, Boolean> =
101 mapOf(Flag("android.flag.foo") to true, Flag("android.flag.bar") to true)
102 val actual = parseFlagValues(generateFlagsProto(ENABLED, ENABLED))
Mårten Kongstad387ff6c2024-04-16 12:42:14 +0200103 assertEquals(expected, actual)
104 }
Mårten Kongstadb673d3b2024-04-16 18:34:20 +0200105
106 @Test
107 fun testParseApiVersions() {
Mårten Kongstad18ff19a2024-04-26 05:48:57 +0200108 val expected: Set<Symbol> =
109 setOf(
110 Symbol("android.Clazz"),
111 Symbol("android.Clazz.FOO"),
112 Symbol("android.Clazz.Builder"),
113 )
Mårten Kongstadb673d3b2024-04-16 18:34:20 +0200114 val actual = parseApiVersions(API_VERSIONS.byteInputStream())
115 assertEquals(expected, actual)
116 }
Mårten Kongstad9238a3a2024-04-16 13:19:50 +0200117
118 @Test
119 fun testFindErrorsNoErrors() {
120 val expected = setOf<ApiError>()
121 val actual =
122 findErrors(
123 parseApiSignature("in-memory", API_SIGNATURE.byteInputStream()),
Mårten Kongstad18ff19a2024-04-26 05:48:57 +0200124 parseFlagValues(generateFlagsProto(ENABLED, ENABLED)),
Mårten Kongstad9238a3a2024-04-16 13:19:50 +0200125 parseApiVersions(API_VERSIONS.byteInputStream()))
126 assertEquals(expected, actual)
127 }
128
129 @Test
130 fun testFindErrorsDisabledFlaggedApiIsPresent() {
131 val expected =
132 setOf<ApiError>(
Mårten Kongstad18ff19a2024-04-26 05:48:57 +0200133 DisabledFlaggedApiIsPresentError(Symbol("android.Clazz"), Flag("android.flag.foo")),
134 DisabledFlaggedApiIsPresentError(Symbol("android.Clazz.FOO"), Flag("android.flag.foo")),
135 DisabledFlaggedApiIsPresentError(
136 Symbol("android.Clazz.Builder"), Flag("android.flag.bar")),
137 )
Mårten Kongstad9238a3a2024-04-16 13:19:50 +0200138 val actual =
139 findErrors(
140 parseApiSignature("in-memory", API_SIGNATURE.byteInputStream()),
Mårten Kongstad18ff19a2024-04-26 05:48:57 +0200141 parseFlagValues(generateFlagsProto(DISABLED, DISABLED)),
Mårten Kongstad9238a3a2024-04-16 13:19:50 +0200142 parseApiVersions(API_VERSIONS.byteInputStream()))
143 assertEquals(expected, actual)
144 }
Mårten Kongstadf242ec82024-04-16 17:12:26 +0200145}