use of com.microsoft.appcenter.http.HttpClientNetworkStateHandler in project mobile-center-sdk-android by Microsoft.
the class Distribute method getLatestReleaseDetails.
/**
* Get latest release details from server.
*
* @param distributionGroupId distribution group id.
* @param updateToken token to secure API call.
*/
@VisibleForTesting
synchronized void getLatestReleaseDetails(String distributionGroupId, String updateToken) {
AppCenterLog.debug(LOG_TAG, "Get latest release details...");
HttpClientRetryer retryer = new HttpClientRetryer(new DefaultHttpClient());
NetworkStateHelper networkStateHelper = NetworkStateHelper.getSharedInstance(mContext);
HttpClient httpClient = new HttpClientNetworkStateHandler(retryer, networkStateHelper);
String releaseHash = computeReleaseHash(mPackageInfo);
String url = mApiUrl;
if (updateToken == null) {
url += String.format(GET_LATEST_PUBLIC_RELEASE_PATH_FORMAT, mAppSecret, distributionGroupId, releaseHash, getReportingParametersForUpdatedRelease(true, ""));
} else {
url += String.format(GET_LATEST_PRIVATE_RELEASE_PATH_FORMAT, mAppSecret, releaseHash, getReportingParametersForUpdatedRelease(false, distributionGroupId));
}
Map<String, String> headers = new HashMap<>();
if (updateToken != null) {
headers.put(HEADER_API_TOKEN, updateToken);
}
final Object releaseCallId = mCheckReleaseCallId = new Object();
mCheckReleaseApiCall = httpClient.callAsync(url, METHOD_GET, headers, new HttpClient.CallTemplate() {
@Override
public String buildRequestBody() throws JSONException {
/* Only GET is used by Distribute service. This method is never getting called. */
return null;
}
@Override
public void onBeforeCalling(URL url, Map<String, String> headers) {
if (AppCenterLog.getLogLevel() <= VERBOSE) {
/* Log url. */
String urlString = url.toString().replaceAll(mAppSecret, HttpUtils.hideSecret(mAppSecret));
AppCenterLog.verbose(LOG_TAG, "Calling " + urlString + "...");
/* Log headers. */
Map<String, String> logHeaders = new HashMap<>(headers);
String apiToken = logHeaders.get(HEADER_API_TOKEN);
if (apiToken != null) {
logHeaders.put(HEADER_API_TOKEN, HttpUtils.hideSecret(apiToken));
}
AppCenterLog.verbose(LOG_TAG, "Headers: " + logHeaders);
}
}
}, new ServiceCallback() {
@Override
public void onCallSucceeded(final String payload) {
/* onPostExecute is not always called on UI thread due to an old Android bug. */
HandlerUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
handleApiCallSuccess(releaseCallId, payload, ReleaseDetails.parse(payload));
} catch (JSONException e) {
onCallFailed(e);
}
}
});
}
@Override
public void onCallFailed(Exception e) {
handleApiCallFailure(releaseCallId, e);
}
});
}
use of com.microsoft.appcenter.http.HttpClientNetworkStateHandler in project mobile-center-sdk-android by Microsoft.
the class DistributeBeforeApiSuccessTest method happyPathUntilHangingCallWithToken.
@Test
public void happyPathUntilHangingCallWithToken() throws Exception {
/* Setup mock. */
HttpClientNetworkStateHandler httpClient = mock(HttpClientNetworkStateHandler.class);
whenNew(HttpClientNetworkStateHandler.class).withAnyArguments().thenReturn(httpClient);
UUID requestId = UUID.randomUUID();
when(UUIDUtils.randomUUID()).thenReturn(requestId);
when(PreferencesStorage.getString(PREFERENCE_KEY_REQUEST_ID)).thenReturn(requestId.toString());
when(mPackageManager.getPackageInfo(DistributeUtils.TESTER_APP_PACKAGE_NAME, 0)).thenThrow(new PackageManager.NameNotFoundException());
/* Mock install id from AppCenter. */
UUID installId = UUID.randomUUID();
when(mAppCenterFuture.get()).thenReturn(installId);
when(AppCenter.getInstallId()).thenReturn(mAppCenterFuture);
/* Start and resume: open browser. */
start();
Distribute.getInstance().onActivityResumed(mActivity);
verifyStatic();
String url = DistributeConstants.DEFAULT_INSTALL_URL;
url += String.format(UPDATE_SETUP_PATH_FORMAT, "a");
url += "?" + PARAMETER_RELEASE_HASH + "=" + TEST_HASH;
url += "&" + PARAMETER_REDIRECT_ID + "=" + mContext.getPackageName();
url += "&" + PARAMETER_REDIRECT_SCHEME + "=" + "appcenter";
url += "&" + PARAMETER_REQUEST_ID + "=" + requestId.toString();
url += "&" + PARAMETER_PLATFORM + "=" + PARAMETER_PLATFORM_VALUE;
url += "&" + PARAMETER_ENABLE_UPDATE_SETUP_FAILURE_REDIRECT_KEY + "=" + "true";
url += "&" + PARAMETER_INSTALL_ID + "=" + installId.toString();
BrowserUtils.openBrowser(url, mActivity);
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_REQUEST_ID, requestId.toString());
/* If browser already opened, activity changed must not recall it. */
Distribute.getInstance().onActivityPaused(mActivity);
Distribute.getInstance().onActivityResumed(mActivity);
verifyStatic();
BrowserUtils.openBrowser(url, mActivity);
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_REQUEST_ID, requestId.toString());
/* Store token. */
Distribute.getInstance().storeRedirectionParameters(requestId.toString(), "g", "some token");
/* Verify behavior. */
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_UPDATE_TOKEN, "some token");
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_DISTRIBUTION_GROUP_ID, "g");
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_REQUEST_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_STATE);
verify(mDistributeInfoTracker).updateDistributionGroupId("g");
HashMap<String, String> headers = new HashMap<>();
headers.put(DistributeConstants.HEADER_API_TOKEN, "some token");
verify(httpClient).callAsync(argThat(new ArgumentMatcher<String>() {
@Override
public boolean matches(Object argument) {
return argument.toString().startsWith(DistributeConstants.DEFAULT_API_URL);
}
}), anyString(), eq(headers), any(HttpClient.CallTemplate.class), any(ServiceCallback.class));
/* If call already made, activity changed must not recall it. */
Distribute.getInstance().onActivityPaused(mActivity);
Distribute.getInstance().onActivityResumed(mActivity);
/* Verify behavior. */
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_UPDATE_TOKEN, "some token");
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_DISTRIBUTION_GROUP_ID, "g");
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_REQUEST_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_STATE);
verify(mDistributeInfoTracker).updateDistributionGroupId("g");
verify(httpClient).callAsync(argThat(new ArgumentMatcher<String>() {
@Override
public boolean matches(Object argument) {
return argument.toString().startsWith(DistributeConstants.DEFAULT_API_URL);
}
}), anyString(), eq(headers), any(HttpClient.CallTemplate.class), any(ServiceCallback.class));
/* Call is still in progress. If we restart app, nothing happens we still wait. */
restartResumeLauncher(mActivity);
/* Verify behavior not changed. */
verifyStatic();
BrowserUtils.openBrowser(url, mActivity);
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_UPDATE_TOKEN, "some token");
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_DISTRIBUTION_GROUP_ID, "g");
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_REQUEST_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_STATE);
verify(mDistributeInfoTracker).updateDistributionGroupId("g");
verify(httpClient).callAsync(argThat(new ArgumentMatcher<String>() {
@Override
public boolean matches(Object argument) {
return argument.toString().startsWith(DistributeConstants.DEFAULT_API_URL);
}
}), anyString(), eq(headers), any(HttpClient.CallTemplate.class), any(ServiceCallback.class));
/* If process is restarted, a new call will be made. Need to mock storage for that. */
when(PreferencesStorage.getString(PREFERENCE_KEY_DISTRIBUTION_GROUP_ID)).thenReturn("g");
when(PreferencesStorage.getString(PREFERENCE_KEY_UPDATE_TOKEN)).thenReturn("some token");
restartProcessAndSdk();
Distribute.getInstance().onActivityResumed(mActivity);
verify(httpClient, times(2)).callAsync(argThat(new ArgumentMatcher<String>() {
@Override
public boolean matches(Object argument) {
return argument.toString().startsWith(DistributeConstants.DEFAULT_API_URL);
}
}), anyString(), eq(headers), any(HttpClient.CallTemplate.class), any(ServiceCallback.class));
}
use of com.microsoft.appcenter.http.HttpClientNetworkStateHandler in project mobile-center-sdk-android by Microsoft.
the class DistributeBeforeApiSuccessTest method storeBetterEncryptedToken.
@Test
public void storeBetterEncryptedToken() throws Exception {
/* Mock we already have token. */
when(PreferencesStorage.getString(PREFERENCE_KEY_UPDATE_TOKEN)).thenReturn("some encrypted token");
when(mCryptoUtils.decrypt(eq("some encrypted token"), anyBoolean())).thenReturn(new CryptoUtils.DecryptedData("some token", "some better encrypted token"));
HttpClientNetworkStateHandler httpClient = mock(HttpClientNetworkStateHandler.class);
whenNew(HttpClientNetworkStateHandler.class).withAnyArguments().thenReturn(httpClient);
HashMap<String, String> headers = new HashMap<>();
headers.put(DistributeConstants.HEADER_API_TOKEN, "some token");
/* Trigger call. */
start();
Distribute.getInstance().onActivityResumed(mock(Activity.class));
verify(httpClient).callAsync(anyString(), anyString(), eq(headers), any(HttpClient.CallTemplate.class), any(ServiceCallback.class));
/* Verify storage was updated with new encrypted value. */
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_UPDATE_TOKEN, "some better encrypted token");
}
use of com.microsoft.appcenter.http.HttpClientNetworkStateHandler in project mobile-center-sdk-android by Microsoft.
the class DistributeBeforeApiSuccessTest method storePublicRedirectionBeforeStart.
@Test
public void storePublicRedirectionBeforeStart() throws Exception {
/* Setup mock. */
when(PreferencesStorage.getString(PREFERENCE_KEY_REQUEST_ID)).thenReturn("r");
HttpClientNetworkStateHandler httpClient = mock(HttpClientNetworkStateHandler.class);
whenNew(HttpClientNetworkStateHandler.class).withAnyArguments().thenReturn(httpClient);
/* Store token before start, start in background, no storage access. */
Distribute.getInstance().storeRedirectionParameters("r", "g", null);
start();
verifyStatic(never());
PreferencesStorage.putString(anyString(), anyString());
verifyStatic(never());
PreferencesStorage.remove(anyString());
/* Unlock the processing by going into foreground. */
Distribute.getInstance().onActivityResumed(mock(Activity.class));
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_UPDATE_TOKEN);
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_DISTRIBUTION_GROUP_ID, "g");
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_REQUEST_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_STATE);
verify(mDistributeInfoTracker).updateDistributionGroupId("g");
HashMap<String, String> headers = new HashMap<>();
verify(httpClient).callAsync(anyString(), anyString(), eq(headers), any(HttpClient.CallTemplate.class), any(ServiceCallback.class));
}
use of com.microsoft.appcenter.http.HttpClientNetworkStateHandler in project mobile-center-sdk-android by Microsoft.
the class DistributeBeforeApiSuccessTest method happyPathUntilHangingCallWithoutToken.
@Test
public void happyPathUntilHangingCallWithoutToken() throws Exception {
/* Setup mock. */
HttpClientNetworkStateHandler httpClient = mock(HttpClientNetworkStateHandler.class);
whenNew(HttpClientNetworkStateHandler.class).withAnyArguments().thenReturn(httpClient);
UUID requestId = UUID.randomUUID();
when(UUIDUtils.randomUUID()).thenReturn(requestId);
when(PreferencesStorage.getString(PREFERENCE_KEY_REQUEST_ID)).thenReturn(requestId.toString());
when(mPackageManager.getPackageInfo(DistributeUtils.TESTER_APP_PACKAGE_NAME, 0)).thenThrow(new PackageManager.NameNotFoundException());
/* Mock install id from AppCenter. */
UUID installId = UUID.randomUUID();
when(mAppCenterFuture.get()).thenReturn(installId);
when(AppCenter.getInstallId()).thenReturn(mAppCenterFuture);
/* Start and resume: open browser. */
start();
Distribute.getInstance().onActivityResumed(mActivity);
verifyStatic();
String url = DistributeConstants.DEFAULT_INSTALL_URL;
url += String.format(UPDATE_SETUP_PATH_FORMAT, "a");
url += "?" + PARAMETER_RELEASE_HASH + "=" + TEST_HASH;
url += "&" + PARAMETER_REDIRECT_ID + "=" + mContext.getPackageName();
url += "&" + PARAMETER_REDIRECT_SCHEME + "=" + "appcenter";
url += "&" + PARAMETER_REQUEST_ID + "=" + requestId.toString();
url += "&" + PARAMETER_PLATFORM + "=" + PARAMETER_PLATFORM_VALUE;
url += "&" + PARAMETER_ENABLE_UPDATE_SETUP_FAILURE_REDIRECT_KEY + "=" + "true";
url += "&" + PARAMETER_INSTALL_ID + "=" + installId.toString();
BrowserUtils.openBrowser(url, mActivity);
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_REQUEST_ID, requestId.toString());
/* If browser already opened, activity changed must not recall it. */
Distribute.getInstance().onActivityPaused(mActivity);
Distribute.getInstance().onActivityResumed(mActivity);
verifyStatic();
BrowserUtils.openBrowser(url, mActivity);
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_REQUEST_ID, requestId.toString());
/* Store token. */
Distribute.getInstance().storeRedirectionParameters(requestId.toString(), "g", null);
/* Verify behavior. */
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_UPDATE_TOKEN);
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_DISTRIBUTION_GROUP_ID, "g");
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_REQUEST_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_STATE);
verify(mDistributeInfoTracker).updateDistributionGroupId("g");
HashMap<String, String> headers = new HashMap<>();
verify(httpClient).callAsync(argThat(new ArgumentMatcher<String>() {
@Override
public boolean matches(Object argument) {
return argument.toString().startsWith(DistributeConstants.DEFAULT_API_URL);
}
}), anyString(), eq(headers), any(HttpClient.CallTemplate.class), any(ServiceCallback.class));
/* If call already made, activity changed must not recall it. */
Distribute.getInstance().onActivityPaused(mActivity);
Distribute.getInstance().onActivityResumed(mActivity);
/* Verify behavior. */
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_UPDATE_TOKEN);
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_DISTRIBUTION_GROUP_ID, "g");
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_REQUEST_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_STATE);
verify(mDistributeInfoTracker).updateDistributionGroupId("g");
verify(httpClient).callAsync(argThat(new ArgumentMatcher<String>() {
@Override
public boolean matches(Object argument) {
return argument.toString().startsWith(DistributeConstants.DEFAULT_API_URL);
}
}), anyString(), eq(headers), any(HttpClient.CallTemplate.class), any(ServiceCallback.class));
/* Call is still in progress. If we restart app, nothing happens we still wait. */
restartResumeLauncher(mActivity);
/* Verify behavior not changed. */
verifyStatic();
BrowserUtils.openBrowser(url, mActivity);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_UPDATE_TOKEN);
verifyStatic();
PreferencesStorage.putString(PREFERENCE_KEY_DISTRIBUTION_GROUP_ID, "g");
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_REQUEST_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_ID);
verifyStatic();
PreferencesStorage.remove(PREFERENCE_KEY_DOWNLOAD_STATE);
verify(mDistributeInfoTracker).updateDistributionGroupId("g");
verify(httpClient).callAsync(argThat(new ArgumentMatcher<String>() {
@Override
public boolean matches(Object argument) {
return argument.toString().startsWith(DistributeConstants.DEFAULT_API_URL);
}
}), anyString(), eq(headers), any(HttpClient.CallTemplate.class), any(ServiceCallback.class));
/* If process is restarted, a new call will be made. Need to mock storage for that. */
when(PreferencesStorage.getString(PREFERENCE_KEY_DISTRIBUTION_GROUP_ID)).thenReturn("g");
restartProcessAndSdk();
Distribute.getInstance().onActivityResumed(mActivity);
verify(httpClient, times(2)).callAsync(argThat(new ArgumentMatcher<String>() {
@Override
public boolean matches(Object argument) {
return argument.toString().startsWith(DistributeConstants.DEFAULT_API_URL);
}
}), anyString(), eq(headers), any(HttpClient.CallTemplate.class), any(ServiceCallback.class));
}
Aggregations