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