blob: a782b4c4bab66df716a662f1e6fd071392127e26 [file] [log] [blame]
/*
* Copyright (C) 2018 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 com.android.textclassifier.downloader;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import com.android.textclassifier.common.base.TcLog;
import java.io.File;
import java.nio.file.Files;
import java.util.concurrent.CountDownLatch;
import javax.annotation.Nullable;
// TODO(licha): Find another way to test the service. (E.g. CtsTextClassifierService.java)
/** Test Service of IModelDownloaderService. */
public final class TestModelDownloaderService extends Service {
private static final String TAG = "TestModelDownloaderService";
public static final String GOOD_URI = "good_uri";
public static final String BAD_URI = "bad_uri";
public static final long BYTES_WRITTEN = 1L;
public static final int DOWNLOADER_LIB_ERROR_CODE = 500;
public static final String ERROR_MSG = "not good uri";
public enum DownloadResult {
SUCCEEDED,
FAILED,
DO_NOTHING
}
// Obviously this does not work when considering concurrency, but probably fine for test purpose
private static boolean boundBefore = false;
private static boolean boundNow = false;
private static CountDownLatch onBindInvokedLatch = new CountDownLatch(1);
private static CountDownLatch onUnbindInvokedLatch = new CountDownLatch(1);
private static boolean bindSucceed = false;
private static String expectedUrl = null;
private static DownloadResult downloadResult = DownloadResult.SUCCEEDED;
private static byte[] fileContent = null;
public static boolean hasEverBeenBound() {
return boundBefore;
}
public static boolean isBound() {
return boundNow;
}
public static CountDownLatch getOnBindInvokedLatch() {
return onBindInvokedLatch;
}
public static CountDownLatch getOnUnbindInvokedLatch() {
return onUnbindInvokedLatch;
}
public static void setBindSucceed(boolean bindSucceed) {
TestModelDownloaderService.bindSucceed = bindSucceed;
}
public static void setDownloadResult(
String url, DownloadResult result, @Nullable byte[] fileContent) {
TestModelDownloaderService.expectedUrl = url;
TestModelDownloaderService.downloadResult = result;
TestModelDownloaderService.fileContent = fileContent;
}
public static void reset() {
boundBefore = false;
boundNow = false;
onBindInvokedLatch = new CountDownLatch(1);
onUnbindInvokedLatch = new CountDownLatch(1);
bindSucceed = false;
}
@Override
public IBinder onBind(Intent intent) {
try {
if (bindSucceed) {
boundBefore = true;
boundNow = true;
return new TestModelDownloaderServiceImpl();
} else {
return null;
}
} finally {
onBindInvokedLatch.countDown();
}
}
@Override
public boolean onUnbind(Intent intent) {
try {
boundNow = false;
return false;
} finally {
onUnbindInvokedLatch.countDown();
}
}
private static final class TestModelDownloaderServiceImpl extends IModelDownloaderService.Stub {
@Override
public void download(String url, String targetFilePath, IModelDownloaderCallback callback) {
if (expectedUrl == null || !expectedUrl.equals(url)) {
throw new IllegalStateException("url does not match");
}
TcLog.d(TAG, String.format("Test Request: %s, %s, %s", url, targetFilePath, downloadResult));
try {
switch (downloadResult) {
case SUCCEEDED:
File targetFile = new File(targetFilePath);
targetFile.createNewFile();
Files.write(targetFile.toPath(), fileContent);
callback.onSuccess(BYTES_WRITTEN);
break;
case FAILED:
callback.onFailure(DOWNLOADER_LIB_ERROR_CODE, ERROR_MSG);
break;
case DO_NOTHING:
// Do nothing
}
} catch (Throwable t) {
// The test would timeout if failing to get the callback result
}
}
}
}