| /* |
| * Copyright (C) 2014 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.soundtrigger; |
| |
| import android.hardware.soundtrigger.SoundTrigger; |
| import android.hardware.soundtrigger.SoundTrigger.ConfidenceLevel; |
| import android.hardware.soundtrigger.SoundTrigger.Keyphrase; |
| import android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionEvent; |
| import android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra; |
| import android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel; |
| import android.hardware.soundtrigger.SoundTrigger.RecognitionEvent; |
| import android.media.AudioFormat; |
| import android.os.Parcel; |
| import android.test.InstrumentationTestCase; |
| import android.test.suitebuilder.annotation.LargeTest; |
| import android.test.suitebuilder.annotation.SmallTest; |
| |
| import java.util.Arrays; |
| import java.util.Random; |
| import java.util.UUID; |
| |
| public class SoundTriggerTest extends InstrumentationTestCase { |
| private Random mRandom = new Random(); |
| |
| @SmallTest |
| public void testKeyphraseParcelUnparcel_noUsers() throws Exception { |
| Keyphrase keyphrase = new Keyphrase(1, 0, "en-US", "hello", null); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| keyphrase.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| Keyphrase unparceled = Keyphrase.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(keyphrase.id, unparceled.id); |
| assertNull(unparceled.users); |
| assertEquals(keyphrase.locale, unparceled.locale); |
| assertEquals(keyphrase.text, unparceled.text); |
| } |
| |
| @SmallTest |
| public void testKeyphraseParcelUnparcel_zeroUsers() throws Exception { |
| Keyphrase keyphrase = new Keyphrase(1, 0, "en-US", "hello", new int[0]); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| keyphrase.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| Keyphrase unparceled = Keyphrase.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(keyphrase.id, unparceled.id); |
| assertTrue(Arrays.equals(keyphrase.users, unparceled.users)); |
| assertEquals(keyphrase.locale, unparceled.locale); |
| assertEquals(keyphrase.text, unparceled.text); |
| } |
| |
| @SmallTest |
| public void testKeyphraseParcelUnparcel_pos() throws Exception { |
| Keyphrase keyphrase = new Keyphrase(1, 0, "en-US", "hello", new int[] {1, 2, 3, 4, 5}); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| keyphrase.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| Keyphrase unparceled = Keyphrase.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(keyphrase.id, unparceled.id); |
| assertTrue(Arrays.equals(keyphrase.users, unparceled.users)); |
| assertEquals(keyphrase.locale, unparceled.locale); |
| assertEquals(keyphrase.text, unparceled.text); |
| } |
| |
| @SmallTest |
| public void testKeyphraseSoundModelParcelUnparcel_noData() throws Exception { |
| Keyphrase[] keyphrases = new Keyphrase[2]; |
| keyphrases[0] = new Keyphrase(1, 0, "en-US", "hello", new int[] {0}); |
| keyphrases[1] = new Keyphrase(2, 0, "fr-FR", "there", new int[] {1, 2}); |
| KeyphraseSoundModel ksm = new KeyphraseSoundModel(UUID.randomUUID(), UUID.randomUUID(), |
| null, keyphrases); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| ksm.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| KeyphraseSoundModel unparceled = KeyphraseSoundModel.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(ksm.uuid, unparceled.uuid); |
| assertNull(unparceled.data); |
| assertEquals(ksm.type, unparceled.type); |
| assertTrue(Arrays.equals(keyphrases, unparceled.keyphrases)); |
| } |
| |
| @SmallTest |
| public void testKeyphraseSoundModelParcelUnparcel_zeroData() throws Exception { |
| Keyphrase[] keyphrases = new Keyphrase[2]; |
| keyphrases[0] = new Keyphrase(1, 0, "en-US", "hello", new int[] {0}); |
| keyphrases[1] = new Keyphrase(2, 0, "fr-FR", "there", new int[] {1, 2}); |
| KeyphraseSoundModel ksm = new KeyphraseSoundModel(UUID.randomUUID(), UUID.randomUUID(), |
| new byte[0], keyphrases); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| ksm.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| KeyphraseSoundModel unparceled = KeyphraseSoundModel.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(ksm.uuid, unparceled.uuid); |
| assertEquals(ksm.type, unparceled.type); |
| assertTrue(Arrays.equals(ksm.keyphrases, unparceled.keyphrases)); |
| assertTrue(Arrays.equals(ksm.data, unparceled.data)); |
| } |
| |
| @SmallTest |
| public void testKeyphraseSoundModelParcelUnparcel_noKeyphrases() throws Exception { |
| byte[] data = new byte[10]; |
| mRandom.nextBytes(data); |
| KeyphraseSoundModel ksm = new KeyphraseSoundModel(UUID.randomUUID(), UUID.randomUUID(), |
| data, null); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| ksm.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| KeyphraseSoundModel unparceled = KeyphraseSoundModel.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(ksm.uuid, unparceled.uuid); |
| assertEquals(ksm.type, unparceled.type); |
| assertNull(unparceled.keyphrases); |
| assertTrue(Arrays.equals(ksm.data, unparceled.data)); |
| } |
| |
| @SmallTest |
| public void testKeyphraseSoundModelParcelUnparcel_zeroKeyphrases() throws Exception { |
| byte[] data = new byte[10]; |
| mRandom.nextBytes(data); |
| KeyphraseSoundModel ksm = new KeyphraseSoundModel(UUID.randomUUID(), UUID.randomUUID(), |
| data, new Keyphrase[0]); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| ksm.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| KeyphraseSoundModel unparceled = KeyphraseSoundModel.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(ksm.uuid, unparceled.uuid); |
| assertEquals(ksm.type, unparceled.type); |
| assertTrue(Arrays.equals(ksm.keyphrases, unparceled.keyphrases)); |
| assertTrue(Arrays.equals(ksm.data, unparceled.data)); |
| } |
| |
| @LargeTest |
| public void testKeyphraseSoundModelParcelUnparcel_largeData() throws Exception { |
| Keyphrase[] keyphrases = new Keyphrase[2]; |
| keyphrases[0] = new Keyphrase(1, 0, "en-US", "hello", new int[] {0}); |
| keyphrases[1] = new Keyphrase(2, 0, "fr-FR", "there", new int[] {1, 2}); |
| byte[] data = new byte[200 * 1024]; |
| mRandom.nextBytes(data); |
| KeyphraseSoundModel ksm = new KeyphraseSoundModel(UUID.randomUUID(), UUID.randomUUID(), |
| data, keyphrases); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| ksm.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| KeyphraseSoundModel unparceled = KeyphraseSoundModel.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(ksm.uuid, unparceled.uuid); |
| assertEquals(ksm.type, unparceled.type); |
| assertTrue(Arrays.equals(ksm.data, unparceled.data)); |
| assertTrue(Arrays.equals(ksm.keyphrases, unparceled.keyphrases)); |
| } |
| |
| @SmallTest |
| public void testRecognitionEventParcelUnparcel_noData() throws Exception { |
| RecognitionEvent re = new RecognitionEvent(SoundTrigger.RECOGNITION_STATUS_SUCCESS, 1, |
| true, 2, 3, 4, false, null, null); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| re.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| RecognitionEvent unparceled = RecognitionEvent.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(re, unparceled); |
| } |
| |
| @SmallTest |
| public void testRecognitionEventParcelUnparcel_zeroData() throws Exception { |
| RecognitionEvent re = new RecognitionEvent(SoundTrigger.RECOGNITION_STATUS_FAILURE, 1, |
| true, 2, 3, 4, false, null, new byte[1]); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| re.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| RecognitionEvent unparceled = RecognitionEvent.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(re, unparceled); |
| } |
| |
| @SmallTest |
| public void testRecognitionEventParcelUnparcel_largeData() throws Exception { |
| byte[] data = new byte[200 * 1024]; |
| mRandom.nextBytes(data); |
| RecognitionEvent re = new RecognitionEvent(SoundTrigger.RECOGNITION_STATUS_ABORT, 1, |
| false, 2, 3, 4, false, null, data); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| re.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| RecognitionEvent unparceled = RecognitionEvent.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(re, unparceled); |
| } |
| |
| @SmallTest |
| public void testRecognitionEventParcelUnparcel_largeAudioData() throws Exception { |
| byte[] data = new byte[200 * 1024]; |
| mRandom.nextBytes(data); |
| RecognitionEvent re = new RecognitionEvent(SoundTrigger.RECOGNITION_STATUS_ABORT, 1, |
| false, 2, 3, 4, true, |
| (new AudioFormat.Builder()) |
| .setChannelMask(AudioFormat.CHANNEL_IN_MONO) |
| .setEncoding(AudioFormat.ENCODING_PCM_16BIT) |
| .setSampleRate(16000) |
| .build(), |
| data); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| re.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| RecognitionEvent unparceled = RecognitionEvent.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(re, unparceled); |
| } |
| |
| @SmallTest |
| public void testKeyphraseRecognitionEventParcelUnparcel_noKeyphrases() throws Exception { |
| KeyphraseRecognitionEvent re = new KeyphraseRecognitionEvent( |
| SoundTrigger.RECOGNITION_STATUS_SUCCESS, 1, true, 2, 3, 4, false, null, null, null); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| re.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| KeyphraseRecognitionEvent unparceled = |
| KeyphraseRecognitionEvent.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(re, unparceled); |
| } |
| |
| @SmallTest |
| public void testKeyphraseRecognitionEventParcelUnparcel_zeroData() throws Exception { |
| KeyphraseRecognitionExtra[] kpExtra = new KeyphraseRecognitionExtra[0]; |
| KeyphraseRecognitionEvent re = new KeyphraseRecognitionEvent( |
| SoundTrigger.RECOGNITION_STATUS_FAILURE, 2, true, 2, 3, 4, false, null, new byte[1], |
| kpExtra); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| re.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| KeyphraseRecognitionEvent unparceled = |
| KeyphraseRecognitionEvent.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(re, unparceled); |
| } |
| |
| @LargeTest |
| public void testKeyphraseRecognitionEventParcelUnparcel_largeData() throws Exception { |
| byte[] data = new byte[200 * 1024]; |
| mRandom.nextBytes(data); |
| KeyphraseRecognitionExtra[] kpExtra = new KeyphraseRecognitionExtra[4]; |
| ConfidenceLevel cl1 = new ConfidenceLevel(1, 90); |
| ConfidenceLevel cl2 = new ConfidenceLevel(2, 30); |
| kpExtra[0] = new KeyphraseRecognitionExtra(1, |
| SoundTrigger.RECOGNITION_MODE_USER_IDENTIFICATION, 0, |
| new ConfidenceLevel[] {cl1, cl2}); |
| kpExtra[1] = new KeyphraseRecognitionExtra(1, |
| SoundTrigger.RECOGNITION_MODE_VOICE_TRIGGER, 0, |
| new ConfidenceLevel[] {cl2}); |
| kpExtra[2] = new KeyphraseRecognitionExtra(1, |
| SoundTrigger.RECOGNITION_MODE_VOICE_TRIGGER, 0, null); |
| kpExtra[3] = new KeyphraseRecognitionExtra(1, |
| SoundTrigger.RECOGNITION_MODE_VOICE_TRIGGER, 0, |
| new ConfidenceLevel[0]); |
| |
| KeyphraseRecognitionEvent re = new KeyphraseRecognitionEvent( |
| SoundTrigger.RECOGNITION_STATUS_FAILURE, 1, true, 2, 3, 4, false, null, data, |
| kpExtra); |
| |
| // Write to a parcel |
| Parcel parcel = Parcel.obtain(); |
| re.writeToParcel(parcel, 0); |
| |
| // Read from it |
| parcel.setDataPosition(0); |
| KeyphraseRecognitionEvent unparceled = |
| KeyphraseRecognitionEvent.CREATOR.createFromParcel(parcel); |
| |
| // Verify that they are the same |
| assertEquals(re, unparceled); |
| } |
| } |