// Copyright (C) 2018 The Android Open Source Project
//
// 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
//
//      http://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.

// [START declaration]
syntax = "proto3";
package com_android_cts_releaseparser;
// [END declaration]

// [START java_declaration]
option java_package = "com.android.cts.releaseparser";
option java_outer_classname = "ReleaseProto";
// [END java_declaration]

// [START messages]
message Option {
    string name = 1;
    string key = 2;
    string value =3;
}

message TestModuleConfig {
    string module_name = 1;
    string component = 2;
    string description = 3;
    repeated Option options = 4;

    message TargetPreparer {
        string test_class = 1;
        repeated Option options = 2;
    }
    repeated TargetPreparer target_preparers = 5;
    repeated string test_file_names = 6;

    message TestClass {
        string test_class = 1;
        string package = 2;
        repeated Option options = 3;
    }
    repeated TestClass test_classes = 7;
    repeated string test_jars = 8;
}

// An entry in a release
message Entry {
    // Name
    string name = 1;

    enum EntryType {
        FOLDER = 0;
        FILE = 1;
        CONFIG = 2;
        JAR = 3;
        APK = 4;
        EXE = 5;
        SO = 6;
    }
    // Type
    EntryType type = 2;

    // Size
    int64 size = 3;
    // Content ID
    string content_id = 4;
    // Parent folder
    string parent_folder = 5;
    // Relative path
    string relative_path = 6;

    // TestModule.config message
    TestModuleConfig test_module_config = 7;
}

message ReleaseContent {
    // Name
    string name = 1;
    // Version
    string version = 2;
    // Build Number
    string build_number = 3;
    // Content ID
    string content_id = 4;
    string fullname = 5;
    string target_arch = 6;
    string test_suite_tradefed = 7;
    // File Entries
    map<string, Entry> entries = 8;
    repeated string known_failures = 9;
}

message Annotation {
    int32 visibility = 1;
    string type = 2;

    message Element {
        string name = 1;
        string value = 2;
    }
    repeated Element elements = 3;
}

enum TestClassType {
    UNKNOWN = 0;
    JUNIT3 = 1;
    JUNIT4 = 2;
    PARAMETERIZED = 3;
    JAVAHOST = 4;
}

message TestSuite {
    string name = 1;
    // Version
    string version = 2;
    // Build Number
    string build_number = 3;
    // Content ID
    string content_id = 4;

    enum TestType {
        UNKNOWN = 0;
        ANDROIDJUNIT = 1;
        JAVAHOST = 2;
        GTEST = 3;
        LIBCORE = 4;
        DALVIK = 5;
        DEQP = 6;
    }

    message Module {
        string name = 1;
        string config_file = 2;
        TestType test_type = 3;
        string test_class = 4;

        message Package {
            string name = 1;
            string package_file = 2;
            string content_id = 3;
            string op_codes = 4;

            message Class {
                string name = 1;
                string type = 2;
                string super_class = 3;
                string interface = 4;
                TestClassType test_class_type = 5;
                repeated Annotation annotations = 6;

                message Method {
                    string defining_class = 1;
                    string name = 2;
                    string parameters = 3;
                    string return_type = 4;
                    int32 access_flags = 5;
                    string known_failure_filter = 6;
                    repeated Annotation annotations = 7;
                }
                repeated Method methods = 7;

                message Field {
                    string defining_class = 1;
                    string name = 2;
                    string type = 3;
                    int32 access_flags = 4;
                    string initial_value = 5;
                    repeated Annotation annotations = 6;
                }
                repeated Field fields = 8;
            }
            repeated Class classes = 5;
        }
        repeated Package packages = 5;
    }
    repeated Module modules = 5;
}

// [END messages]
