1d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen/*
2d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * Copyright (C) 2017, The Android Open Source Project
3d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen *
4d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * Licensed under the Apache License, Version 2.0 (the "License");
5d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * you may not use this file except in compliance with the License.
6d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * You may obtain a copy of the License at
7d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen *
8d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen *     http://www.apache.org/licenses/LICENSE-2.0
9d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen *
10d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * Unless required by applicable law or agreed to in writing, software
11d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * distributed under the License is distributed on an "AS IS" BASIS,
12d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * See the License for the specific language governing permissions and
14d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * limitations under the License.
15d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen */
16d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
17d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen#include <gtest/gtest.h>
18d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
19d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen#include "frameworks/base/tools/stats_log_api_gen/test.pb.h"
20d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen#include "Collation.h"
21d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
22d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen#include <stdio.h>
23d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
24d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chennamespace android {
25d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chennamespace stats_log_api_gen {
26d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
279478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafonusing std::map;
28d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chenusing std::set;
29d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chenusing std::vector;
30d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
31d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen/**
32d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * Return whether the set contains a vector of the elements provided.
33d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen */
34d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chenstatic bool
35d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chenset_contains_vector(const set<vector<java_type_t>>& s, int count, ...)
36d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen{
37d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    va_list args;
38d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    vector<java_type_t> v;
39d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
40d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    va_start(args, count);
41d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    for (int i=0; i<count; i++) {
42d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen        v.push_back((java_type_t)va_arg(args, int));
43d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    }
44d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    va_end(args);
45d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
46d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    return s.find(v) != s.end();
47d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen}
48d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
49d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen/**
50d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * Expect that the provided set contains the elements provided.
51d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen */
52d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen#define EXPECT_SET_CONTAINS_SIGNATURE(s, ...) \
53d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    do { \
54d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen        int count = sizeof((int[]){__VA_ARGS__})/sizeof(int); \
55d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen        EXPECT_TRUE(set_contains_vector(s, count, __VA_ARGS__)); \
56d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    } while(0)
57d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
589478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon/** Expects that the provided atom has no enum values for any field. */
599478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon#define EXPECT_NO_ENUM_FIELD(atom) \
609478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon    do { \
619478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon        for (vector<AtomField>::const_iterator field = atom->fields.begin(); \
629478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon             field != atom->fields.end(); field++) { \
639478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon            EXPECT_TRUE(field->enumValues.empty()); \
649478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon        } \
659478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon    } while(0)
669478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon
677604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac/** Expects that exactly one specific field has expected enum values. */
689478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon#define EXPECT_HAS_ENUM_FIELD(atom, field_name, values)        \
699478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon    do { \
709478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon        for (vector<AtomField>::const_iterator field = atom->fields.begin(); \
719478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon             field != atom->fields.end(); field++) { \
729478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon            if (field->name == field_name) { \
739478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon                EXPECT_EQ(field->enumValues, values); \
749478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon            } else { \
759478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon                EXPECT_TRUE(field->enumValues.empty()); \
769478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon            } \
779478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon        } \
789478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon    } while(0)
799478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon
809478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon
81d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen/**
82d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * Test a correct collation, with all the types.
83d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen */
84d54f9dd6251c7bd7033630b7afa770190d41c409Yao ChenTEST(CollationTest, CollateStats) {
85d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    Atoms atoms;
86d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    int errorCount = collate_atoms(Event::descriptor(), &atoms);
87d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
88d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ(0, errorCount);
89d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ(3ul, atoms.signatures.size());
90d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
91d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    // IntAtom, AnotherIntAtom
92d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_SET_CONTAINS_SIGNATURE(atoms.signatures, JAVA_TYPE_INT);
93d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
94d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    // OutOfOrderAtom
95d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_SET_CONTAINS_SIGNATURE(atoms.signatures, JAVA_TYPE_INT, JAVA_TYPE_INT);
96d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
97d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    // AllTypesAtom
987604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac    EXPECT_SET_CONTAINS_SIGNATURE(
997604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        atoms.signatures,
1007604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_ATTRIBUTION_CHAIN, // AttributionChain
1017604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_DOUBLE,            // double
1027604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_FLOAT,             // float
1037604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_LONG,              // int64
1047604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_LONG,              // uint64
1057604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_INT,               // int32
1067604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_LONG,              // fixed64
1077604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_INT,               // fixed32
1087604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_BOOLEAN,           // bool
1097604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_STRING,            // string
1107604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_INT,               // uint32
1117604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_INT,               // AnEnum
1127604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_INT,               // sfixed32
1137604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_LONG,              // sfixed64
1147604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_INT,               // sint32
1157604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac        JAVA_TYPE_LONG               // sint64
1167604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac    );
117d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
118d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    set<AtomDecl>::const_iterator atom = atoms.decls.begin();
119d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ(1, atom->code);
120d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ("int_atom", atom->name);
121d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ("IntAtom", atom->message);
1229478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon    EXPECT_NO_ENUM_FIELD(atom);
123d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    atom++;
124d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
125d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ(2, atom->code);
126d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ("out_of_order_atom", atom->name);
127d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ("OutOfOrderAtom", atom->message);
1289478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon    EXPECT_NO_ENUM_FIELD(atom);
129d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    atom++;
130d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
131d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ(3, atom->code);
132d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ("another_int_atom", atom->name);
133d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ("AnotherIntAtom", atom->message);
1349478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon    EXPECT_NO_ENUM_FIELD(atom);
135d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    atom++;
136d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
137d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ(4, atom->code);
138d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ("all_types_atom", atom->name);
139d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ("AllTypesAtom", atom->message);
1409478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon    map<int, string> enumValues;
1419478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon    enumValues[0] = "VALUE0";
1429478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon    enumValues[1] = "VALUE1";
1439478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon    EXPECT_HAS_ENUM_FIELD(atom, "enum_field", enumValues);
144d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    atom++;
145d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
146d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_TRUE(atom == atoms.decls.end());
147d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen}
148d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
149d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen/**
150d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * Test that event class that contains stuff other than the atoms is rejected.
151d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen */
152d54f9dd6251c7bd7033630b7afa770190d41c409Yao ChenTEST(CollationTest, NonMessageTypeFails) {
153d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    Atoms atoms;
154d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    int errorCount = collate_atoms(IntAtom::descriptor(), &atoms);
155d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
156d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ(1, errorCount);
157d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen}
158d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
159d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen/**
1609478f3515b2e0ccc8320b1911e6f911e3a3ffde0Stefan Lafon * Test that atoms that have non-primitive types are rejected.
161d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen */
162d54f9dd6251c7bd7033630b7afa770190d41c409Yao ChenTEST(CollationTest, FailOnBadTypes) {
163d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    Atoms atoms;
164d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    int errorCount = collate_atoms(BadTypesEvent::descriptor(), &atoms);
165d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
166d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ(2, errorCount);
167d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen}
168d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
169d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen/**
170d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * Test that atoms that skip field numbers (in the first position) are rejected.
171d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen */
172d54f9dd6251c7bd7033630b7afa770190d41c409Yao ChenTEST(CollationTest, FailOnSkippedFieldsSingle) {
173d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    Atoms atoms;
174d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    int errorCount = collate_atoms(BadSkippedFieldSingle::descriptor(), &atoms);
175d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
176d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ(1, errorCount);
177d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen}
178d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
179d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen/**
180d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * Test that atoms that skip field numbers (not in the first position, and multiple
181d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen * times) are rejected.
182d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen */
183d54f9dd6251c7bd7033630b7afa770190d41c409Yao ChenTEST(CollationTest, FailOnSkippedFieldsMultiple) {
184d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    Atoms atoms;
185d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    int errorCount = collate_atoms(BadSkippedFieldMultiple::descriptor(), &atoms);
186d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
187d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen    EXPECT_EQ(2, errorCount);
188d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen}
189d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
190d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen/**
1917604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac * Test that atoms that have an attribution chain not in the first position are
1927604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac * rejected.
193d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen */
1942087716f2bdca90c7c3034d556ac12911bd8018eYangster-macTEST(CollationTest, FailBadAttributionNodePosition) {
1957604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac  Atoms atoms;
1967604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac  int errorCount =
1972087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac      collate_atoms(BadAttributionNodePosition::descriptor(), &atoms);
198d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
1997604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac  EXPECT_EQ(1, errorCount);
200d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen}
201d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
2029c1debe330006b2b4d5c08a55905789c57369609Yao ChenTEST(CollationTest, FailOnBadStateAtomOptions) {
2039c1debe330006b2b4d5c08a55905789c57369609Yao Chen    Atoms atoms;
2049c1debe330006b2b4d5c08a55905789c57369609Yao Chen    int errorCount = collate_atoms(BadStateAtoms::descriptor(), &atoms);
2059c1debe330006b2b4d5c08a55905789c57369609Yao Chen
2069c1debe330006b2b4d5c08a55905789c57369609Yao Chen    EXPECT_EQ(3, errorCount);
2079c1debe330006b2b4d5c08a55905789c57369609Yao Chen}
2089c1debe330006b2b4d5c08a55905789c57369609Yao Chen
2099c1debe330006b2b4d5c08a55905789c57369609Yao ChenTEST(CollationTest, PassOnGoodStateAtomOptions) {
2109c1debe330006b2b4d5c08a55905789c57369609Yao Chen    Atoms atoms;
2119c1debe330006b2b4d5c08a55905789c57369609Yao Chen    int errorCount = collate_atoms(GoodStateAtoms::descriptor(), &atoms);
2129c1debe330006b2b4d5c08a55905789c57369609Yao Chen    EXPECT_EQ(0, errorCount);
2139c1debe330006b2b4d5c08a55905789c57369609Yao Chen}
2149c1debe330006b2b4d5c08a55905789c57369609Yao Chen
215d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen}  // namespace stats_log_api_gen
2167604aeaf99b0ee14c1f9df95db0fc1d4e75b1baaYangster-mac}  // namespace android