1 package org.robolectric.shadows; 2 3 import static androidx.test.core.app.ApplicationProvider.getApplicationContext; 4 import static com.google.common.truth.Truth.assertThat; 5 import static org.mockito.Mockito.times; 6 import static org.mockito.Mockito.verify; 7 8 import android.app.Activity; 9 import android.app.wearable.WearableSensingManager; 10 import android.content.Context; 11 import android.os.ParcelFileDescriptor; 12 import android.os.PersistableBundle; 13 import android.os.SharedMemory; 14 import com.google.common.util.concurrent.MoreExecutors; 15 import java.util.concurrent.Executor; 16 import java.util.function.Consumer; 17 import org.junit.Rule; 18 import org.junit.Test; 19 import org.junit.runner.RunWith; 20 import org.mockito.Mock; 21 import org.mockito.junit.MockitoJUnit; 22 import org.mockito.junit.MockitoRule; 23 import org.robolectric.Robolectric; 24 import org.robolectric.RobolectricTestRunner; 25 import org.robolectric.RuntimeEnvironment; 26 import org.robolectric.android.controller.ActivityController; 27 import org.robolectric.annotation.Config; 28 import org.robolectric.shadow.api.Shadow; 29 import org.robolectric.versioning.AndroidVersions.U; 30 import org.robolectric.versioning.AndroidVersions.V; 31 32 /** Unit test for ShadowWearableSensingManager. */ 33 @Config(minSdk = U.SDK_INT) 34 @RunWith(RobolectricTestRunner.class) 35 public class ShadowWearableSensingManagerTest { 36 37 @Rule public final MockitoRule mockito = MockitoJUnit.rule(); 38 39 @Mock private Consumer<Integer> callback; 40 41 @Test provideDataStream()42 public void provideDataStream() throws Exception { 43 WearableSensingManager wearableSensingManager = 44 (WearableSensingManager) 45 getApplicationContext().getSystemService(Context.WEARABLE_SENSING_SERVICE); 46 ShadowWearableSensingManager shadowWearableSensingManager = 47 Shadow.extract(wearableSensingManager); 48 49 ParcelFileDescriptor[] descriptors = ParcelFileDescriptor.createPipe(); 50 shadowWearableSensingManager.setProvideDataStreamResult( 51 WearableSensingManager.STATUS_ACCESS_DENIED); 52 53 wearableSensingManager.provideDataStream( 54 descriptors[0], MoreExecutors.directExecutor(), callback); 55 56 verify(callback).accept(WearableSensingManager.STATUS_ACCESS_DENIED); 57 assertThat(shadowWearableSensingManager.getLastParcelFileDescriptor()) 58 .isSameInstanceAs(descriptors[0]); 59 } 60 61 @Test provideData()62 public void provideData() throws Exception { 63 WearableSensingManager wearableSensingManager = 64 (WearableSensingManager) 65 getApplicationContext().getSystemService(Context.WEARABLE_SENSING_SERVICE); 66 ShadowWearableSensingManager shadowWearableSensingManager = 67 Shadow.extract(wearableSensingManager); 68 69 PersistableBundle persistableBundle1 = new PersistableBundle(); 70 PersistableBundle persistableBundle2 = new PersistableBundle(); 71 SharedMemory sharedMemory1 = SharedMemory.create("name1", 100); 72 SharedMemory sharedMemory2 = SharedMemory.create("name2", 200); 73 shadowWearableSensingManager.setProvideDataResult(WearableSensingManager.STATUS_ACCESS_DENIED); 74 75 wearableSensingManager.provideData( 76 persistableBundle1, sharedMemory1, MoreExecutors.directExecutor(), callback); 77 wearableSensingManager.provideData( 78 persistableBundle2, sharedMemory2, MoreExecutors.directExecutor(), callback); 79 80 verify(callback, times(2)).accept(WearableSensingManager.STATUS_ACCESS_DENIED); 81 assertThat(shadowWearableSensingManager.getLastDataBundle()) 82 .isSameInstanceAs(persistableBundle2); 83 assertThat(shadowWearableSensingManager.getLastSharedMemory()).isSameInstanceAs(sharedMemory2); 84 assertThat(shadowWearableSensingManager.getAllDataBundles()) 85 .containsExactly(persistableBundle1, persistableBundle2); 86 assertThat(shadowWearableSensingManager.getAllSharedMemories()) 87 .containsExactly(sharedMemory1, sharedMemory2); 88 } 89 90 @Test 91 @Config(minSdk = V.SDK_INT) startHotwordRecognition()92 public void startHotwordRecognition() throws Exception { 93 WearableSensingManager wearableSensingManager = 94 (WearableSensingManager) 95 getApplicationContext().getSystemService(Context.WEARABLE_SENSING_SERVICE); 96 97 wearableSensingManager.startHotwordRecognition(null, MoreExecutors.directExecutor(), callback); 98 99 verify(callback).accept(WearableSensingManager.STATUS_SUCCESS); 100 } 101 102 @Test 103 @Config(minSdk = V.SDK_INT) stopHotwordRecognition()104 public void stopHotwordRecognition() throws Exception { 105 WearableSensingManager wearableSensingManager = 106 (WearableSensingManager) 107 getApplicationContext().getSystemService(Context.WEARABLE_SENSING_SERVICE); 108 wearableSensingManager.startHotwordRecognition(null, MoreExecutors.directExecutor(), callback); 109 110 wearableSensingManager.stopHotwordRecognition(MoreExecutors.directExecutor(), callback); 111 112 verify(callback, times(2)).accept(WearableSensingManager.STATUS_SUCCESS); 113 } 114 115 @Test getLastDataBundle_noDataProvided_doesNotThrow()116 public void getLastDataBundle_noDataProvided_doesNotThrow() throws Exception { 117 WearableSensingManager wearableSensingManager = 118 (WearableSensingManager) 119 getApplicationContext().getSystemService(Context.WEARABLE_SENSING_SERVICE); 120 ShadowWearableSensingManager shadowWearableSensingManager = 121 Shadow.extract(wearableSensingManager); 122 123 shadowWearableSensingManager.getLastDataBundle(); 124 } 125 126 @Test getLastSharedMemory_noDataProvided_doesNotThrow()127 public void getLastSharedMemory_noDataProvided_doesNotThrow() throws Exception { 128 WearableSensingManager wearableSensingManager = 129 (WearableSensingManager) 130 getApplicationContext().getSystemService(Context.WEARABLE_SENSING_SERVICE); 131 ShadowWearableSensingManager shadowWearableSensingManager = 132 Shadow.extract(wearableSensingManager); 133 134 shadowWearableSensingManager.getLastSharedMemory(); 135 } 136 137 @Test 138 @Config(minSdk = V.SDK_INT) setStartHotwordRecognitionResult()139 public void setStartHotwordRecognitionResult() throws Exception { 140 WearableSensingManager wearableSensingManager = 141 (WearableSensingManager) 142 getApplicationContext().getSystemService(Context.WEARABLE_SENSING_SERVICE); 143 ShadowWearableSensingManager shadowWearableSensingManager = 144 Shadow.extract(wearableSensingManager); 145 shadowWearableSensingManager.setStartHotwordRecognitionResult( 146 WearableSensingManager.STATUS_ACCESS_DENIED); 147 148 wearableSensingManager.startHotwordRecognition(null, MoreExecutors.directExecutor(), callback); 149 150 verify(callback).accept(WearableSensingManager.STATUS_ACCESS_DENIED); 151 } 152 153 @Test 154 @Config(minSdk = V.SDK_INT) setStopHotwordRecognitionResult()155 public void setStopHotwordRecognitionResult() throws Exception { 156 WearableSensingManager wearableSensingManager = 157 (WearableSensingManager) 158 getApplicationContext().getSystemService(Context.WEARABLE_SENSING_SERVICE); 159 ShadowWearableSensingManager shadowWearableSensingManager = 160 Shadow.extract(wearableSensingManager); 161 shadowWearableSensingManager.setStopHotwordRecognitionResult( 162 WearableSensingManager.STATUS_ACCESS_DENIED); 163 164 wearableSensingManager.stopHotwordRecognition(MoreExecutors.directExecutor(), callback); 165 166 verify(callback).accept(WearableSensingManager.STATUS_ACCESS_DENIED); 167 } 168 169 @Test wearableSensingManager_activityContextEnabled_differentInstancesProvideDataStream()170 public void wearableSensingManager_activityContextEnabled_differentInstancesProvideDataStream() { 171 String originalProperty = System.getProperty("robolectric.createActivityContexts", ""); 172 System.setProperty("robolectric.createActivityContexts", "true"); 173 try (ActivityController<Activity> controller = 174 Robolectric.buildActivity(Activity.class).setup()) { 175 WearableSensingManager applicationWearableSensingManager = 176 RuntimeEnvironment.getApplication().getSystemService(WearableSensingManager.class); 177 Activity activity = controller.get(); 178 WearableSensingManager activityWearableSensingManager = 179 activity.getSystemService(WearableSensingManager.class); 180 181 assertThat(applicationWearableSensingManager) 182 .isNotSameInstanceAs(activityWearableSensingManager); 183 184 ParcelFileDescriptor applicationPfd = 185 ParcelFileDescriptor.adoptFd(-1); // Placeholder descriptor 186 ParcelFileDescriptor activityPfd = ParcelFileDescriptor.adoptFd(-1); // Placeholder descriptor 187 Executor executor = Runnable::run; // Simple executor for test purposes 188 189 final int[] applicationStatus = new int[1]; 190 final int[] activityStatus = new int[1]; 191 192 Consumer<Integer> applicationStatusConsumer = status -> applicationStatus[0] = status; 193 Consumer<Integer> activityStatusConsumer = status -> activityStatus[0] = status; 194 195 applicationWearableSensingManager.provideDataStream( 196 applicationPfd, executor, applicationStatusConsumer); 197 activityWearableSensingManager.provideDataStream( 198 activityPfd, executor, activityStatusConsumer); 199 200 assertThat(activityStatus[0]).isEqualTo(applicationStatus[0]); 201 } finally { 202 System.setProperty("robolectric.createActivityContexts", originalProperty); 203 } 204 } 205 } 206