blob: 92be08f492a0e57a245b5eba9986fc1f1cf3d3cf [file] [log] [blame]
/*
* Copyright (C) 2015 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.google.appindexing.fetchasgoogle;
import com.google.api.services.fetchasgoogle_pa.model.Apk;
import com.google.api.services.fetchasgoogle_pa.model.ApkHolder;
import com.google.api.services.fetchasgoogle_pa.model.FetchResponse;
import com.intellij.mock.MockApplication;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import junit.framework.TestCase;
import java.io.File;
import java.io.IOException;
import static com.google.appindexing.fetchasgoogle.FetchAsGoogleTask.ErrorCode.*;
import static com.google.appindexing.fetchasgoogle.FetchAsGoogleTask.RequestType;
import static com.google.appindexing.fetchasgoogle.FetchAsGoogleTask.Status.FAIL;
import static com.google.appindexing.fetchasgoogle.FetchAsGoogleTask.Status.SUCCESS;
import static org.mockito.Mockito.*;
public class FetchAsGoogleTaskTest extends TestCase {
private FetchAsGoogleClient mockFetchAsGoogleClient;
private UploadedApkManager mockUploadedApkManager;
private FetchAsGoogleTask.Helper mockHelper;
private FetchAsGoogleTask myFetchAsGoogleTask;
private FetchAsGoogleTask myCheckAppIndexingTask;
private ApkHolder mockAPKHolder;
private Project mockProject;
private Module mockModule;
private File mockApkFile;
MyDisposable myDisposable = new MyDisposable();
private static final String DEEP_LINK = "http://example.com/path";
private static final String PACKAGE_ID = "com.example";
private static final String APP_ID = "2.3.3";
private static final byte[] APK_HASH_BYTES = new byte[]{1, 2, 3};
private static final ApkHolder APK_HOLDER = new ApkHolder();
private static final FetchResponse FETCH_RESPONSE = new FetchResponse();
@Override
protected void setUp() throws Exception {
super.setUp();
// Setup application and stuff in projects.
ApplicationManager.setApplication(new MockApplication(myDisposable), myDisposable);
// Setup project and mocks.
mockFetchAsGoogleClient = mock(FetchAsGoogleClient.class);
mockUploadedApkManager = mock(UploadedApkManager.class);
mockHelper = mock(FetchAsGoogleTask.Helper.class);
mockProject = mock(Project.class);
mockModule = mock(Module.class);
mockApkFile = mock(File.class);
myFetchAsGoogleTask = new FetchAsGoogleTask(mockProject, DEEP_LINK,
mockFetchAsGoogleClient, mockUploadedApkManager, mockHelper, true,
FetchAsGoogleTask.RequestType.APP_INDEXING);
myCheckAppIndexingTask = new FetchAsGoogleTask(mockProject, "", mockFetchAsGoogleClient, mockUploadedApkManager, mockHelper, false,
FetchAsGoogleTask.RequestType.PERSONAL_CONTENT_INDEXING_DEBUGGING);
APK_HOLDER.setApk(new Apk());
APK_HOLDER.getApk().setApkId(APP_ID);
APK_HOLDER.getApk().setPackageId(PACKAGE_ID);
when(mockApkFile.exists()).thenReturn(true);
when(mockHelper.buildApk()).thenReturn(true);
when(mockHelper.getApkFile()).thenReturn(mockApkFile);
when(mockHelper.getPackageId()).thenReturn(PACKAGE_ID);
when(mockUploadedApkManager.hashApk(mockApkFile)).thenReturn(APK_HASH_BYTES);
when(mockUploadedApkManager.getApkHolder(APK_HASH_BYTES)).thenReturn(null);
when(mockFetchAsGoogleClient.uploadApk(PACKAGE_ID, mockApkFile)).thenReturn(APK_HOLDER);
when(mockFetchAsGoogleClient.fetchAsGoogle(DEEP_LINK, PACKAGE_ID, APP_ID, FetchAsGoogleTask.RequestType.APP_INDEXING))
.thenReturn(FETCH_RESPONSE);
when(mockFetchAsGoogleClient.getAppIndexingErrorStats(PACKAGE_ID, FetchAsGoogleTask.RequestType.PERSONAL_CONTENT_INDEXING_DEBUGGING))
.thenReturn(FETCH_RESPONSE);
}
@Override
protected void tearDown() throws Exception {
try {
Disposer.dispose(myDisposable);
}
finally {
super.tearDown();
}
}
public void testSuccessTask() throws Exception {
myFetchAsGoogleTask.run();
verify(mockHelper).buildApk();
verify(mockHelper).getApkFile();
verify(mockHelper).getPackageId();
verify(mockUploadedApkManager).hashApk(mockApkFile);
verify(mockUploadedApkManager).getApkHolder(APK_HASH_BYTES);
verify(mockUploadedApkManager).addUploadedApk(APK_HASH_BYTES, APK_HOLDER);
verify(mockFetchAsGoogleClient).uploadApk(PACKAGE_ID, mockApkFile);
verify(mockFetchAsGoogleClient).fetchAsGoogle(DEEP_LINK, PACKAGE_ID, APP_ID, RequestType.APP_INDEXING);
assertEquals(SUCCESS, myFetchAsGoogleTask.getStatus());
}
public void testUploadedApk() throws Exception {
when(mockUploadedApkManager.getApkHolder(APK_HASH_BYTES)).thenReturn(APK_HOLDER);
myFetchAsGoogleTask.run();
verify(mockHelper).buildApk();
verify(mockHelper).getApkFile();
verify(mockHelper).getPackageId();
verify(mockUploadedApkManager).hashApk(mockApkFile);
verify(mockUploadedApkManager).getApkHolder(APK_HASH_BYTES);
verify(mockUploadedApkManager, never()).addUploadedApk(APK_HASH_BYTES, APK_HOLDER);
verify(mockFetchAsGoogleClient, never()).uploadApk(PACKAGE_ID, mockApkFile);
verify(mockFetchAsGoogleClient).fetchAsGoogle(DEEP_LINK, PACKAGE_ID, APP_ID, RequestType.APP_INDEXING);
assertEquals(SUCCESS, myFetchAsGoogleTask.getStatus());
}
public void testBuildFailed() throws Exception {
when(mockHelper.buildApk()).thenReturn(false);
myFetchAsGoogleTask.run();
verify(mockHelper).buildApk();
assertEquals(FAIL, myFetchAsGoogleTask.getStatus());
assertEquals(BUILD_APK_FAILED, myFetchAsGoogleTask.getErrorCode());
}
public void testApkFileNotFound() throws Exception {
when(mockApkFile.exists()).thenReturn(false);
myFetchAsGoogleTask.run();
verify(mockHelper).buildApk();
verify(mockHelper).getApkFile();
assertEquals(FAIL, myFetchAsGoogleTask.getStatus());
assertEquals(UPLOAD_APK_FAILED, myFetchAsGoogleTask.getErrorCode());
}
public void testPackageIdNotFound() throws Exception {
when(mockHelper.getPackageId()).thenReturn(null);
myFetchAsGoogleTask.run();
verify(mockHelper).buildApk();
verify(mockHelper).getApkFile();
verify(mockHelper).getPackageId();
assertEquals(FAIL, myFetchAsGoogleTask.getStatus());
assertEquals(UPLOAD_APK_FAILED, myFetchAsGoogleTask.getErrorCode());
}
public void testNetworkError() throws Exception {
when(mockFetchAsGoogleClient.fetchAsGoogle(DEEP_LINK, PACKAGE_ID, APP_ID, RequestType.APP_INDEXING))
.thenThrow(new IOException());
myFetchAsGoogleTask.run();
verify(mockHelper).buildApk();
verify(mockHelper).getApkFile();
verify(mockHelper).getPackageId();
verify(mockUploadedApkManager).hashApk(mockApkFile);
verify(mockUploadedApkManager).getApkHolder(APK_HASH_BYTES);
verify(mockUploadedApkManager).addUploadedApk(APK_HASH_BYTES, APK_HOLDER);
verify(mockFetchAsGoogleClient).uploadApk(PACKAGE_ID, mockApkFile);
verify(mockFetchAsGoogleClient).fetchAsGoogle(DEEP_LINK, PACKAGE_ID, APP_ID, RequestType.APP_INDEXING);
assertEquals(FAIL, myFetchAsGoogleTask.getStatus());
assertEquals(NETWORK_ERROR, myFetchAsGoogleTask.getErrorCode());
}
public void testUnknownError() throws Exception {
when(mockFetchAsGoogleClient.fetchAsGoogle(DEEP_LINK, PACKAGE_ID, APP_ID, RequestType.APP_INDEXING))
.thenThrow(new RuntimeException());
myFetchAsGoogleTask.run();
verify(mockHelper).buildApk();
verify(mockHelper).getApkFile();
verify(mockHelper).getPackageId();
verify(mockUploadedApkManager).hashApk(mockApkFile);
verify(mockUploadedApkManager).getApkHolder(APK_HASH_BYTES);
verify(mockUploadedApkManager).addUploadedApk(APK_HASH_BYTES, APK_HOLDER);
verify(mockFetchAsGoogleClient).uploadApk(PACKAGE_ID, mockApkFile);
verify(mockFetchAsGoogleClient).fetchAsGoogle(DEEP_LINK, PACKAGE_ID, APP_ID, RequestType.APP_INDEXING);
assertEquals(FAIL, myFetchAsGoogleTask.getStatus());
assertEquals(UNKNOWN, myFetchAsGoogleTask.getErrorCode());
}
public void testUploadFailed() throws Exception {
when(mockFetchAsGoogleClient.uploadApk(PACKAGE_ID, mockApkFile)).thenThrow(
new FetchAsGoogleClient.FetchAsGoogleException("Upload Failed", UPLOAD_APK_FAILED));
myFetchAsGoogleTask.run();
verify(mockHelper).buildApk();
verify(mockHelper).getApkFile();
verify(mockHelper).getPackageId();
verify(mockUploadedApkManager).hashApk(mockApkFile);
verify(mockUploadedApkManager).getApkHolder(APK_HASH_BYTES);
verify(mockUploadedApkManager, never()).addUploadedApk(APK_HASH_BYTES, APK_HOLDER);
verify(mockFetchAsGoogleClient).uploadApk(PACKAGE_ID, mockApkFile);
verify(mockFetchAsGoogleClient, never()).fetchAsGoogle(DEEP_LINK, PACKAGE_ID, APP_ID, RequestType.APP_INDEXING);
assertEquals(FAIL, myFetchAsGoogleTask.getStatus());
assertEquals(UPLOAD_APK_FAILED, myFetchAsGoogleTask.getErrorCode());
}
public void testFetchFailed() throws Exception {
when(mockFetchAsGoogleClient.fetchAsGoogle(DEEP_LINK, PACKAGE_ID, APP_ID, RequestType.APP_INDEXING)).thenThrow(
new FetchAsGoogleClient.FetchAsGoogleException("Fetch Failed", FETCH_RESULT_FAILED));
myFetchAsGoogleTask.run();
verify(mockHelper).buildApk();
verify(mockHelper).getApkFile();
verify(mockHelper).getPackageId();
verify(mockUploadedApkManager).hashApk(mockApkFile);
verify(mockUploadedApkManager).getApkHolder(APK_HASH_BYTES);
verify(mockUploadedApkManager).addUploadedApk(APK_HASH_BYTES, APK_HOLDER);
verify(mockFetchAsGoogleClient).uploadApk(PACKAGE_ID, mockApkFile);
verify(mockFetchAsGoogleClient).fetchAsGoogle(DEEP_LINK, PACKAGE_ID, APP_ID, RequestType.APP_INDEXING);
assertEquals(FAIL, myFetchAsGoogleTask.getStatus());
assertEquals(FETCH_RESULT_FAILED, myFetchAsGoogleTask.getErrorCode());
}
public void testURLNotSupportedException() throws Exception {
when(mockFetchAsGoogleClient.fetchAsGoogle(DEEP_LINK, PACKAGE_ID, APP_ID, RequestType.APP_INDEXING)).thenThrow(
new FetchAsGoogleClient.FetchAsGoogleException("Url Not Supported", URI_NOT_SUPPORTED));
myFetchAsGoogleTask.run();
verify(mockHelper).buildApk();
verify(mockHelper).getApkFile();
verify(mockHelper).getPackageId();
verify(mockUploadedApkManager).hashApk(mockApkFile);
verify(mockUploadedApkManager).getApkHolder(APK_HASH_BYTES);
verify(mockUploadedApkManager).addUploadedApk(APK_HASH_BYTES, APK_HOLDER);
verify(mockFetchAsGoogleClient).uploadApk(PACKAGE_ID, mockApkFile);
verify(mockFetchAsGoogleClient).fetchAsGoogle(DEEP_LINK, PACKAGE_ID, APP_ID, RequestType.APP_INDEXING);
assertEquals(FAIL, myFetchAsGoogleTask.getStatus());
assertEquals(URI_NOT_SUPPORTED, myFetchAsGoogleTask.getErrorCode());
}
public static class MyDisposable implements Disposable {
@Override
public void dispose() {
}
}
}