• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 
17 package android.telephony.embms.cts;
18 
19 import static androidx.test.InstrumentationRegistry.getContext;
20 
21 import static org.junit.Assert.assertEquals;
22 import static org.junit.Assert.assertNotNull;
23 import static org.junit.Assert.assertTrue;
24 import static org.junit.Assert.fail;
25 
26 import android.annotation.Nullable;
27 import android.content.ComponentName;
28 import android.content.Context;
29 import android.content.Intent;
30 import android.content.ServiceConnection;
31 import android.net.Uri;
32 import android.os.Bundle;
33 import android.os.Handler;
34 import android.os.HandlerThread;
35 import android.os.IBinder;
36 import android.os.RemoteException;
37 import android.telephony.MbmsDownloadSession;
38 import android.telephony.cts.embmstestapp.CtsDownloadService;
39 import android.telephony.cts.embmstestapp.ICtsDownloadMiddlewareControl;
40 import android.telephony.mbms.DownloadRequest;
41 import android.telephony.mbms.FileServiceInfo;
42 import android.telephony.mbms.MbmsDownloadSessionCallback;
43 import android.util.Log;
44 
45 import com.android.internal.os.SomeArgs;
46 
47 import java.io.File;
48 import java.util.List;
49 import java.util.concurrent.BlockingQueue;
50 import java.util.concurrent.CountDownLatch;
51 import java.util.concurrent.Executor;
52 import java.util.concurrent.LinkedBlockingQueue;
53 import java.util.concurrent.TimeUnit;
54 import java.util.stream.Collectors;
55 
56 import org.junit.After;
57 import org.junit.Before;
58 
59 public class MbmsDownloadTestBase {
60     protected static final int ASYNC_TIMEOUT = 10000;
61 
62     protected static class TestCallback extends MbmsDownloadSessionCallback {
63         private final BlockingQueue<SomeArgs> mErrorCalls = new LinkedBlockingQueue<>();
64         private final BlockingQueue<SomeArgs> mFileServicesUpdatedCalls =
65                 new LinkedBlockingQueue<>();
66         private final BlockingQueue<SomeArgs> mMiddlewareReadyCalls = new LinkedBlockingQueue<>();
67         private int mNumErrorCalls = 0;
68 
69         @Override
onError(int errorCode, @Nullable String message)70         public void onError(int errorCode, @Nullable String message) {
71             mNumErrorCalls += 1;
72             SomeArgs args = SomeArgs.obtain();
73             args.arg1 = errorCode;
74             args.arg2 = message;
75             mErrorCalls.add(args);
76             Log.i(MbmsDownloadTestBase.class.getSimpleName(),
77                     "Got error: " + errorCode + ": " + message);
78         }
79 
80         @Override
onFileServicesUpdated(List<FileServiceInfo> services)81         public void onFileServicesUpdated(List<FileServiceInfo> services) {
82             SomeArgs args = SomeArgs.obtain();
83             args.arg1 = services;
84             mFileServicesUpdatedCalls.add(args);
85         }
86 
87         @Override
onMiddlewareReady()88         public void onMiddlewareReady() {
89             mMiddlewareReadyCalls.add(SomeArgs.obtain());
90         }
91 
waitOnError()92         public SomeArgs waitOnError() {
93             try {
94                 return mErrorCalls.poll(ASYNC_TIMEOUT, TimeUnit.MILLISECONDS);
95             } catch (InterruptedException e) {
96                 return null;
97             }
98         }
99 
waitOnMiddlewareReady()100         public boolean waitOnMiddlewareReady() {
101             try {
102                 return mMiddlewareReadyCalls.poll(ASYNC_TIMEOUT, TimeUnit.MILLISECONDS) != null;
103             } catch (InterruptedException e) {
104                 return false;
105             }
106         }
107 
waitOnFileServicesUpdated()108         public SomeArgs waitOnFileServicesUpdated() {
109             try {
110                 return mFileServicesUpdatedCalls.poll(ASYNC_TIMEOUT, TimeUnit.MILLISECONDS);
111             } catch (InterruptedException e) {
112                 return null;
113             }
114         }
115 
getNumErrorCalls()116         public int getNumErrorCalls() {
117             return mNumErrorCalls;
118         }
119     }
120 
121     DownloadRequest.Builder downloadRequestTemplate;
122     Uri destinationDirectoryUri;
123 
124     Context mContext;
125     HandlerThread mHandlerThread;
126     Handler mHandler;
127     Executor mCallbackExecutor;
128     ICtsDownloadMiddlewareControl mMiddlewareControl;
129     MbmsDownloadSession mDownloadSession;
130     TestCallback mCallback = new TestCallback();
131 
132     @Before
setUp()133     public void setUp() throws Exception {
134         mContext = getContext();
135         mHandlerThread = new HandlerThread("EmbmsCtsTestWorker");
136         mHandlerThread.start();
137         mHandler = new Handler(mHandlerThread.getLooper());
138         mCallbackExecutor = mHandler::post;
139         mCallback = new TestCallback();
140 
141         File destinationDirectory = new File(mContext.getFilesDir(), "downloads");
142         destinationDirectory.mkdirs();
143         destinationDirectoryUri = Uri.fromFile(destinationDirectory);
144         downloadRequestTemplate = new DownloadRequest.Builder(
145                 CtsDownloadService.SOURCE_URI_1, destinationDirectoryUri)
146                 .setServiceInfo(CtsDownloadService.FILE_SERVICE_INFO);
147         getControlBinder();
148         setupDownloadSession();
149     }
150 
151     @After
tearDown()152     public void tearDown() throws Exception {
153         mHandlerThread.quit();
154         mDownloadSession.close();
155         mMiddlewareControl.reset();
156     }
157 
setupDownloadSession()158     private void setupDownloadSession() throws Exception {
159         mDownloadSession = MbmsDownloadSession.create(
160                 mContext, mCallbackExecutor, mCallback);
161         assertNotNull(mDownloadSession);
162         assertTrue(mCallback.waitOnMiddlewareReady());
163         assertEquals(0, mCallback.getNumErrorCalls());
164         Bundle initializeCall =  mMiddlewareControl.getDownloadSessionCalls().get(0);
165         assertEquals(CtsDownloadService.METHOD_INITIALIZE,
166                 initializeCall.getString(CtsDownloadService.METHOD_NAME));
167     }
168 
getControlBinder()169     private void getControlBinder() throws InterruptedException {
170         Intent bindIntent = new Intent(CtsDownloadService.CONTROL_INTERFACE_ACTION);
171         bindIntent.setComponent(CtsDownloadService.CONTROL_INTERFACE_COMPONENT);
172         final CountDownLatch bindLatch = new CountDownLatch(1);
173 
174         boolean success = mContext.bindService(bindIntent, new ServiceConnection() {
175             @Override
176             public void onServiceConnected(ComponentName name, IBinder service) {
177                 mMiddlewareControl = ICtsDownloadMiddlewareControl.Stub.asInterface(service);
178                 bindLatch.countDown();
179             }
180 
181             @Override
182             public void onServiceDisconnected(ComponentName name) {
183                 mMiddlewareControl = null;
184             }
185         }, Context.BIND_AUTO_CREATE);
186         if (!success) {
187             fail("Failed to get control interface -- bind error");
188         }
189         bindLatch.await(ASYNC_TIMEOUT, TimeUnit.MILLISECONDS);
190     }
191 
getMiddlewareCalls(String methodName)192     protected List<Bundle> getMiddlewareCalls(String methodName) throws RemoteException {
193         return (mMiddlewareControl.getDownloadSessionCalls()).stream()
194                 .filter((elem) -> elem.getString(CtsDownloadService.METHOD_NAME).equals(methodName))
195                 .collect(Collectors.toList());
196     }
197 
recursiveDelete(File f)198     protected static void recursiveDelete(File f) {
199         if (f.isDirectory()) {
200             for (File f1 : f.listFiles()) {
201                 recursiveDelete(f1);
202             }
203         }
204         f.delete();
205     }
206 }