diff --git a/soundtrigger/2.0/Android.mk b/soundtrigger/2.0/Android.mk new file mode 100644 index 0000000000..f9e32763ff --- /dev/null +++ b/soundtrigger/2.0/Android.mk @@ -0,0 +1,19 @@ +# +# Copyright (C) 2016 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. +# + +LOCAL_PATH := $(call my-dir) + +include $(call all-subdir-makefiles) diff --git a/soundtrigger/2.0/vts/Android.mk b/soundtrigger/2.0/vts/Android.mk new file mode 100644 index 0000000000..f9e32763ff --- /dev/null +++ b/soundtrigger/2.0/vts/Android.mk @@ -0,0 +1,19 @@ +# +# Copyright (C) 2016 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. +# + +LOCAL_PATH := $(call my-dir) + +include $(call all-subdir-makefiles) diff --git a/soundtrigger/2.0/vts/functional/Android.bp b/soundtrigger/2.0/vts/functional/Android.bp new file mode 100644 index 0000000000..8abdf06a25 --- /dev/null +++ b/soundtrigger/2.0/vts/functional/Android.bp @@ -0,0 +1,37 @@ +// +// Copyright (C) 2016 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. +// + +cc_test { + name: "soundtrigger_hidl_hal_test", + gtest: true, + srcs: ["soundtrigger_hidl_hal_test.cpp"], + shared_libs: [ + "libbase", + "liblog", + "libcutils", + "libhidlbase", + "libhidltransport", + "libhwbinder", + "libnativehelper", + "libutils", + "android.hardware.soundtrigger@2.0", + ], + static_libs: ["libgtest"], + cflags: [ + "-O0", + "-g", + ], +} diff --git a/soundtrigger/2.0/vts/functional/Android.mk b/soundtrigger/2.0/vts/functional/Android.mk new file mode 100644 index 0000000000..f9e32763ff --- /dev/null +++ b/soundtrigger/2.0/vts/functional/Android.mk @@ -0,0 +1,19 @@ +# +# Copyright (C) 2016 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. +# + +LOCAL_PATH := $(call my-dir) + +include $(call all-subdir-makefiles) diff --git a/soundtrigger/2.0/vts/functional/soundtrigger_hidl_hal_test.cpp b/soundtrigger/2.0/vts/functional/soundtrigger_hidl_hal_test.cpp new file mode 100644 index 0000000000..cbd812874e --- /dev/null +++ b/soundtrigger/2.0/vts/functional/soundtrigger_hidl_hal_test.cpp @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2016 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 "SoundTriggerHidlHalTest" +#include +#include + +#include +#include +#include + +#include + +using ::android::hardware::audio::common::V2_0::AudioDevice; +using ::android::hardware::soundtrigger::V2_0::SoundModelHandle; +using ::android::hardware::soundtrigger::V2_0::SoundModelType; +using ::android::hardware::soundtrigger::V2_0::RecognitionMode; +using ::android::hardware::soundtrigger::V2_0::PhraseRecognitionExtra; +using ::android::hardware::soundtrigger::V2_0::ISoundTriggerHw; +using ::android::hardware::soundtrigger::V2_0::ISoundTriggerHwCallback; +using ::android::hardware::Return; +using ::android::hardware::Status; +using ::android::hardware::Void; +using ::android::sp; + +// The main test class for Sound Trigger HIDL HAL. +class SoundTriggerHidlTest : public ::testing::Test { + public: + virtual void SetUp() override { + mSoundTriggerHal = ISoundTriggerHw::getService("sound_trigger.primary", false); + ASSERT_NE(nullptr, mSoundTriggerHal.get()); + ASSERT_TRUE(mSoundTriggerHal->isRemote()); + mCallback = new MyCallback(); + ASSERT_NE(nullptr, mCallback.get()); + } + + class MyCallback : public ISoundTriggerHwCallback { + virtual Return recognitionCallback( + const ISoundTriggerHwCallback::RecognitionEvent& event __unused, + int32_t cookie __unused) { + ALOGI("%s", __FUNCTION__); + return Void(); + } + + virtual Return phraseRecognitionCallback( + const ISoundTriggerHwCallback::PhraseRecognitionEvent& event __unused, + int32_t cookie __unused) { + ALOGI("%s", __FUNCTION__); + return Void(); + } + + virtual Return soundModelCallback( + const ISoundTriggerHwCallback::ModelEvent& event __unused, + int32_t cookie __unused) { + ALOGI("%s", __FUNCTION__); + return Void(); + } + }; + + virtual void TearDown() override {} + + sp mSoundTriggerHal; + sp mCallback; +}; + +// A class for test environment setup (kept since this file is a template). +class SoundTriggerHidlEnvironment : public ::testing::Environment { + public: + virtual void SetUp() {} + virtual void TearDown() {} + + private: +}; + +/** + * Test ISoundTriggerHw::getProperties() method + * + * Verifies that: + * - the implementation implements the method + * - the method returns 0 (no error) + * - the implementation supports at least one sound model and one key phrase + * - the implementation supports at least VOICE_TRIGGER recognition mode + */ +TEST_F(SoundTriggerHidlTest, GetProperties) { + ISoundTriggerHw::Properties halProperties; + Return hidlReturn; + int ret = -ENODEV; + + hidlReturn = mSoundTriggerHal->getProperties([&](int rc, auto res) { + ret = rc; + halProperties = res; + }); + + EXPECT_EQ(Status::EX_NONE, hidlReturn.getStatus().exceptionCode()); + EXPECT_EQ(0, ret); + EXPECT_GT(halProperties.maxSoundModels, 0u); + EXPECT_GT(halProperties.maxKeyPhrases, 0u); + EXPECT_NE(0u, (halProperties.recognitionModes & (uint32_t)RecognitionMode::VOICE_TRIGGER)); +} + +/** + * Test ISoundTriggerHw::loadPhraseSoundModel() method + * + * Verifies that: + * - the implementation implements the method + * - the implementation returns an error when passed a malformed sound model + * + * There is no way to verify that implementation actually can load a sound model because each + * sound model is vendor specific. + */ +TEST_F(SoundTriggerHidlTest, LoadInvalidModelFail) { + Return hidlReturn; + int ret = -ENODEV; + ISoundTriggerHw::PhraseSoundModel model; + SoundModelHandle handle; + + model.common.type = SoundModelType::UNKNOWN; + + hidlReturn = mSoundTriggerHal->loadPhraseSoundModel( + model, + mCallback, 0, [&](int32_t retval, auto res) { + ret = retval; + handle = res; + }); + + EXPECT_EQ(Status::EX_NONE, hidlReturn.getStatus().exceptionCode()); + EXPECT_NE(0, ret); +} + +/** + * Test ISoundTriggerHw::unloadSoundModel() method + * + * Verifies that: + * - the implementation implements the method + * - the implementation returns an error when called without a valid loaded sound model + * + */ +TEST_F(SoundTriggerHidlTest, UnloadModelNoModelFail) { + Return hidlReturn(0); + SoundModelHandle halHandle = 0; + + hidlReturn = mSoundTriggerHal->unloadSoundModel(halHandle); + + EXPECT_EQ(Status::EX_NONE, hidlReturn.getStatus().exceptionCode()); + EXPECT_NE(0, hidlReturn); +} + +/** + * Test ISoundTriggerHw::startRecognition() method + * + * Verifies that: + * - the implementation implements the method + * - the implementation returns an error when called without a valid loaded sound model + * + * There is no way to verify that implementation actually starts recognition because no model can + * be loaded. + */ +TEST_F(SoundTriggerHidlTest, StartRecognitionNoModelFail) { + Return hidlReturn(0); + SoundModelHandle handle = 0; + PhraseRecognitionExtra phrase; + ISoundTriggerHw::RecognitionConfig config; + + config.captureHandle = 0; + config.captureDevice = AudioDevice::IN_BUILTIN_MIC; + phrase.id = 0; + phrase.recognitionModes = (uint32_t)RecognitionMode::VOICE_TRIGGER; + phrase.confidenceLevel = 0; + + config.phrases.setToExternal(&phrase, 1); + + hidlReturn = mSoundTriggerHal->startRecognition(handle, config, mCallback, 0); + + EXPECT_EQ(Status::EX_NONE, hidlReturn.getStatus().exceptionCode()); + EXPECT_NE(0, hidlReturn); +} + +/** + * Test ISoundTriggerHw::stopRecognition() method + * + * Verifies that: + * - the implementation implements the method + * - the implementation returns an error when called without an active recognition running + * + */ +TEST_F(SoundTriggerHidlTest, StopRecognitionNoAStartFail) { + Return hidlReturn(0); + SoundModelHandle handle = 0; + + hidlReturn = mSoundTriggerHal->stopRecognition(handle); + + EXPECT_EQ(Status::EX_NONE, hidlReturn.getStatus().exceptionCode()); + EXPECT_NE(0, hidlReturn); +} + +/** + * Test ISoundTriggerHw::stopAllRecognitions() method + * + * Verifies that: + * - the implementation implements this optional method or indicates it is not support by + * returning -ENOSYS + */ +TEST_F(SoundTriggerHidlTest, stopAllRecognitions) { + Return hidlReturn(0); + SoundModelHandle handle = 0; + + hidlReturn = mSoundTriggerHal->stopAllRecognitions(); + + EXPECT_EQ(Status::EX_NONE, hidlReturn.getStatus().exceptionCode()); + EXPECT_TRUE(hidlReturn == 0 || hidlReturn == -ENOSYS); +} + + +int main(int argc, char** argv) { + ::testing::AddGlobalTestEnvironment(new SoundTriggerHidlEnvironment); + ::testing::InitGoogleTest(&argc, argv); + int status = RUN_ALL_TESTS(); + ALOGI("Test result = %d", status); + return status; +} diff --git a/soundtrigger/2.0/vts/functional/vts/Android.mk b/soundtrigger/2.0/vts/functional/vts/Android.mk new file mode 100644 index 0000000000..f9e32763ff --- /dev/null +++ b/soundtrigger/2.0/vts/functional/vts/Android.mk @@ -0,0 +1,19 @@ +# +# Copyright (C) 2016 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. +# + +LOCAL_PATH := $(call my-dir) + +include $(call all-subdir-makefiles) diff --git a/soundtrigger/2.0/vts/functional/vts/testcases/Android.mk b/soundtrigger/2.0/vts/functional/vts/testcases/Android.mk new file mode 100644 index 0000000000..f9e32763ff --- /dev/null +++ b/soundtrigger/2.0/vts/functional/vts/testcases/Android.mk @@ -0,0 +1,19 @@ +# +# Copyright (C) 2016 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. +# + +LOCAL_PATH := $(call my-dir) + +include $(call all-subdir-makefiles) diff --git a/soundtrigger/2.0/vts/functional/vts/testcases/hal/Android.mk b/soundtrigger/2.0/vts/functional/vts/testcases/hal/Android.mk new file mode 100644 index 0000000000..f9e32763ff --- /dev/null +++ b/soundtrigger/2.0/vts/functional/vts/testcases/hal/Android.mk @@ -0,0 +1,19 @@ +# +# Copyright (C) 2016 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. +# + +LOCAL_PATH := $(call my-dir) + +include $(call all-subdir-makefiles) diff --git a/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/Android.mk b/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/Android.mk new file mode 100644 index 0000000000..f9e32763ff --- /dev/null +++ b/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/Android.mk @@ -0,0 +1,19 @@ +# +# Copyright (C) 2016 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. +# + +LOCAL_PATH := $(call my-dir) + +include $(call all-subdir-makefiles) diff --git a/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/hidl/Android.mk b/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/hidl/Android.mk new file mode 100644 index 0000000000..f9e32763ff --- /dev/null +++ b/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/hidl/Android.mk @@ -0,0 +1,19 @@ +# +# Copyright (C) 2016 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. +# + +LOCAL_PATH := $(call my-dir) + +include $(call all-subdir-makefiles) diff --git a/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/hidl/target/Android.mk b/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/hidl/target/Android.mk new file mode 100644 index 0000000000..a99f4ce959 --- /dev/null +++ b/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/hidl/target/Android.mk @@ -0,0 +1,25 @@ +# +# Copyright (C) 2016 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. +# + +LOCAL_PATH := $(call my-dir) + +include $(call all-subdir-makefiles) + +include $(CLEAR_VARS) + +LOCAL_MODULE := HalSoundTriggerHidlTargetBasicTest +VTS_CONFIG_SRC_DIR := testcases/hal/soundtrigger/hidl/target +include test/vts/tools/build/Android.host_config.mk diff --git a/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/hidl/target/AndroidTest.xml b/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/hidl/target/AndroidTest.xml new file mode 100644 index 0000000000..b75d97e980 --- /dev/null +++ b/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/hidl/target/AndroidTest.xml @@ -0,0 +1,30 @@ + + + + + + + + + diff --git a/soundtrigger/Android.bp b/soundtrigger/Android.bp index c12cd4f92d..8d2c986746 100644 --- a/soundtrigger/Android.bp +++ b/soundtrigger/Android.bp @@ -1,4 +1,5 @@ // This is an autogenerated file, do not edit. subdirs = [ "2.0", + "2.0/vts/functional", ] diff --git a/soundtrigger/Android.mk b/soundtrigger/Android.mk new file mode 100644 index 0000000000..f9e32763ff --- /dev/null +++ b/soundtrigger/Android.mk @@ -0,0 +1,19 @@ +# +# Copyright (C) 2016 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. +# + +LOCAL_PATH := $(call my-dir) + +include $(call all-subdir-makefiles)