@Test public void initial_service_notActivated_status_notAvailable() { assertThat(new ManagedCloudSdkService().getStatus()).isEqualTo(SdkStatus.NOT_AVAILABLE); }
/** Creates managed SDK, installs if necessary, and checks for fatal errors. */ @VisibleForTesting void initManagedSdk() { try { managedCloudSdk = createManagedSdk(); // do not install SDK on activation if user cancelled installation once. if (!CloudSdkServiceUserSettings.getInstance().isUserCancelledInstallation()) { install(); } } catch (UnsupportedOsException ex) { logger.warn("Unsupported OS for Managed Cloud SDK", ex); updateStatus(SdkStatus.NOT_AVAILABLE); ManagedCloudSdkServiceUiPresenter.getInstance() .notifyManagedSdkJobFailure( ManagedSdkJobType.INSTALL, CloudSdkMessageBundle.message("managedsdk.unsupported.os")); } }
@Test public void initial_service_notActivated_path_isNull() { assertThat((Object) new ManagedCloudSdkService().getSdkHomePath()).isNull(); }
private void updateStatus(SdkStatus sdkStatus) { // may be called from install job thread, make sure listeners receive update on UI thread. invokeOnApplicationUIThread( () -> { this.sdkStatus = sdkStatus; notifyListeners(this, sdkStatus); }); }
@Override public void activate() { initManagedSdk(); if (isInstallSupported()) { ManagedCloudSdkUpdateService.getInstance().activate(); } }
private void setManagedSdkUiAvailable(boolean available) { if (ServiceManager.getService(PluginInfoService.class).shouldEnable(GctFeature.MANAGED_SDK)) { enableAutomaticUpdatesCheckbox.setEnabled(available); // only make it visible if managed SDK is active, not currently installing or updating, and // not up-to-date. if (available && CloudSdkServiceUserSettings.getInstance().getUserSelectedSdkServiceType() == CloudSdkServiceType.MANAGED_SDK) { ManagedCloudSdkService managedCloudSdkService = (ManagedCloudSdkService) CloudSdkService.getInstance(); updateNowButton.setEnabled( managedCloudSdkService.getStatus() == SdkStatus.READY && !managedCloudSdkService.isUpToDate()); } else { updateNowButton.setEnabled(false); } } }
@Before public void setUp() throws UnsupportedOsException { // add timer thread to one not to be checked for 'leaks' ThreadTracker.longRunningThreadCreated( ApplicationManager.getApplication(), ManagedCloudSdkUpdateService.SDK_UPDATER_THREAD_NAME); doReturn(mockManagedCloudSdk).when(sdkService).createManagedSdk(); // TODO(ivanporty) remove once test logging system is done via CloudToolsRule sdkService.setLogger(new TestInMemoryLogger()); // make sure everything in test is done synchronously ExecutorService directExecutorService = MoreExecutors.newDirectExecutorService(); ThreadUtil.getInstance().setBackgroundExecutorService(directExecutorService); // run UI updates synchronously doAnswer( invocation -> { ((Runnable) invocation.getArgument(0)).run(); return null; }) .when(sdkService) .invokeOnApplicationUIThread(any()); // replace UI presenter for verifications ManagedCloudSdkServiceUiPresenter.setInstance(mockUiPresenter); when(mockUiPresenter.createProgressListener(any())).thenReturn(mockProgressListener); // init SDK, most tests require initialized state. sdkService.initManagedSdk(); }
@Test public void successful_update_changesSdkStatus_inProgress() { makeMockSdkInstalled(MOCK_SDK_PATH); emulateMockSdkUpdateProcess(); sdkService.addStatusUpdateListener(mockStatusUpdateListener); sdkService.update(); ArgumentCaptor<SdkStatus> statusCaptor = ArgumentCaptor.forClass(SdkStatus.class); verify(mockStatusUpdateListener, times(2)).onSdkStatusChange(any(), statusCaptor.capture()); assertThat(statusCaptor.getAllValues()) .isEqualTo(Arrays.asList(SdkStatus.INSTALLING, SdkStatus.READY)); }
@Test public void update_notCalled_when_sdk_upToDate() { when(mockSdkService.isUpToDate()).thenReturn(true); managedCloudSdkUpdateService.activate(); // managed SDK is UI thread only, ApplicationManager.getApplication() .invokeAndWait(() -> verify(mockSdkService, never()).update()); }
@Test public void successful_install_changesSdkStatus_inProgress() { sdkService.addStatusUpdateListener(mockStatusUpdateListener); emulateMockSdkInstallationProcess(MOCK_SDK_PATH); sdkService.install(); ArgumentCaptor<SdkStatus> statusCaptor = ArgumentCaptor.forClass(SdkStatus.class); verify(mockStatusUpdateListener, times(2)).onSdkStatusChange(any(), statusCaptor.capture()); assertThat(statusCaptor.getAllValues()) .isEqualTo(Arrays.asList(SdkStatus.INSTALLING, SdkStatus.READY)); }
@Test public void cancelledInstall_stops_installing_onActivation() throws Exception { emulateMockSdkInstallationProcess(MOCK_SDK_PATH); SdkInstaller sdkInstaller = mockManagedCloudSdk.newInstaller(); when(sdkInstaller.install(any(), any())).thenThrow(new CancellationException()); when(mockManagedCloudSdk.newInstaller()).thenReturn(sdkInstaller); sdkService.install(); // cancelled, now attempt to do clean install process and activation. emulateMockSdkInstallationProcess(MOCK_SDK_PATH); sdkService.activate(); // install is not supposed to run on activation anymore. assertThat(sdkService.getStatus()).isEqualTo(SdkStatus.NOT_AVAILABLE); }
@Test public void failed_install_showsErrorNotification() throws Exception { emulateMockSdkInstallationProcess(MOCK_SDK_PATH); SdkInstaller mockInstaller = mockManagedCloudSdk.newInstaller(); IOException ioException = new IOException("IO Error"); when(mockInstaller.install(any(), any())).thenThrow(ioException); sdkService.install(); verify(mockUiPresenter) .notifyManagedSdkJobFailure(ManagedSdkJobType.INSTALL, ioException.toString()); }
@Test public void upToDate_sdk_passes_valid_jobSuccessResult() throws ManagedSdkVerificationException { makeMockSdkInstalled(MOCK_SDK_PATH); when(mockManagedCloudSdk.isUpToDate()).thenReturn(true); sdkService.update(); verify(mockUiPresenter) .notifyManagedSdkJobSuccess(ManagedSdkJobType.UPDATE, ManagedSdkJobResult.UP_TO_DATE); }
@Test public void successful_install_returnsValidSdkPath() { emulateMockSdkInstallationProcess(MOCK_SDK_PATH); sdkService.install(); assertThat((Object) sdkService.getSdkHomePath()).isEqualTo(MOCK_SDK_PATH); }
@Test public void interruptedInstall_status_notAvailable() throws Exception { emulateMockSdkInstallationProcess(MOCK_SDK_PATH); SdkInstaller sdkInstaller = mockManagedCloudSdk.newInstaller(); when(sdkInstaller.install(any(), any())).thenThrow(new InterruptedException()); when(mockManagedCloudSdk.newInstaller()).thenReturn(sdkInstaller); sdkService.install(); assertThat(sdkService.getStatus()).isEqualTo(SdkStatus.NOT_AVAILABLE); }
/** * Runs managed SDK install/update code on background job and handles success/errors. * * @param jobType Install/update * @param managedSdkTask Task to execute. * @return {@code true} if task started, {@code false} if Managed SDK is not supported at all. */ private boolean executeManagedSdkJob( ManagedSdkJobType jobType, Callable<ManagedSdkJobResult> managedSdkTask) { if (!isInstallSupported()) { return false; } if (managedSdkBackgroundJob == null || managedSdkBackgroundJob.isDone()) { updateStatus(SdkStatus.INSTALLING); managedSdkBackgroundJob = ThreadUtil.getInstance().executeInBackground(managedSdkTask); Futures.addCallback( managedSdkBackgroundJob, new ManagedSdkJobListener(jobType), MoreExecutors.directExecutor()); } return true; }
@Test public void activate_service_sdkInstalled_sdkPath_valid() { makeMockSdkInstalled(MOCK_SDK_PATH); sdkService.activate(); assertThat((Object) sdkService.getSdkHomePath()).isEqualTo(MOCK_SDK_PATH); }
@Test public void notification_shown_beforeUpdate() { when(mockSdkService.isUpToDate()).thenReturn(false); managedCloudSdkUpdateService.activate(); ApplicationManager.getApplication() .invokeAndWait(() -> verify(mockUiPresenter).notifyManagedSdkUpdate(any(), any())); }
private void notifySdkProcessingStarted() { invokeOnApplicationUIThread( () -> statusUpdateListeners.forEach(SdkStatusUpdateListener::onSdkProcessingStarted)); }