/** * The values for these properties persist between unit tests and if set, must be cleaned up * between tests to avoid intermediate state and failures. */ @VisibleForTesting static void reset() { getInstance().propertiesComponent.unsetValue(SDK_TYPE_PROPERTY_NAME); getInstance().propertiesComponent.unsetValue(CUSTOM_CLOUD_SDK_PATH_PROPERTY_NAME); getInstance().propertiesComponent.unsetValue(SDK_AUTOMATIC_UPDATES_PROPERTY_NAME); getInstance().propertiesComponent.unsetValue(SDK_LAST_AUTOMATIC_UPDATE_TMESTAMP_PROPERTY_NAME); getInstance().propertiesComponent.unsetValue(SDK_USER_CANCELLED_INSTALLATION); }
public CloudSdkService getCloudSdkService() { return supportedCloudSdkServices.get( CloudSdkServiceUserSettings.getInstance().getUserSelectedSdkServiceType()); }
@Override public SdkStatus getStatus() { String sdkPath = CloudSdkServiceUserSettings.getInstance().getCustomSdkPath(); if (Strings.isNullOrEmpty(sdkPath)) { return SdkStatus.NOT_AVAILABLE; } boolean malformedSdkPath = CloudSdkValidator.isMalformedCloudSdkPath(sdkPath); return malformedSdkPath ? SdkStatus.INVALID : SdkStatus.READY; }
/** * Calculates milliseconds delay before first update based on last update/install time. If * complete update interval or more elapsed, first update is scheduled immediately (returns 0). */ private long getDelayBeforeFirstUpdate() { Optional<Long> lastTimeOfUpdate = CloudSdkServiceUserSettings.getInstance().getLastAutomaticUpdateTimestamp(); long delayBeforeUpdateMillis = SDK_UPDATE_INTERVAL_MS; if (lastTimeOfUpdate.isPresent()) { delayBeforeUpdateMillis = Math.min( SDK_UPDATE_INTERVAL_MS, Math.max(0, SDK_UPDATE_INTERVAL_MS - (getClock().millis() - lastTimeOfUpdate.get()))); } return delayBeforeUpdateMillis; }
/** * Called when managed SDK update operation (update or install) completes, either with success or * failure. */ void notifySdkUpdateCompleted() { CloudSdkServiceUserSettings.getInstance().setLastAutomaticUpdateTimestamp(getClock().millis()); }
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); } } }
public void reset() { CloudSdkServiceUserSettings sdkServiceUserSettings = CloudSdkServiceUserSettings.getInstance(); CloudSdkServiceType selectedSdkServiceType = sdkServiceUserSettings.getUserSelectedSdkServiceType(); switch (selectedSdkServiceType) { case MANAGED_SDK: managedRadioButton.doClick(); break; case CUSTOM_SDK: customRadioButton.doClick(); break; } setCloudSdkDirectoryText(Strings.nullToEmpty(sdkServiceUserSettings.getCustomSdkPath())); enableAutomaticUpdatesCheckbox.setSelected(sdkServiceUserSettings.isAutomaticUpdateEnabled()); // reset modified flag too so user won't see this as changed state. settingsModified = false; }
@Test public void update_scheduledNow_ifLastUpdate_elapsed() { CloudSdkServiceUserSettings.getInstance().setLastAutomaticUpdateTimestamp(1); when(mockClock.millis()).thenReturn(ManagedCloudSdkUpdateService.SDK_UPDATE_INTERVAL_MS + 2); managedCloudSdkUpdateService.activate(); verify(managedCloudSdkUpdateService) .schedule(any(), eq(0L), eq(ManagedCloudSdkUpdateService.SDK_UPDATE_INTERVAL_MS)); }
@Test public void update_scheduledOnShorterTime_ifLastUpdate_fartherInterval() { CloudSdkServiceUserSettings.getInstance().setLastAutomaticUpdateTimestamp(1); when(mockClock.millis()).thenReturn(ManagedCloudSdkUpdateService.SDK_UPDATE_INTERVAL_MS / 2); managedCloudSdkUpdateService.activate(); verify(managedCloudSdkUpdateService) .schedule( any(), eq((ManagedCloudSdkUpdateService.SDK_UPDATE_INTERVAL_MS / 2) + 1), eq(ManagedCloudSdkUpdateService.SDK_UPDATE_INTERVAL_MS)); }
@Test public void notification_disableUpdates_updatesSettings() { when(mockSdkService.isUpToDate()).thenReturn(false); CloudSdkServiceUserSettings.getInstance().setEnableAutomaticUpdates(true); managedCloudSdkUpdateService.activate(); ApplicationManager.getApplication() .invokeAndWait( () -> { ArgumentCaptor<ActionListener> disableListener = ArgumentCaptor.forClass(ActionListener.class); verify(mockUiPresenter).notifyManagedSdkUpdate(any(), disableListener.capture()); disableListener.getValue().actionPerformed(mock(ActionEvent.class)); assertThat(CloudSdkServiceUserSettings.getInstance().isAutomaticUpdateEnabled()) .isFalse(); }); } }
private void verifyCloudSdkSettings( CloudSdkServiceType cloudSdkServiceType, boolean enableAutomaticUpdates, String customSdkPath) { CloudSdkServiceUserSettings userSettings = CloudSdkServiceUserSettings.getInstance(); assertThat(cloudSdkServiceType).isEqualTo(userSettings.getUserSelectedSdkServiceType()); assertThat(enableAutomaticUpdates).isEqualTo(userSettings.isAutomaticUpdateEnabled()); assertThat(customSdkPath).isEqualTo(userSettings.getCustomSdkPath()); }
/** 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 failed_update_writes_lastUpdateTime() throws Exception { makeMockSdkInstalled(MOCK_SDK_PATH); emulateMockSdkUpdateProcess(); SdkUpdater mockUpdater = mockManagedCloudSdk.newUpdater(); doThrow(new CommandExitException(-1, "")).when(mockUpdater).update(any(), any()); // supply custom clock to check update time has been properly set in settings. Clock mockClock = mock(Clock.class); when(mockUpdateService.getClock()).thenReturn(mockClock); long updateTime = 1000L; when(mockClock.millis()).thenReturn(updateTime); doCallRealMethod().when(mockUpdateService).notifySdkUpdateCompleted(); sdkService.update(); verify(mockUpdateService).notifySdkUpdateCompleted(); assertThat( CloudSdkServiceUserSettings.getInstance().getLastAutomaticUpdateTimestamp().isPresent()) .isTrue(); assertThat(CloudSdkServiceUserSettings.getInstance().getLastAutomaticUpdateTimestamp().get()) .isEqualTo(updateTime); }
@Test public void updateNow_notEnabled_whenSdkUpToDate() { ManagedCloudSdkService managedCloudSdkService = mock(ManagedCloudSdkService.class); when(mockCloudSdkServiceManager.getCloudSdkService()).thenReturn(managedCloudSdkService); when(managedCloudSdkService.getStatus()).thenReturn(SdkStatus.READY); when(managedCloudSdkService.isUpToDate()).thenReturn(true); ApplicationManager.getApplication() .invokeAndWait( () -> { // use non-spy panel as spy messes up with UI event thread field updates. CloudSdkPanel sdkPanel = new CloudSdkPanel(); CloudSdkServiceUserSettings.getInstance() .setUserSelectedSdkServiceType(CloudSdkServiceType.MANAGED_SDK); sdkPanel.reset(); assertThat(sdkPanel.getUpdateNowButton().isEnabled()).isFalse(); }); }
@Test public void updateNow_enabled_whenSdkReadyToUpdate() { ManagedCloudSdkService managedCloudSdkService = mock(ManagedCloudSdkService.class); when(mockCloudSdkServiceManager.getCloudSdkService()).thenReturn(managedCloudSdkService); when(managedCloudSdkService.getStatus()).thenReturn(SdkStatus.READY); when(managedCloudSdkService.isUpToDate()).thenReturn(false); ApplicationManager.getApplication() .invokeAndWait( () -> { // use non-spy panel as spy messes up with UI event thread field updates. CloudSdkPanel sdkPanel = new CloudSdkPanel(); CloudSdkServiceUserSettings.getInstance() .setUserSelectedSdkServiceType(CloudSdkServiceType.MANAGED_SDK); sdkPanel.reset(); assertThat(sdkPanel.getUpdateNowButton().isEnabled()).isTrue(); }); }
/** * Checks for custom SDK validation errors and shows error label if they exist. To be removed once * managed SDk feature is rolled out. */ private void updateSdkValidationLabel() { if (!ServiceManager.getService(PluginInfoService.class).shouldEnable(GctFeature.MANAGED_SDK)) { String sdkValidationMessage = CloudSdkPanel.buildSdkMessage( CloudSdkServiceUserSettings.getInstance().getCustomSdkPath(), false); if (sdkValidationMessage != null) { sdkValidationErrorLabel.setText(sdkValidationMessage); sdkValidationErrorLabel.setVisible(true); } else { sdkValidationErrorLabel.setVisible(false); } } else { sdkValidationErrorLabel.setVisible(false); } } }
private void verifySdkPanelStateForCurrentSettings(CloudSdkPanel sdkPanel) { CloudSdkServiceUserSettings userSettings = CloudSdkServiceUserSettings.getInstance(); switch (userSettings.getUserSelectedSdkServiceType()) { case CUSTOM_SDK: assertThat(sdkPanel.getCustomRadioButton().isSelected()).isTrue(); assertThat(sdkPanel.getManagedRadioButton().isSelected()).isFalse(); assertThat(sdkPanel.getEnableAutomaticUpdatesCheckbox().isEnabled()).isFalse(); break; case MANAGED_SDK: assertThat(sdkPanel.getManagedRadioButton().isSelected()).isTrue(); assertThat(sdkPanel.getEnableAutomaticUpdatesCheckbox().isEnabled()).isTrue(); assertThat(sdkPanel.getCustomRadioButton().isSelected()).isFalse(); assertThat(sdkPanel.getCloudSdkDirectoryField().isEnabled()).isFalse(); break; } assertThat(sdkPanel.getEnableAutomaticUpdatesCheckbox().isSelected()) .isEqualTo(userSettings.isAutomaticUpdateEnabled()); assertThat(sdkPanel.getCloudSdkDirectoryText()) .isEqualTo(Strings.nullToEmpty(userSettings.getCustomSdkPath())); } }
@Test public void automaticUpdate_enabled_callsUpdater_activate() { ApplicationManager.getApplication() .invokeAndWait( () -> { // use non-spy panel as spy messes up with UI event thread field updates. CloudSdkPanel sdkPanel = new CloudSdkPanel(); CloudSdkServiceUserSettings.getInstance() .setUserSelectedSdkServiceType(CloudSdkServiceType.MANAGED_SDK); CloudSdkServiceUserSettings.getInstance().setEnableAutomaticUpdates(false); sdkPanel.reset(); sdkPanel.getEnableAutomaticUpdatesCheckbox().doClick(); try { sdkPanel.apply(); } catch (ConfigurationException e) { throw new AssertionError(e); } verify(managedCloudSdkUpdateService).activate(); }); }
@Test public void updateNow_notEnabled_whenSdkNotReady() { when(mockCloudSdkService.getStatus()).thenReturn(SdkStatus.INSTALLING); ApplicationManager.getApplication() .invokeAndWait( () -> { // use non-spy panel as spy messes up with UI event thread field updates. CloudSdkPanel sdkPanel = new CloudSdkPanel(); CloudSdkServiceUserSettings.getInstance() .setUserSelectedSdkServiceType(CloudSdkServiceType.MANAGED_SDK); sdkPanel.reset(); assertThat(sdkPanel.getUpdateNowButton().isEnabled()).isFalse(); }); }
@Test public void customSdkSettings_reset_validUiState() { ApplicationManager.getApplication() .invokeAndWait( () -> { // use non-spy panel as spy messes up with UI event thread field updates. CloudSdkPanel sdkPanel = new CloudSdkPanel(); CloudSdkServiceUserSettings userSettings = CloudSdkServiceUserSettings.getInstance(); userSettings.setUserSelectedSdkServiceType(CloudSdkServiceType.CUSTOM_SDK); userSettings.setCustomSdkPath("/home/gcloud"); sdkPanel.reset(); verifySdkPanelStateForCurrentSettings(sdkPanel); }); }