• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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