# Tuning Fork Validation tool
This tool validates Tuning Fork proto and settings files in an APK.
## tuningfork_settings
The APK must contain *assets/tuningfork/tuningfork_settings.bin* file with
serialized data for `Settings` proto message:
```proto
message Settings {
message Histogram {
optional int32 instrument_key = 1;
optional float bucket_min = 2;
optional float bucket_max = 3;
optional int32 n_buckets = 4;
}
message AggregationStrategy {
enum Submission {
TIME_BASED = 1;
TICK_BASED = 2;
}
optional Submission method = 1;
optional int32 intervalms_or_count = 2;
optional int32 max_instrumentation_keys = 3;
repeated int32 annotation_enum_size = 4;
}
optional AggregationStrategy aggregation_strategy = 1;
repeated Histogram histograms = 2;
}
```
### Settings validation
* At least one histogram
* `max_instrumentation_keys` must be between 1 and 256
* `annotation_enum_size` must match `Annotation` message (see below)
### Example
Example of data before serialization:
```textproto
aggregation_strategy:
{
method: TIME_BASED,
intervalms_or_count: 600000,
max_instrumentation_keys: 2,
annotation_enum_size: [3, 4]
}
histograms:
[
{
instrument_key: 0,
bucket_min: 28,
bucket_max: 32,
n_buckets: 70
},
{
instrument_key: 1,
bucket_min: 28,
bucket_max: 32,
n_buckets: 70
}
]
```
## dev_tuningfork.proto
Apk must contain *assets/tuningfork/dev_tuningfork.proto* file with `Annotation`
and `FidelityParams` proto message.
### Validation
Both messages (`Annotation` and `FidelityParams`) must follow these rules
* No oneofs
* No Nested types
* No extensions
Additional limitation for `Annotation` message only
* Only `ENUM` types
* Size of enums must match 'annotation_enum_size` field in settings.
Additional limitation for `FidelityParams` messsage only
* Only `ENUM`, `FLOAT` and `INT32` types
### Example
Valid .proto file:
```proto
syntax = "proto3";
package com.google.tuningfork;
enum LoadingState {
UNKNOWN = 0;
LOADING = 1;
NOT_LOADING = 2;
}
enum Level {
UNKNOWN = 0;
Level_1 = 1;
Level_2 = 2;
Level_3 = 3;
}
message Annotation {
LoadingState loading_state = 1;
Level level = 2;
}
enum QualitySettings {
UNKNOWN = 0;
FASTEST = 1;
FAST = 2;
SIMPLE = 3;
GOOD = 4;
BEAUTIFUL = 5;
FANTASTIC = 6;
}
message FidelityParams {
QualitySettings quality_settings = 1;
int32 lod_level = 2;
float distance = 3;
}
```
### Annotation size explanation
*annotation_enum_size* from Settings proto must match 'Annotation' message
From `Annotation` message example above:
* number of enum fields for `LoadingState` enum is 3
* number of enum fields for `Level` enum is 4
* `Annotation` message contains two fields - 'loading_state' and 'level'
* `annotation_enum_size` must be [3, 4]
## dev_tuningfork_fidelityparams
The APK must contain at least one file in assets/tuningfork folder with pattern
*dev_tuningfork_fidelityparams_.{1,15}.bin*. Each file contains serialized
parameters for `FidelityParams` proto message from *dev_tuningfork.proto* file.