diff --git a/tests/Android.bp b/tests/Android.bp index 9583bfda91..18fc473f97 100644 --- a/tests/Android.bp +++ b/tests/Android.bp @@ -25,4 +25,6 @@ subdirs = [ "pointer/1.0", "pointer/1.0/default", "pointer/1.0/default/lib", + "trie/1.0", + "trie/1.0/default", ] diff --git a/tests/trie/1.0/Android.bp b/tests/trie/1.0/Android.bp new file mode 100644 index 0000000000..fcc43259f1 --- /dev/null +++ b/tests/trie/1.0/Android.bp @@ -0,0 +1,66 @@ +// This file is autogenerated by hidl-gen. Do not edit manually. + +filegroup { + name: "android.hardware.tests.trie@1.0_hal", + srcs: [ + "types.hal", + "ITrie.hal", + ], +} + +genrule { + name: "android.hardware.tests.trie@1.0_genc++", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.tests.trie@1.0", + srcs: [ + ":android.hardware.tests.trie@1.0_hal", + ], + out: [ + "android/hardware/tests/trie/1.0/types.cpp", + "android/hardware/tests/trie/1.0/TrieAll.cpp", + ], +} + +genrule { + name: "android.hardware.tests.trie@1.0_genc++_headers", + tools: ["hidl-gen"], + cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.tests.trie@1.0", + srcs: [ + ":android.hardware.tests.trie@1.0_hal", + ], + out: [ + "android/hardware/tests/trie/1.0/types.h", + "android/hardware/tests/trie/1.0/hwtypes.h", + "android/hardware/tests/trie/1.0/ITrie.h", + "android/hardware/tests/trie/1.0/IHwTrie.h", + "android/hardware/tests/trie/1.0/BnHwTrie.h", + "android/hardware/tests/trie/1.0/BpHwTrie.h", + "android/hardware/tests/trie/1.0/BsTrie.h", + ], +} + +cc_library { + name: "android.hardware.tests.trie@1.0", + defaults: ["hidl-module-defaults"], + generated_sources: ["android.hardware.tests.trie@1.0_genc++"], + generated_headers: ["android.hardware.tests.trie@1.0_genc++_headers"], + export_generated_headers: ["android.hardware.tests.trie@1.0_genc++_headers"], + vendor_available: true, + vndk: { + enabled: true, + }, + shared_libs: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "liblog", + "libutils", + "libcutils", + ], + export_shared_lib_headers: [ + "libhidlbase", + "libhidltransport", + "libhwbinder", + "libutils", + ], +} diff --git a/tests/trie/1.0/ITrie.hal b/tests/trie/1.0/ITrie.hal new file mode 100644 index 0000000000..5d009ca54c --- /dev/null +++ b/tests/trie/1.0/ITrie.hal @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2017 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. + */ + +package android.hardware.tests.trie@1.0; + +interface ITrie { + newTrie() generates (TrieNode trie); + addStrings(TrieNode trie, vec strings) generates (TrieNode trie); + containsStrings(TrieNode trie, vec strings) generates (vec contains); +}; diff --git a/tests/trie/1.0/default/Android.bp b/tests/trie/1.0/default/Android.bp new file mode 100644 index 0000000000..315c8bb826 --- /dev/null +++ b/tests/trie/1.0/default/Android.bp @@ -0,0 +1,16 @@ +cc_library_shared { + name: "android.hardware.tests.trie@1.0-impl", + defaults: ["hidl_defaults"], + relative_install_path: "hw", + srcs: [ + "Trie.cpp", + ], + shared_libs: [ + "libbase", + "libhidlbase", + "libhidltransport", + "liblog", + "libutils", + "android.hardware.tests.trie@1.0", + ], +} diff --git a/tests/trie/1.0/default/Trie.cpp b/tests/trie/1.0/default/Trie.cpp new file mode 100644 index 0000000000..c81c5080d4 --- /dev/null +++ b/tests/trie/1.0/default/Trie.cpp @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2017 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. + */ + +#define LOG_TAG "hidl_test" + +#include "Trie.h" +#include +#include +#include + +namespace android { +namespace hardware { +namespace tests { +namespace trie { +namespace V1_0 { +namespace implementation { + +// Methods from ::android::hardware::tests::trie::V1_0::ITrie follow. +Return Trie::newTrie(newTrie_cb _hidl_cb) { + LOG(INFO) << "SERVER(Trie) newTrie()"; + + TrieNode ret; + ret.isTerminal = false; + _hidl_cb(ret); + return Void(); +} + +Return Trie::addStrings(const TrieNode& trie, const hidl_vec& strings, + addStrings_cb _hidl_cb) { + LOG(INFO) << "SERVER(Trie) addStrings(trie, " << strings.size() << " strings)"; + + // Make trie modifiable. + TrieNode newTrie = trie; + + for (const auto& str : strings) { + addString(&newTrie, str); + } + _hidl_cb(newTrie); + return Void(); +} + +Return Trie::containsStrings(const TrieNode& trie, const hidl_vec& strings, + containsStrings_cb _hidl_cb) { + LOG(INFO) << "SERVER(Trie) containsStrings(trie, " << strings.size() << " strings)"; + + std::vector ret(strings.size()); + for (size_t i = 0; i != strings.size(); ++i) { + ret[i] = containsString(&trie, strings[i]); + } + _hidl_cb(ret); + return Void(); +} + +void Trie::addString(TrieNode* trieRoot, const std::string& str) { + TrieNode* currNode = trieRoot; + + for (char ch : str) { + auto& vec = currNode->next; + + auto it = std::find_if(vec.begin(), vec.end(), + [&](const TrieEdge& edge) { return ch == edge.character; }); + + if (it == vec.end()) { + vec.resize(vec.size() + 1); + it = vec.end() - 1; + it->character = ch; + it->node.isTerminal = false; + } + + currNode = &(it->node); + } + + currNode->isTerminal = true; +} + +bool Trie::containsString(const TrieNode* trieRoot, const std::string& str) { + const TrieNode* currNode = trieRoot; + + for (char ch : str) { + const auto& vec = currNode->next; + + auto it = std::find_if(vec.begin(), vec.end(), + [&](const TrieEdge& edge) { return ch == edge.character; }); + + if (it == vec.end()) return false; + currNode = &(it->node); + } + + return currNode->isTerminal; +} + +ITrie* HIDL_FETCH_ITrie(const char* /* name */) { + return new Trie(); +} + +} // namespace implementation +} // namespace V1_0 +} // namespace trie +} // namespace tests +} // namespace hardware +} // namespace android diff --git a/tests/trie/1.0/default/Trie.h b/tests/trie/1.0/default/Trie.h new file mode 100644 index 0000000000..c2ef40bb69 --- /dev/null +++ b/tests/trie/1.0/default/Trie.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2017 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. + */ + +#ifndef ANDROID_HARDWARE_TESTS_TRIE_V1_0_TRIE_H +#define ANDROID_HARDWARE_TESTS_TRIE_V1_0_TRIE_H + +#include +#include + +#include + +namespace android { +namespace hardware { +namespace tests { +namespace trie { +namespace V1_0 { +namespace implementation { + +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::tests::trie::V1_0::ITrie; +using ::android::hardware::tests::trie::V1_0::TrieNode; + +struct Trie : public ITrie { + // Methods from ::android::hardware::tests::trie::V1_0::ITrie follow. + virtual Return newTrie(newTrie_cb _hidl_cb) override; + virtual Return addStrings(const TrieNode& trie, const hidl_vec& strings, + addStrings_cb _hidl_cb) override; + virtual Return containsStrings(const TrieNode& trie, const hidl_vec& strings, + containsStrings_cb _hidl_cb) override; + + private: + void addString(TrieNode* trieRoot, const std::string& str); + bool containsString(const TrieNode* trieRoot, const std::string& str); +}; + +extern "C" ITrie* HIDL_FETCH_ITrie(const char* name); + +} // namespace implementation +} // namespace V1_0 +} // namespace trie +} // namespace tests +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_TESTS_TRIE_V1_0_TRIE_H diff --git a/tests/trie/1.0/types.hal b/tests/trie/1.0/types.hal new file mode 100644 index 0000000000..28c502bd71 --- /dev/null +++ b/tests/trie/1.0/types.hal @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2017 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. + */ + +package android.hardware.tests.trie@1.0; + +struct TrieNode { + vec next; + bool isTerminal; +}; + +struct TrieEdge { + int8_t character; + TrieNode node; +}; + +// Some forward reference tests. + +struct A { + ref b; +}; + +struct B { + ref a; +}; + +typedef ref refS; +struct S { + refS f; +}; + +enum E1 : int32_t { + OK = E2:ACCEPT + ANOTHER, + ANOTHER = 100, +}; + +enum E2 : E1 { + ACCEPT, +};