Commit Graph

122 Commits

Author SHA1 Message Date
Zhi Dou
b095acbc57 aconfig: change Map.of to Map.ofEntries in FakeFeatureFlagsImp
Map.of can only take 10 entries. Map.ofEntries uses variable arguments.

Bug: 303045451
Test: atest AconfigJavaHostTest
Change-Id: I26a3fa0b8a731f9203934d4a800a5c695cfc730f
2023-10-02 23:57:10 +00:00
Mårten Kongstad
3bb7988492 printflags: include device_config values
Amend the default flag values read from
/<partition>/etc/aconfig_flags.pb with the currently used values as
stored in device_config.

Bug: 301547297
Test: atest printflags.test
Test: adb shell printflags
Change-Id: Ic11702a0ae093d2e9dc3ff543b5ca0684b67e0dc
2023-09-27 10:42:04 +02:00
Mårten Kongstad
28a79fe319 Merge "printflags: introduce device tool to print feature flags" into main 2023-09-25 06:51:18 +00:00
Mårten Kongstad
7fa3cb176c aconfig: separate package name and flag name using dot
Change the package name and flag name separator in the text dump output
from a slash to a dot. This makes the output consistent with how the
flags are encoded in the API tracking files.

Bug: 283910447
Test: atest aconfig.test
Change-Id: Ie3e109073e7f04cf01568e16c29bf2872d07ebad
2023-09-22 13:52:40 +02:00
Mårten Kongstad
433fab94c8 printflags: introduce device tool to print feature flags
Metadata about all feature flags used on device are located in
/<partition>/etc/aconfig_flags.pb. Add a new tool, printflags, to read
and pretty-print these files.

printflags is only intended for debugging purposes.

Bug: 301547297
Test: adb shell printflags
Change-Id: I0a3277fecfc8a60eea0aa6bf362a25a311360b71
2023-09-22 13:47:49 +02:00
Zhi Dou
c20d115562 Merge "aconfig: throw exception if reading from DeviceConfig fails" into main 2023-09-14 19:28:16 +00:00
Dennis Shen
a1de8fd435 aconfig: Fix missing header in the generated c/cpp code
Test: atest aconfig.test
Change-Id: I0c23299ad366cb5c61b84b738dd9e6bf3428435c
2023-09-14 17:40:13 +00:00
Zhi Dou
73a34ce10a aconfig: throw exception if reading from DeviceConfig fails
Reading value from DeviceConfig may fail if the provider is not ready.
Since DeciceConfig, and Settings class are static wrapper on top of
the provider, it won't cause the instance  initialization issue.
Thus when the issue happens it means the provider is not initialized.

Test: atest aconfig.test.java and manually make a change in the
framework and check the exception message
Bug: 299471646

Change-Id: Ic08d7a9cd32a8810a7274b6d93c249abccb50b9e
2023-09-14 13:00:45 +00:00
Mårten Kongstad
fb10840da5 aconfig: explicitly @hide FLAG_ constants
Because of a bug in metalava [1], the flag constants are incorrectly
considered not-hidden when metalava generates the API signature files.
This means the FLAG_ constant name will be used, instead of the FLAG_
constant value, which is what we want.

While waiting for b/300211291 to be fixed, explicitly mark the FLAG_
constants as hidden (and keep marking the classes as such).

This CL can be reverted when b/300211291 is fixed.

1. Item.isHiddenOrRemoved does not check if its parent item is hidden,
   tracked in b/300211291

Bug: 297881670
Test: atest aconfig.test aconfig.test.java
Change-Id: I05de8344ccb424bee51c39f9609489ad312397ce
2023-09-13 10:15:01 +02:00
Mårten Kongstad
72c3b38a1d Merge "Revert "Revert "aconfig: @hide generated Java code""" into main 2023-09-11 14:08:55 +00:00
Mårten Kongstad
65efa27f71 Revert "Revert "aconfig: @hide generated Java code""
This reverts commit c0e8ffea41.

Reason for revert: The detected build breakage was unrelated to the aconfig change. Details in b/297881670#comment11.

Change-Id: Ia32bc2e796ed3de7fa049c2c2db340f4325a2853
2023-09-11 12:17:25 +00:00
Mårten Kongstad
c0e8ffea41 Revert "aconfig: @hide generated Java code"
This reverts commit 379e09d157.

Reason for revert: Seems to have broken the build. Reverting while investigating.

Change-Id: I37c9a065853ef07b1f1c18355205a2f49dd816c4
2023-09-11 11:00:42 +00:00
Mårten Kongstad
b5133f6ad4 aconfig: remove unnecessary clones
Improve performance slightly: remove unnecessary clone operations, or
use references where a new object is not needed.

Bug: 283910447
Test: atest aconfig.test
Change-Id: I75205ffa1723dd2654039baac882c225d2653c86
2023-09-11 11:10:21 +02:00
Mårten Kongstad
379e09d157 aconfig: @hide generated Java code
Flagged APIs are annotated using `@FlaggedApi(Flags.FLAG_NAME)`, where
Flags.FLAG_NAME was auto-generated by aconfig.

When metalava generates an API signature file, it can either

  a) insert the value of the constant ("com.foo.bar.flag_name"), or
  b) insert the name of the constant (FLAG.NAME)

In the case of @FlaggedApi, we want a). This requires that

  x) metlava has access to the definition of the constant while generating the API signature file, and
  y) the constant is not part of the API surface of the API signature file

x) is handled by the build system, y) is handled by the aconfig code
generation.

This CL @hide:s all generated Java code, to make sure it is accessible
within the platform, but never part of any API surface.

Bug: 297881670
Test: atest aconfig.test aconfig.test.java
Change-Id: I328ed1a652a4e5e293f2f4b11f916d29fc2fbcbd
2023-09-11 10:31:46 +02:00
Zhi Dou
deafa792eb aconfig: flag java lib enable optimization
This change adds annotation in the generated code. If the flag is read
only, annotations @com.android.aconfig.annotations.AssumeTrueForR8 or
@com.android.aconfig.annotations.AssumeFalseForR8 will be added in to
the corresponding methods in the interface FeatureFlags, and class
Flags.

Test: atest aconfig aconfig.test.java
Bug: 295328116
Change-Id: Ic1b62a86f0945a5e72ae2c4987cce77fe3f172e9
2023-09-06 12:55:09 +00:00
Treehugger Robot
6c4627369e Merge changes from topic "aconfig-misc-fixes-2023-09-04" into main
* changes:
  aconfig: add invariant checks for `is_fixed_read_only`
  aconfig: re-enable development with cargo
2023-09-05 17:21:22 +00:00
Mårten Kongstad
21717e744e aconfig: add invariant checks for is_fixed_read_only
Update parsed_flag::verify_fields to verify that the invariant "if a
parsed flag is_fixed_read_only, its permission must be READ_ONLY".

Note: commands.rs will ensure that no value files are used to create an
invalid parsed flag when flag declarations and values are parsed, but
the invariant check should still be added for completeness sake, and to
make sure no invalid hand-crafted test data exists.

Also fix invalid test data found by adding this invariant.

Bug: 298935897
Test: atest aconfig.test
Change-Id: I8cea5c4d28c458525b7034d78ecb34dd09272771
2023-09-04 20:25:59 +02:00
Mårten Kongstad
5cfad6abd2 aconfig: re-enable development with cargo
The integration tests introduced in 906405f5c9 depend on libraries
auto-generated by running aconfig. This works fine for the Android build
system, but breaks `cargo t`.

Disable the tests when using `cargo t` for local development. Cargo can
be used for rapid local development, including running unit tests;
integration tests should be run using atest.

Bug: 298904077
Test: cargo t
Test: atest aconfig.test_mode.test.rust aconfig.prod_mode.test.rust
Change-Id: Ifcd374fa6efdc121cbfd4c4ac4fb43cf9cacc192
2023-09-04 13:22:28 +02:00
Joe Onorato
cede86dd28 make fake_device_config buildable on host
Test: treehugger
Bug: 277916185
Change-Id: I002669bbb605b7968b81c66d1cbf0ff3caa0c699
Merged-In: I002669bbb605b7968b81c66d1cbf0ff3caa0c699
2023-08-30 11:39:29 -07:00
Jerry Jia
e40f2800af Merge "Add libaconfig_python_proto target for Mobly host-based tests" into main 2023-08-29 22:33:32 +00:00
Zhi Dou
06a448fac7 aconfig: generate full fakefeatureflagsimpl in prod mode
This change will generate full fakefeatureflagsimpl in prod mode.
FakeFeatureFlagsImp will be the same in test mode and the prod mode.
FeatureFlagsImpl will be all unimplemented in test mode. setFlag,
resetAll are added into the interface FeatureFlags.

The reason to make this change is for project using injection pattern,
the project doesn't have to use test mode to test the flag guarded code.
The project can directly use the FakeFeatureFlagsImpl for testing.

Bug: 294838180
Test: atest AconfigJavaHostTest --host AND atest aconfig.test.java
Change-Id: Ib6d40fd3a9ef872e01594fd4f8d6c4cb10bb173a
2023-08-28 16:54:15 +00:00
Xianyuan Jia
3a070a634e Add libaconfig_python_proto target for Mobly host-based tests
Bug: 297431521
Test: unit tests (mobly_device_flags_test)
Change-Id: Ic377cb7c6f651033145a14c83c987e6d779cca6b
2023-08-24 16:49:38 -07:00
Zhi Dou
71f1b35fb4 aconfig: add fixed read only flag
Add a new field in the declaration to indicate whether
the permission can be overridden.

When the field “is_fixed_read_only” is set to true,
the flag permission will be set as fixed “READ_ONLY”,
and the permission should not be changed by Gantry.

Bug: 292521627
Test: atest aconfig.test
Change-Id: Ic9bcd7823bccb8b947cf05568c7ced3763490a23
2023-08-24 17:35:18 +00:00
Yihan Dong
8c0cb8f5e3 Merge "Create the TEST_MAPPING file" into main 2023-08-22 08:39:36 +00:00
Yihan Dong
c2b7632423 Create the TEST_MAPPING file
Add FlagMacrosTests in presubmit to ensure that test filtering rule
always work as expected.

Bug: 292707070
Test: atest --test-mapping
Change-Id: I7a08b7e41e95063fb3c188da784f56e0973d4fae
2023-08-21 17:23:14 +08:00
Joe Onorato
03d53f7d2d Add a fake library that contains the minimum DeviceConfig that aconfig code needs to compile.
The aconfig-generated code in the framework is added with srcjars. To
get those srcjars, we still need a java_aconfig_library.  This class is
there to allow that to compile, even though those compiled .jar files
are not actually used.

Bug: 293195086
Test: m
Change-Id: I34c21925fbc5912a34fea3e7796d5e0c77c9a4af
2023-08-20 07:40:44 -07:00
Vinh Tran
73b4f2d4e2 Merge changes from topic "rust_aconfig-test-mode" into main
* changes:
  Add rust_test with rust_aconfig_library in test mode
  Fix rust aconfig test
2023-08-17 14:48:37 +00:00
Dennis Shen
b352b9d33f Update codegen to use single channel in sys prop
Update sys prop name from persist.device_config.<namespace>.<flag> to persist.aconfig_flags.aconfig_flags.<namespace>.<flag>

Bug: b/295379636
Change-Id: I78f00daa574dc016902dce4b9b4ec961f973693c
2023-08-17 13:48:42 +00:00
Zhi Dou
5f81b7dc96 Merge "aconfig: add default-permission argument for create-cache command" into main 2023-08-14 14:12:27 +00:00
Vinh Tran
906405f5c9 Add rust_test with rust_aconfig_library in test mode
Using test mode in aconfig  allows us to override the flag for unit
testing

Test: atest aconfig.test_mode.test.rust
Change-Id: I890fb20fd8cf83e6033defc7093430e3a77e4de4
2023-08-11 21:41:13 +00:00
Vinh Tran
36fcf63c4e Fix rust aconfig test
Test: atest aconfig.test.rust --start-avd
Change-Id: Ife50e8f81999042b8af91828f5682e84fc7b3811
2023-08-11 17:36:15 -04:00
Zhi Dou
24a0b6a20c aconfig: add default-permission argument for create-cache command
Aconfig set flag default permission as READ_WRITE regardless of the
release configuration. This change enables the caller of create-cache to
set the default permission for all flags, if the flag doesn't have a
value.

Test: atest aconfig.test
Bug: 294417368
Change-Id: I1ba19e1ba793cd2ae59923b136b9b50a92315ece
2023-08-10 21:39:59 +00:00
Dennis Shen
908aba1147 Merge "Add rust_test for aconfig" into main 2023-08-10 17:10:29 +00:00
Zhi Dou
a7200115c5 Add setFlag and resetAll in FeatureFlags test mode
Add methods setFlag and resetAll in FeatureFlags in test mode. For the
injection usecase, user will use the interface FeatureFlags in the code
to control the flags.

Add tests for test mode.

Bug: 280833463
Test: Atest AconfigJavaHostTest --host
Change-Id: Ib59ba35a9011a6400af42fc9c283d37193577997
2023-08-09 01:14:57 +00:00
Vinh Tran
4559309aaf Add rust_test for aconfig
Test: atest aconfig.test.rust
Change-Id: Ic1b201d05fb216c8d881667461e7750949752b4a
2023-08-08 21:25:22 +00:00
Zhi Dou
5aaeee3749 Generate FakeFeatureFlagsImpl in test mode
Before FeatureFlagsImpl will be used as a fake for testing. This change
adds new class FakeFeatureFlagsImpl. The FeatureFlagsImpl will keep the
same as production. FakeFeatureFlagsImpl can be used as fake for
testing.

FakeFeatureFlagsImpl, and FeatureFlagsImpl will be generated in both
test and prod mode. In test mode FeatureFlagsImpl will just be a stub,
and in prod mode FakeFeatureFlagsImpl will just be a stub.

Bug: 280833463
Test: atest aconfig.test
Change-Id: I11c1e716a9ea00d55600e5e9d5fb6442420762e6
2023-08-08 20:35:18 +00:00
Treehugger Robot
9997fdbacf Merge "aconfig: require exactly one bug field" into main 2023-07-28 07:14:42 +00:00
Mårten Kongstad
cd414d4c2e aconfig: improve error messages
Propagate anyhow errors to main.rs and commands.rs to improve the error
message. As an example. instead of just "bad flag declaration: exactly
one bug required", aconfig will now print the following.

---- 8< ----
Error: failed to create cache

Caused by:
    0: failed to parse build/make/tools/aconfig/tests/test.aconfig
    1: bad flag declaration: missing description
---- >8 ----

Error messages can be improved further by including additional
information in the protos.rs error cases. This will be handled in a
follow-up CL.

Bug: 290300657
Test: manual: introduce error in an aconfig file and run `m all_aconfig_declarations`
Test: atest aconfig.test
Change-Id: Id278f4877e5794b95913ae8ba0ca3ee211293f38
2023-07-27 15:54:45 +02:00
Mårten Kongstad
6353c6c635 aconfig: require exactly one bug field
Some consumers of `aconfig dump` do not support multiple bugs. At the
same time, we want all flags to be associated with at least one bug.

Teach aconfig to require that the bug field in the flag_declaration and
parsed_flag proto messages appear exactly once.

This change could have been implemented as a change of `repeated` to
`optional` in the proto definition. However, the chosen approach, with a
runtime check, is easier to revert if we want to support multiple bugs
in the future.

Bug: 293156797
Test: m all_aconfig_declarations && printflags
Test: atest aconfig.test aconfig.test.java aconfig.test.cpp
Change-Id: Ib87dac68b392986a8daa64e56cd85477c92fbe83
2023-07-27 09:44:00 +02:00
Mårten Kongstad
af3da9d1be aconfig: restructure integration tests
Consolidate integration tests under tests/. Rename build targets to
follow the same pattern.

The important aconfig build targets are:

  - aconfig           : the aconfig binary
  - aconfig.test      : the aconfig unit tests
  - aconfig.test.java : the Java integration tests
  - aconfig.test.cpp  : the C++ integration tests
  - aconfig.test.rust : the Rust integration tests (not implemented yet)

Note: the Rust integration tests are blocked until the build system has
added support for aconfig Rust libraries.

Note: the flags used in the integration are not set correctly. A
follow-up CL will fix this.

Bug: 283911467
Test: atest aconfig.test.java aconfig.test.cpp
Change-Id: Idb8dad4c38a49231c2e89228775bacf065ee1f57
2023-07-24 13:05:43 +02:00
Joe Onorato
ac692c5eae Make aconfig c++ generate only one header and only one .cc file
Bug: 283479529
Test: m aconfig_hello_world_cc && adb push $TOP/out/target/product/panther/system/bin/aconfig_hello_world_cc /system/bin && adb shell aconfig_hello_world_cc
Change-Id: I1890aff70262343e18a62fb2efb2fd0e13a48fb2
2023-07-21 09:12:01 -07:00
Treehugger Robot
08cb169cbe Merge changes from topic "aconfig-improve-dump-formats" into main
* changes:
  aconfig: add 'verbose' dump format
  aconfig: improve the 'text' dump format
  aconfig: remove the 'debug' dump format
2023-07-20 12:35:57 +00:00
Mårten Kongstad
2d5309cab1 aconfig: fix broken auto-generated Rust code
Fix syntax error in auto-generated Rust code that prevents the code from
compiling.

For reference, the error was:

---- 8< ----
error: expected `where`, `{`, `(`, or `;` after struct name, found keyword `impl`
 --> .../src/lib.rs:6:1
  |
6 | impl FlagProvider {
  | ^^^^ expected `where`, `{`, `(`, or `;` after struct name
---- >8 ----

Bug: 292052163
Test: manual: create sample based on auto-generated Rust lib
Change-Id: I4c029c0ee16ea3849e7bbe381717a10402c9cb81
2023-07-20 11:33:19 +02:00
Mårten Kongstad
ea4981407b aconfig: add 'verbose' dump format
Add a new --format=verbose dump output format. This is identical to the
default 'text' format but includes the source files from which the flag
declaration and values were read, and is intended to help debug why a
flag isn't set to some expected value.

Bug: 283910447
Test: atest aconfig.test
Test: printflags --format=verbose # manually inspect output
Change-Id: I03a1c8d940e7a0c6f91e986c5bafa4aa6cd1125a
2023-07-20 11:07:35 +02:00
Mårten Kongstad
3fa2f078ff aconfig: improve the 'text' dump format
Standardize the flag values as '<permission> + <state>', e.g.
'READ_ONLY + ENABLED'.

Bug: 283910447
Test: atest aconfig.test
Test: printflags # manually inspect output
Change-Id: I60f74196816327613bd8165a688f8b36da5bdac7
2023-07-20 09:35:05 +02:00
Mårten Kongstad
9338007cff aconfig: remove the 'debug' dump format
The --format=debug dump output format is largely superseded by the
textproto format now that aconfig doesn't use hand-written wrappers
around the auto-generated proto struct anymore. Remove the format to
reduce the risk of code rot.

Bug: 283910447
Test: atest aconfig.test
Change-Id: I6700fc4eafd3fa3a63952109c0105d34c7ffd98b
2023-07-20 09:25:56 +02:00
Zhi Dou
92cf0ec232 Aconfig: sort the parsed flag order in create-cache
This change will sorted the parsed flags from the declarations. Without
this change the code will expect the passed in declarations sorted.
After this change the code will still guarantee the parsed flags in the
cache is sorted, but it won't expect the passed in declarations are
sorted

Test: atest aconfig.test
Bug: 291926035
Change-Id: I5f0637fe770003224b128591890e04277bc09345
2023-07-20 02:32:00 +00:00
Dennis Shen
3cfbcf5384 aconfig: Rust codegen 2nd iteration
Introduce rust codegen 2nd iteration with unit test support. The design
is described in detail in the design doc (go/aconfig_rust_codegen). The general idea is to generate
different code with the same signature for production and test build
targets, just like java/c/cpp codegen.

We will have a FlagProvider struct that has flag methods implementation.
This flag provider instance can then be used in injection pattern. In
additon, we also generate top level functions that wraps around flag
provider call so it can be used in static function style.

Things to be decided later:

should we just generate one set of code, and use cfg! as compile
time marco to compile the right code for the right targets.

Bug: b/279483360
Test: atest aconfig.test
Change-Id: Ic75cedbd0d27b5242014c3ac7fc80692d2ab4589
2023-07-18 20:14:46 +00:00
Dennis Shen
5c2421394c Minor c/c++ codegen update
1, Moved "#include <string>" from exported header to test flag provider
header file.

2, For production target and read only flags, the generated c
api should just return default value instead of calling into c++ api

3, Remove using namespace server_configurable_flags from header, instead
of just having the namespace to be spelled out in each api call. Having
using namespace xxx in header is not a c++ best practice.

4, Replace #ifdef #def #endif with #pragma once

Bug: b/279483801
Test: atest aconfig.test
Change-Id: I3e55a7b14301f3de419795467f33e2dc889d371e
2023-07-14 16:09:35 +00:00
Dennis Shen
17a08eeca0 aconfig: update c/c++ codegen
Two major changes to c/c++ codegen

(1) explicit setter for each flag instead of a generic flag setter
void override_flag(std::string name, bool val) is replaced with

void <flag name>(bool val) for each flag name

This has several advantages:
  (a) generated code is more c++ idomatic
  (b) no longer need to create flag name string constants
  (c) any typo in the code is caught early in the build time

(2) remove flag setter and flag override reset methods/functions when
generating code targets for production. If developers want to update
their main function to take command line arg for flag overrides, they
can use compile time macros to decide if the flag override code should
be included.

Bug: b/279483801
Test: atest aconfig.test
Change-Id: I6141f7f979b32fe0426154d578edeb997ae5ff7c
2023-07-14 11:40:49 +00:00