/*******************************************************************************
 *                                                                              
 *  Copyright FUJITSU LIMITED 2017
 *                                                                              
 *  Author: tokoda                                                     
 *                                                                              
 *  Creation Date: Sep 9, 2011                                                      
 *                                                                              
 *  Completion Time: Sep 9, 2011                                                 
 *                                                                              
 *******************************************************************************/

package org.oscm.webservices;

import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.security.Principal;

import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.oscm.dataservice.local.DataService;
import org.oscm.domobjects.PlatformUser;
import org.oscm.internal.intf.ServiceProvisioningService;
import org.oscm.internal.vo.VOService;
import org.oscm.internal.vo.VOTechnicalService;

/**
 * @author tokoda
 * 
 */
public class ServiceProvisioningServiceWSTest {

    private ServiceProvisioningServiceWS serviceWS;
    private ServiceProvisioningService serviceMock;
    private HttpServletRequest requestMock;

    @Before
    public void setup() {
        serviceMock = mock(ServiceProvisioningService.class);
        serviceWS = new ServiceProvisioningServiceWS();
        serviceWS.wsContext = createWebServiceContextMock("127.0.0.1", "99999");
        serviceWS.delegate = serviceMock;
        PlatformUser user = mock(PlatformUser.class);
        DataService ds = mock(DataService.class);
        Mockito.when(ds.getCurrentUser()).thenReturn(user);
        serviceWS.ds = ds;
    }

    private WebServiceContext createWebServiceContextMock(String expectedIP,
            String expectedUser) {
        requestMock = mock(HttpServletRequest.class);
        when(requestMock.getRemoteAddr()).thenReturn(expectedIP);

        Principal principalMock = mock(Principal.class);
        when(principalMock.getName()).thenReturn(expectedUser);

        MessageContext msgContextMock = mock(MessageContext.class);
        when(msgContextMock.get(anyString())).thenReturn(requestMock);

        WebServiceContext wsContextMock = mock(WebServiceContext.class);
        when(wsContextMock.getUserPrincipal()).thenReturn(principalMock);
        when(wsContextMock.getMessageContext()).thenReturn(msgContextMock);

        return wsContextMock;
    }

    @Test
    public void testLogInjectionForServiceProvisioningServiceWS()
            throws Exception {

        serviceWS.activateService(null);
        serviceWS.createService(null, null, null);
        serviceWS.createTechnicalService(null);
        serviceWS.deactivateService(null);
        serviceWS.deleteService(null);
        serviceWS.deleteTechnicalService(null);
        serviceWS.exportTechnicalServices(null);
        serviceWS.getAllCustomerSpecificServices();
        serviceWS.getCompatibleServices(null);
        serviceWS.getServicesForCustomer(null);
        serviceWS.getPriceModelLocalization(null);
        serviceWS.getServiceDetails(null);
        serviceWS.getServiceForCustomer(null, null);
        serviceWS.getServiceLocalization(null);
        serviceWS.getServiceForSubscription(null, null);
        serviceWS.getSupportedCurrencies();
        serviceWS.getTechnicalServices(null);
        serviceWS.importTechnicalServices(null);
        serviceWS.loadImage(null);
        serviceWS.savePriceModel(null, null);
        serviceWS.savePriceModelForCustomer(null, null, null);
        serviceWS.savePriceModelForSubscription(null, null);
        serviceWS.savePriceModelLocalization(null, null);
        serviceWS.saveServiceLocalization(null, null);
        serviceWS.saveTechnicalServiceLocalization(null);
        serviceWS.setCompatibleServices(null, null);
        serviceWS.updateService(null, null);
        serviceWS.validateTechnicalServiceCommunication(null);
        serviceWS.copyService(null, null);
        serviceWS.getSuppliedServices();
        serviceWS.getServicesForMarketplace(null);
        serviceWS.loadImageForSupplier(null, null);
        serviceWS.getPriceModelLicenseTemplateLocalization(null);
        serviceWS.setActivationStates(null);
        serviceWS.getRelatedServicesForMarketplace(null, null, null);
        serviceWS.getServiceForMarketplace(null, null, null);
        serviceWS.getServiceSeller(0, null);
        serviceWS.getInstanceIdsForSellers(null);
        serviceWS.suspendService(null, null);
        serviceWS.resumeService(null);
        serviceWS.statusAllowsDeletion(null);
        serviceWS.isPartOfUpgradePath(null);
        serviceWS.getPotentialCompatibleServices(null);
        verify(requestMock, times(43)).getRemoteAddr();

        verify(serviceMock, times(1)).activateService(null);
        verify(serviceMock, times(1)).createService(null, null, null);
        verify(serviceMock, times(1)).createTechnicalService(null);
        verify(serviceMock, times(1)).deactivateService(null);
        verify(serviceMock, times(1)).deleteService((VOService) null);
        verify(serviceMock, times(1)).deleteTechnicalService(
                (VOTechnicalService) null);
        verify(serviceMock, times(1)).exportTechnicalServices(null);
        verify(serviceMock, times(1)).getAllCustomerSpecificServices();
        verify(serviceMock, times(1)).getCompatibleServices(null);
        verify(serviceMock, times(1)).getServicesForCustomer(null);
        verify(serviceMock, times(1)).getPriceModelLocalization(null);
        verify(serviceMock, times(1)).getServiceDetails(null);
        verify(serviceMock, times(1)).getServiceForCustomer(null, null);
        verify(serviceMock, times(1)).getServiceLocalization(null);
        verify(serviceMock, times(1)).getServiceForSubscription(null, null);
        verify(serviceMock, times(1)).getSupportedCurrencies();
        verify(serviceMock, times(1)).getTechnicalServices(null);
        verify(serviceMock, times(1)).importTechnicalServices(null);
        verify(serviceMock, times(1)).loadImage(null);
        verify(serviceMock, times(1)).savePriceModel(null, null);
        verify(serviceMock, times(1)).savePriceModelForCustomer(null, null,
                null);
        verify(serviceMock, times(1)).savePriceModelForSubscription(null, null);
        verify(serviceMock, times(1)).savePriceModelLocalization(null, null);
        verify(serviceMock, times(1)).saveServiceLocalization(null, null);
        verify(serviceMock, times(1)).saveTechnicalServiceLocalization(null);
        verify(serviceMock, times(1)).setCompatibleServices(null, null);
        verify(serviceMock, times(1)).updateService(null, null);
        verify(serviceMock, times(1)).validateTechnicalServiceCommunication(
                null);
        verify(serviceMock, times(1)).copyService(null, null);
        verify(serviceMock, times(1)).getSuppliedServices();
        verify(serviceMock, times(1)).getServicesForMarketplace(null);
        verify(serviceMock, times(1)).loadImageForSupplier(null, null);
        verify(serviceMock, times(1)).getPriceModelLicenseTemplateLocalization(
                null);
        verify(serviceMock, times(1)).setActivationStates(null);
        verify(serviceMock, times(1)).getRelatedServicesForMarketplace(null,
                null, null);
        verify(serviceMock, times(1))
                .getServiceForMarketplace(null, null, null);
        verify(serviceMock, times(1)).getServiceSeller(0, null);
        verify(serviceMock, times(1)).getInstanceIdsForSellers(null);
        verify(serviceMock, times(1)).suspendService(null, null);
        verify(serviceMock, times(1)).resumeService(null);
        verify(serviceMock, times(1)).statusAllowsDeletion(null);
        verify(serviceMock, times(1)).isPartOfUpgradePath(null);
        verify(serviceMock, times(1)).getPotentialCompatibleServices(null);
    }

    @Test
    public void logInjectionForServiceProvisioningServiceWS() throws Exception {

        serviceWS.createService(null, null, null);

        serviceWS.updateService(null, null);

        verify(requestMock, times(2)).getRemoteAddr();

        verify(serviceMock, times(1)).createService(null, null, null);

        verify(serviceMock, times(1)).updateService(null, null);

        verify(serviceMock, never()).getServiceDetails(null);
    }
}