/******************************************************************************* * Copyright (c) 2013, 2016 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package com.ibm.team.build.internal.hjplugin.tests; import java.util.Map; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.junit.Assert; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertEquals; import org.kohsuke.stapler.StaplerRequest; import org.mockito.Mockito; import com.gargoylesoftware.htmlunit.html.HtmlCheckBoxInput; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.ibm.team.build.internal.hjplugin.RTCFacadeFactory.RTCFacadeWrapper; import com.ibm.team.build.internal.hjplugin.RTCLoginInfo; import com.ibm.team.build.internal.hjplugin.RTCScm; import com.ibm.team.build.internal.hjplugin.RTCScm.BuildType; import com.ibm.team.build.internal.hjplugin.RTCScm.DescriptorImpl; import com.ibm.team.build.internal.hjplugin.tests.utils.AbstractTestCase; import com.ibm.team.build.internal.hjplugin.tests.utils.Utils; import com.ibm.team.build.internal.hjplugin.util.RTCFacadeFacade; import hudson.model.FreeStyleProject; import hudson.util.Secret; import net.sf.json.JSONObject; public class MayFailIT extends AbstractTestCase { private static final String CONFIGURE = "configure"; private static final String CONFIG = "config"; private static final String OVERRIDE_GLOBAL = "overrideGlobal"; private static final String SERVER_URI = "serverURI"; private static final String AVOID_USING_TOOLKIT = "avoidUsingToolkit"; private static final String BUILD_DEFINITION = "buildDefinition"; private static final String BUILD_TYPE = "buildType"; private static final String TEST_GLOBAL_BUILD_TOOLKIT = "C:\\buildtoolkit"; private static final String TEST_GLOBAL_SERVER_URI = "https://localhost:9443/ccm"; private static final String TEST_GLOBAL_USER_ID = "ADMIN"; private static final String TEST_GLOBAL_PASSWORD = "ADMIN"; private static final String TEST_GLOBAL_PASSWORD_FILE = "C:/Users/ADMIN/ADMIN-password"; private static final String TEST_GLOBAL_CRED_ID = "1234"; private static final String TEST_GLOBAL_TIMEOUT = "480"; private static final String BUILD_TOOLKIT = "buildToolkit"; private static final String USER_ID = "userId"; private static final String PASSWORD = "password"; private static final String PASSWORD_FILE = "passwordFile"; private static final String CREDENTIALS_ID = "_.credentialsId"; private static final String TIMEOUT = "timeout"; private static final String TEST_SERVER_URI = "https://localhost:9443/jazz"; private static final String TEST_TIMEOUT = "480"; private static final String TEST_USER_ID = "bill"; private static final String TEST_PASSWORD = "bill"; private static final String TEST_PASSWORD_FILE = "C:/Users/bill/bill-password"; private static final String TEST_CRED_ID = "5678"; private static final String TEST_BUILD_WORKSPACE = "compile-and-test"; private static final String TEST_BUILD_DEFINITION = "_Sf_R8EhyEeKuMu7IPRTOeQ"; private static final String TEST_BUILD_SNAPSHOT = "_vf_F8EyGeBuAp7IPRTOeQ"; private static final String TEST_BUILD_STREAM = "compile-and-test-stream"; @Rule public JenkinsRule j = new JenkinsRule(); @Test public void testJobConfigRoundtripOverrideGlobal() throws Exception { if (Config.DEFAULT.isConfigured()) { FreeStyleProject project = j.createFreeStyleProject(); RTCScm rtcScm = createTestOverrideGlobalRTCScm(false); project.setScm(rtcScm); j.submit(j.createWebClient().getPage(project, CONFIGURE).getFormByName(CONFIG)); RTCScm newRtcScm = (RTCScm) project.getScm(); j.assertEqualBeans(rtcScm, newRtcScm, OVERRIDE_GLOBAL + "," + SERVER_URI + "," + USER_ID + "," + PASSWORD + "," + PASSWORD_FILE + "," + BUILD_TYPE + "," + BUILD_DEFINITION); } } @Test public void testJobConfigRoundtripWithCredentials() throws Exception { if (Config.DEFAULT.isConfigured()) { FreeStyleProject project = j.createFreeStyleProject(); RTCScm rtcScm = createEmptyRTCScm(); DescriptorImpl descriptor = (DescriptorImpl) rtcScm.getDescriptor(); project.setScm(rtcScm); StaplerRequest mockedReq = Mockito.mock(StaplerRequest.class); Mockito.when(mockedReq.getParameter(BUILD_TOOLKIT)).thenReturn(TEST_GLOBAL_BUILD_TOOLKIT); Mockito.when(mockedReq.getParameter(SERVER_URI)).thenReturn(TEST_GLOBAL_SERVER_URI); Mockito.when(mockedReq.getParameter(USER_ID)).thenReturn(TEST_GLOBAL_USER_ID); Mockito.when(mockedReq.getParameter(TIMEOUT)).thenReturn(TEST_GLOBAL_TIMEOUT); Mockito.when(mockedReq.getParameter(PASSWORD)).thenReturn(TEST_GLOBAL_PASSWORD); Mockito.when(mockedReq.getParameter(PASSWORD_FILE)).thenReturn(TEST_GLOBAL_PASSWORD_FILE); Mockito.when(mockedReq.getParameter(CREDENTIALS_ID)).thenReturn(TEST_GLOBAL_CRED_ID); JSONObject mockJSON = new JSONObject(); mockJSON.element(AVOID_USING_TOOLKIT, new JSONObject()); mockJSON.element(CREDENTIALS_ID, TEST_GLOBAL_CRED_ID); mockJSON.element(SERVER_URI, TEST_GLOBAL_SERVER_URI); mockJSON.element(TIMEOUT, TEST_GLOBAL_TIMEOUT); descriptor.configure(mockedReq, mockJSON); descriptor.configure(mockedReq, mockJSON); WebClient webClient = j.createWebClient(); // Get the page to configure the project HtmlPage page = webClient.getPage(project, CONFIGURE); // Get the config form HtmlForm form = page.getFormByName(CONFIG); // Get the inputs HtmlCheckBoxInput overrideGlobalInput = form.getInputByName(OVERRIDE_GLOBAL); // Set the input values overrideGlobalInput.setChecked(false); // Submit the config form j.submit(form); // check submitted SCM result RTCScm newRtcScm = (RTCScm) project.getScm(); assertEquals(false, newRtcScm.getOverrideGlobal()); assertEquals(TEST_GLOBAL_SERVER_URI, newRtcScm.getServerURI()); assertEquals(TEST_GLOBAL_TIMEOUT, String.valueOf(newRtcScm.getTimeout())); assertEquals(null, newRtcScm.getUserId()); assertEquals(null, newRtcScm.getPassword()); assertEquals(null, newRtcScm.getPasswordFile()); assertEquals(TEST_GLOBAL_CRED_ID, newRtcScm.getCredentialsId()); assertTrue(newRtcScm.getAvoidUsingToolkit()); } } @Test public void testJobConfigRoundtripWithoutCredentials() throws Exception { if (Config.DEFAULT.isConfigured()) { FreeStyleProject project = j.createFreeStyleProject(); RTCScm rtcScm = createEmptyRTCScm(); DescriptorImpl descriptor = (DescriptorImpl) rtcScm.getDescriptor(); project.setScm(rtcScm); StaplerRequest mockedReq = Mockito.mock(StaplerRequest.class); Mockito.when(mockedReq.getParameter(BUILD_TOOLKIT)).thenReturn(TEST_GLOBAL_BUILD_TOOLKIT); Mockito.when(mockedReq.getParameter(SERVER_URI)).thenReturn(TEST_GLOBAL_SERVER_URI); Mockito.when(mockedReq.getParameter(USER_ID)).thenReturn(TEST_GLOBAL_USER_ID); Mockito.when(mockedReq.getParameter(TIMEOUT)).thenReturn(TEST_GLOBAL_TIMEOUT); Mockito.when(mockedReq.getParameter(PASSWORD)).thenReturn(TEST_GLOBAL_PASSWORD); Mockito.when(mockedReq.getParameter(PASSWORD_FILE)).thenReturn(TEST_GLOBAL_PASSWORD_FILE); Mockito.when(mockedReq.getParameter(CREDENTIALS_ID)).thenReturn(null); JSONObject mockJSON = new JSONObject(); mockJSON.element(AVOID_USING_TOOLKIT, new JSONObject()); mockJSON.element(SERVER_URI, TEST_GLOBAL_SERVER_URI); mockJSON.element(TIMEOUT, TEST_GLOBAL_TIMEOUT); descriptor.configure(mockedReq, mockJSON); WebClient webClient = j.createWebClient(); // Get the page to configure the project HtmlPage page = webClient.getPage(project, CONFIGURE); // Get the config form HtmlForm form = page.getFormByName(CONFIG); // Get the inputs HtmlCheckBoxInput overrideGlobalInput = form.getInputByName(OVERRIDE_GLOBAL); // Set the input values overrideGlobalInput.setChecked(false); // Submit the config form j.submit(form); // check submitted SCM result RTCScm newRtcScm = (RTCScm) project.getScm(); assertEquals(false, newRtcScm.getOverrideGlobal()); assertEquals(TEST_GLOBAL_SERVER_URI, newRtcScm.getServerURI()); assertEquals(TEST_GLOBAL_TIMEOUT, String.valueOf(newRtcScm.getTimeout())); assertEquals(TEST_GLOBAL_USER_ID, newRtcScm.getUserId()); assertEquals(TEST_GLOBAL_PASSWORD, newRtcScm.getPassword()); assertEquals(TEST_GLOBAL_PASSWORD_FILE, newRtcScm.getPasswordFile()); assertEquals(null, newRtcScm.getCredentialsId()); assertTrue(newRtcScm.getAvoidUsingToolkit()); } } /** * Test "Test Build Workspace" validates correctly a singly occurring workspace (valid) * and multiple workspaces with the same name (invalid) */ @Test public void testTestBuildWorkspace() throws Exception { if (Config.DEFAULT.isConfigured()) { RTCFacadeWrapper testingFacade = Utils.getTestingFacade(); RTCLoginInfo loginInfo = Config.DEFAULT.getLoginInfo(); @SuppressWarnings("unchecked") Map<String, String> setupArtifacts = (Map<String, String>) testingFacade.invoke( "setupTestBuildWorkspace", new Class[] { String.class, // serverURL, String.class, // userId, String.class, // password, int.class, // timeout, String.class, // singleWorkspaceName, String.class}, // multipleWorkspaceName loginInfo.getServerUri(), loginInfo.getUserId(), loginInfo.getPassword(), loginInfo.getTimeout(), "Singly Occuring=WS&encoded", "Multiple Occurrence=WS"); try { String errorMessage = RTCFacadeFacade.testBuildWorkspace( Config.DEFAULT.getToolkit(), loginInfo.getServerUri(), loginInfo.getUserId(), loginInfo.getPassword(), loginInfo.getTimeout(), false, // using toolkit "Singly Occuring=WS&encoded"); assertTrue(errorMessage, errorMessage == null || errorMessage.length() == 0); // Disabling this test pending investigation errorMessage = RTCFacadeFacade.testBuildWorkspace( Config.DEFAULT.getToolkit(), loginInfo.getServerUri(), loginInfo.getUserId(), loginInfo.getPassword(), loginInfo.getTimeout(), true, // avoiding toolkit "Singly Occuring=WS&encoded"); assertTrue(errorMessage, errorMessage == null || errorMessage.length() == 0); try { errorMessage = RTCFacadeFacade.testBuildWorkspace( Config.DEFAULT.getToolkit(), loginInfo.getServerUri(), loginInfo.getUserId(), loginInfo.getPassword(), loginInfo.getTimeout(), false, // using toolkit "Multiple Occurrence=WS"); assertTrue("There should be more than 1 workspace with the name", errorMessage != null && errorMessage.contains("More than 1")); errorMessage = RTCFacadeFacade.testBuildWorkspace( Config.DEFAULT.getToolkit(), loginInfo.getServerUri(), loginInfo.getUserId(), loginInfo.getPassword(), loginInfo.getTimeout(), true, // avoiding toolkit "Multiple Occurrence=WS"); assertTrue("There should be more than 1 workspace with the name", errorMessage != null && errorMessage.contains("More than 1")); } catch (Exception e) { e.printStackTrace(System.out); Assert.fail(e.getMessage()); } } finally { testingFacade.invoke( "tearDown", new Class[] { String.class, // serverURI String.class, // userId String.class, // password int.class, // timeout Map.class}, // setupArtifacts loginInfo.getServerUri(), loginInfo.getUserId(), loginInfo.getPassword(), loginInfo.getTimeout(), setupArtifacts); } } } private RTCScm createTestOverrideGlobalRTCScm(boolean useCreds) { BuildType buildSource = new BuildType(RTCScm.BUILD_DEFINITION_TYPE, TEST_BUILD_DEFINITION, TEST_BUILD_WORKSPACE, TEST_BUILD_SNAPSHOT, TEST_BUILD_STREAM); return new RTCScm(true, "", TEST_SERVER_URI, Integer.parseInt(TEST_TIMEOUT), TEST_USER_ID, Secret.fromString(TEST_PASSWORD), TEST_PASSWORD_FILE, useCreds ? TEST_CRED_ID : null, buildSource, false); } private RTCScm createEmptyRTCScm() { BuildType buildSource = new BuildType(RTCScm.BUILD_WORKSPACE_TYPE, "", "", "", ""); return new RTCScm(false, "", "", 0, "", Secret.fromString(""), "", "", buildSource, false); } }