package com.feisystems.polrep.service;
import static com.feisystems.polrep.util.DOMUtils.bytesToDocument;
import static com.feisystems.polrep.util.DOMUtils.getNode;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyListOf;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.herasaf.xacml.core.simplePDP.SimplePDPFactory;
import org.junit.After;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.modelmapper.ModelMapper;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.StringUtils;
import com.feisystems.polrep.domain.Policy;
import com.feisystems.polrep.infrastructure.PolicyRepository;
import com.feisystems.polrep.service.dto.PolicyContainerDto;
import com.feisystems.polrep.service.dto.PolicyContentContainerDto;
import com.feisystems.polrep.service.dto.PolicyContentDto;
import com.feisystems.polrep.service.dto.PolicyDto;
import com.feisystems.polrep.service.dto.PolicyMetadataContainerDto;
import com.feisystems.polrep.service.dto.PolicyMetadataDto;
import com.feisystems.polrep.service.exception.ConflictingRequestException;
import com.feisystems.polrep.service.exception.InvalidPolicyCombiningAlgIdException;
import com.feisystems.polrep.service.exception.PolicyAlreadyExistsException;
import com.feisystems.polrep.service.exception.PolicyCombiningAlgIdNotFoundException;
import com.feisystems.polrep.service.exception.PolicyIdNotFoundException;
import com.feisystems.polrep.service.exception.PolicyNotFoundException;
import com.feisystems.polrep.service.xacml.XACMLXPath;
@RunWith(MockitoJUnitRunner.class)
public class PolicyServiceImplTest {
private static final String POLICY_STRING1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Policy xmlns=\"urn:oasis:names:tc:xacml:2.0:policy:schema:os\" PolicyId=\"C2S.001:&2.16.840.1.113883.3.704.100.200.1.1.3.1&ISO:1174858088:1740515725:JKCE7C\" RuleCombiningAlgId=\"urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:permit-overrides\"><Description>This is a reference policy for consent2share@outlook.com</Description><Target/><Rule Effect=\"Permit\" RuleId=\"primary-group-rule\"><Target><Resources><Resource><ResourceMatch MatchId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">34133-9</AttributeValue><ResourceAttributeDesignator AttributeId=\"urn:oasis:names:tc:xacml:1.0:resource:typeCode\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></ResourceMatch><ResourceMatch MatchId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">urn:oasis:names:tc:ebxml-regrep:StatusType:Approved</AttributeValue><ResourceAttributeDesignator AttributeId=\"xacml:status\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></ResourceMatch></Resource></Resources><Actions><Action><ActionMatch MatchId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">xdsquery</AttributeValue><ActionAttributeDesignator AttributeId=\"urn:oasis:names:tc:xacml:1.0:action:action-id\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></ActionMatch></Action><Action><ActionMatch MatchId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">xdsretrieve</AttributeValue><ActionAttributeDesignator AttributeId=\"urn:oasis:names:tc:xacml:1.0:action:action-id\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></ActionMatch></Action></Actions></Target><Condition><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:and\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:or\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:string-one-and-only\"><SubjectAttributeDesignator MustBePresent=\"false\" AttributeId=\"urn:oasis:names:tc:xacml:1.0:subject-category:intermediary-subject\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></Apply><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">1740515725</AttributeValue></Apply></Apply><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:or\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:string-one-and-only\"><SubjectAttributeDesignator MustBePresent=\"false\" AttributeId=\"urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></Apply><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">1174858088</AttributeValue></Apply></Apply><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:or\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:string-one-and-only\"><SubjectAttributeDesignator MustBePresent=\"false\" AttributeId=\"urn:oasis:names:tc:xspa:1.0:subject:purposeofuse\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></Apply><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">TREATMENT</AttributeValue></Apply></Apply><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:dateTime-greater-than-or-equal\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:dateTime-one-and-only\"><EnvironmentAttributeDesignator MustBePresent=\"false\" AttributeId=\"urn:oasis:names:tc:xacml:1.0:environment:current-dateTime\" DataType=\"http://www.w3.org/2001/XMLSchema#dateTime\"/></Apply><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#dateTime\">2015-03-03T00:00:00-0500</AttributeValue></Apply><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:dateTime-less-than-or-equal\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:dateTime-one-and-only\"><EnvironmentAttributeDesignator MustBePresent=\"false\" AttributeId=\"urn:oasis:names:tc:xacml:1.0:environment:current-dateTime\" DataType=\"http://www.w3.org/2001/XMLSchema#dateTime\"/></Apply><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#dateTime\">2016-03-02T23:59:59-0500</AttributeValue></Apply></Apply></Condition></Rule><Rule Effect=\"Deny\" RuleId=\"deny-others\"/><Obligations><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">ADD</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">ALC</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">PSY</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">COM</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">GDIS</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">SEX</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">ETH</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">HIV</AttributeAssignment></Obligation></Obligations></Policy>";
private static final String POLICY_STRING2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Policy xmlns=\"urn:oasis:names:tc:xacml:2.0:policy:schema:os\" PolicyId=\"C2S.002:&2.16.840.1.113883.3.704.100.200.1.1.3.1&ISO:1174858088:1740515725:JKCE7C\" RuleCombiningAlgId=\"urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:permit-overrides\"><Description>This is a reference policy for consent2share@outlook.com</Description><Target/><Rule Effect=\"Permit\" RuleId=\"primary-group-rule\"><Target><Resources><Resource><ResourceMatch MatchId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">34133-9</AttributeValue><ResourceAttributeDesignator AttributeId=\"urn:oasis:names:tc:xacml:1.0:resource:typeCode\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></ResourceMatch><ResourceMatch MatchId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">urn:oasis:names:tc:ebxml-regrep:StatusType:Approved</AttributeValue><ResourceAttributeDesignator AttributeId=\"xacml:status\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></ResourceMatch></Resource></Resources><Actions><Action><ActionMatch MatchId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">xdsquery</AttributeValue><ActionAttributeDesignator AttributeId=\"urn:oasis:names:tc:xacml:1.0:action:action-id\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></ActionMatch></Action><Action><ActionMatch MatchId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">xdsretrieve</AttributeValue><ActionAttributeDesignator AttributeId=\"urn:oasis:names:tc:xacml:1.0:action:action-id\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></ActionMatch></Action></Actions></Target><Condition><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:and\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:or\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:string-one-and-only\"><SubjectAttributeDesignator MustBePresent=\"false\" AttributeId=\"urn:oasis:names:tc:xacml:1.0:subject-category:intermediary-subject\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></Apply><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">1740515725</AttributeValue></Apply></Apply><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:or\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:string-one-and-only\"><SubjectAttributeDesignator MustBePresent=\"false\" AttributeId=\"urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></Apply><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">1174858088</AttributeValue></Apply></Apply><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:or\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:string-equal\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:string-one-and-only\"><SubjectAttributeDesignator MustBePresent=\"false\" AttributeId=\"urn:oasis:names:tc:xspa:1.0:subject:purposeofuse\" DataType=\"http://www.w3.org/2001/XMLSchema#string\"/></Apply><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">TREATMENT</AttributeValue></Apply></Apply><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:dateTime-greater-than-or-equal\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:dateTime-one-and-only\"><EnvironmentAttributeDesignator MustBePresent=\"false\" AttributeId=\"urn:oasis:names:tc:xacml:1.0:environment:current-dateTime\" DataType=\"http://www.w3.org/2001/XMLSchema#dateTime\"/></Apply><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#dateTime\">2015-03-03T00:00:00-0500</AttributeValue></Apply><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:dateTime-less-than-or-equal\"><Apply FunctionId=\"urn:oasis:names:tc:xacml:1.0:function:dateTime-one-and-only\"><EnvironmentAttributeDesignator MustBePresent=\"false\" AttributeId=\"urn:oasis:names:tc:xacml:1.0:environment:current-dateTime\" DataType=\"http://www.w3.org/2001/XMLSchema#dateTime\"/></Apply><AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#dateTime\">2016-03-02T23:59:59-0500</AttributeValue></Apply></Apply></Condition></Rule><Rule Effect=\"Deny\" RuleId=\"deny-others\"/><Obligations><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">ADD</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">ALC</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">PSY</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">COM</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">GDIS</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">SEX</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">ETH</AttributeAssignment></Obligation><Obligation ObligationId=\"urn:samhsa:names:tc:consent2share:1.0:obligation:redact-document-section-code\" FulfillOn=\"Permit\"><AttributeAssignment AttributeId=\"urn:oasis:names:tc:xacml:3.0:example:attribute:text\" DataType=\"http://www.w3.org/2001/XMLSchema#string\">HIV</AttributeAssignment></Obligation></Obligations></Policy>";
private static final String POLICY_ID1 = "C2S.001:&2.16.840.1.113883.3.704.100.200.1.1.3.1&ISO:1174858088:1740515725:JKCE7C";
private static final String POLICY_ID2 = "C2S.002:&2.16.840.1.113883.3.704.100.200.1.1.3.1&ISO:1174858088:1740515725:JKCE7C";
@Rule
public ExpectedException thrown = ExpectedException.none();
@Mock
private PolicyRepository policyRepository;
@Mock
private ModelMapper modelMapper;
@Mock
private PolicyCombiningAlgIdValidator policyCombiningAlgIdValidator;
@InjectMocks
private PolicyServiceImpl sut;
@After
public void tearDown() throws Exception {
}
@Test
public void testAddPolicies_Forced() throws UnsupportedEncodingException {
// Assert
final boolean force = true;
final PolicyContentDto addPolicyRequestDto1 = new PolicyContentDto();
addPolicyRequestDto1.setPolicy(POLICY_STRING1.getBytes("UTF-8"));
final PolicyContentDto addPolicyRequestDto2 = new PolicyContentDto();
addPolicyRequestDto2.setPolicy(POLICY_STRING2.getBytes("UTF-8"));
final PolicyContentContainerDto addPolicyRequestContainerDto = new PolicyContentContainerDto(
addPolicyRequestDto1, addPolicyRequestDto2);
final Policy policy1 = mock(Policy.class);
when(policy1.getId()).thenReturn(POLICY_ID1);
final Policy policy2 = mock(Policy.class);
when(policy2.getId()).thenReturn(POLICY_ID2);
when(modelMapper.map(addPolicyRequestDto1, Policy.class)).thenReturn(
policy1);
when(modelMapper.map(addPolicyRequestDto2, Policy.class)).thenReturn(
policy2);
final PolicyMetadataDto addPolicyResponseDto1 = mock(PolicyMetadataDto.class);
final PolicyMetadataDto addPolicyResponseDto2 = mock(PolicyMetadataDto.class);
when(modelMapper.map(policy1, PolicyMetadataDto.class)).thenReturn(
addPolicyResponseDto1);
when(modelMapper.map(policy2, PolicyMetadataDto.class)).thenReturn(
addPolicyResponseDto2);
// Act
sut.addPolicies(addPolicyRequestContainerDto, force);
// Assert
verify(policyRepository, times(1)).save(anyListOf(Policy.class));
}
@Test
public void testAddPolicies_Forced_One_Already_Exists()
throws UnsupportedEncodingException {
// Assert
final boolean force = true;
final PolicyContentDto addPolicyRequestDto1 = new PolicyContentDto();
addPolicyRequestDto1.setPolicy(POLICY_STRING1.getBytes("UTF-8"));
final PolicyContentDto addPolicyRequestDto2 = new PolicyContentDto();
addPolicyRequestDto2.setPolicy(POLICY_STRING2.getBytes("UTF-8"));
final PolicyContentContainerDto addPolicyRequestContainerDto = new PolicyContentContainerDto(
addPolicyRequestDto1, addPolicyRequestDto2);
final Policy policy1 = mock(Policy.class);
when(policy1.getId()).thenReturn(POLICY_ID1);
final Policy policy2 = mock(Policy.class);
when(policy2.getId()).thenReturn(POLICY_ID2);
when(modelMapper.map(addPolicyRequestDto1, Policy.class)).thenReturn(
policy1);
when(modelMapper.map(addPolicyRequestDto2, Policy.class)).thenReturn(
policy2);
final PolicyMetadataDto addPolicyResponseDto1 = mock(PolicyMetadataDto.class);
final PolicyMetadataDto addPolicyResponseDto2 = mock(PolicyMetadataDto.class);
when(modelMapper.map(policy1, PolicyMetadataDto.class)).thenReturn(
addPolicyResponseDto1);
when(modelMapper.map(policy2, PolicyMetadataDto.class)).thenReturn(
addPolicyResponseDto2);
when(policyRepository.findOne(POLICY_ID1)).thenReturn(new Policy());
// Act
sut.addPolicies(addPolicyRequestContainerDto, force);
// Assert
verify(policyRepository, times(1)).save(anyListOf(Policy.class));
}
@Test
public void testAddPolicies_Not_Forced()
throws UnsupportedEncodingException {
// Assert
final boolean force = false;
final PolicyContentDto addPolicyRequestDto1 = new PolicyContentDto();
addPolicyRequestDto1.setPolicy(POLICY_STRING1.getBytes("UTF-8"));
final PolicyContentDto addPolicyRequestDto2 = new PolicyContentDto();
addPolicyRequestDto2.setPolicy(POLICY_STRING2.getBytes("UTF-8"));
final PolicyContentContainerDto addPolicyRequestContainerDto = new PolicyContentContainerDto(
addPolicyRequestDto1, addPolicyRequestDto2);
final Policy policy1 = mock(Policy.class);
when(policy1.getId()).thenReturn(POLICY_ID1);
final Policy policy2 = mock(Policy.class);
when(policy2.getId()).thenReturn(POLICY_ID2);
when(modelMapper.map(addPolicyRequestDto1, Policy.class)).thenReturn(
policy1);
when(modelMapper.map(addPolicyRequestDto2, Policy.class)).thenReturn(
policy2);
final PolicyMetadataDto addPolicyResponseDto1 = mock(PolicyMetadataDto.class);
final PolicyMetadataDto addPolicyResponseDto2 = mock(PolicyMetadataDto.class);
when(modelMapper.map(policy1, PolicyMetadataDto.class)).thenReturn(
addPolicyResponseDto1);
when(modelMapper.map(policy2, PolicyMetadataDto.class)).thenReturn(
addPolicyResponseDto2);
// Act
sut.addPolicies(addPolicyRequestContainerDto, force);
// Assert
verify(policyRepository, times(1)).save(anyListOf(Policy.class));
}
@Test
public void testAddPolicies_Not_Forced_Throws_PolicyAlreadyExistsException()
throws UnsupportedEncodingException {
// Assert
thrown.expect(PolicyAlreadyExistsException.class);
final boolean force = false;
final PolicyContentDto addPolicyRequestDto1 = new PolicyContentDto();
addPolicyRequestDto1.setPolicy(POLICY_STRING1.getBytes("UTF-8"));
final PolicyContentDto addPolicyRequestDto2 = new PolicyContentDto();
addPolicyRequestDto2.setPolicy(POLICY_STRING2.getBytes("UTF-8"));
final PolicyContentContainerDto addPolicyRequestContainerDto = new PolicyContentContainerDto(
addPolicyRequestDto1, addPolicyRequestDto2);
final Policy policy1 = mock(Policy.class);
when(policy1.getId()).thenReturn(POLICY_ID1);
final Policy policy2 = mock(Policy.class);
when(policy2.getId()).thenReturn(POLICY_ID2);
when(policyRepository.findOne(POLICY_ID1)).thenReturn(new Policy());
when(modelMapper.map(addPolicyRequestDto1, Policy.class)).thenReturn(
policy1);
when(modelMapper.map(addPolicyRequestDto2, Policy.class)).thenReturn(
policy2);
final PolicyMetadataDto addPolicyResponseDto1 = mock(PolicyMetadataDto.class);
final PolicyMetadataDto addPolicyResponseDto2 = mock(PolicyMetadataDto.class);
when(modelMapper.map(policy1, PolicyMetadataDto.class)).thenReturn(
addPolicyResponseDto1);
when(modelMapper.map(policy2, PolicyMetadataDto.class)).thenReturn(
addPolicyResponseDto2);
// Act
sut.addPolicies(addPolicyRequestContainerDto, force);
// Assert
verify(policyRepository, times(1)).save(anyListOf(Policy.class));
}
@Test
public void testAddPolicies_Throws_ConflictingRequestException()
throws UnsupportedEncodingException {
// Assert
thrown.expect(ConflictingRequestException.class);
final PolicyContentDto addPolicyRequestDto = new PolicyContentDto();
addPolicyRequestDto.setPolicy(POLICY_STRING1.getBytes("UTF-8"));
final PolicyContentContainerDto addPolicyRequestContainerDto = new PolicyContentContainerDto(
addPolicyRequestDto, addPolicyRequestDto);
// Act
sut.addPolicies(addPolicyRequestContainerDto, false);
}
@Test
public void testDeletePolicy() {
// Arrange
final String policyId = "policyId";
// Act
sut.deletePolicy(policyId);
// Assert
verify(policyRepository, times(1)).delete(policyId);
}
@Test
public void testDeletePolicy_Throws_PolicyIdNotFoundException_By_Empty_String() {
// Arrange
final String policyId = "";
thrown.expect(PolicyIdNotFoundException.class);
// Act
sut.deletePolicy(policyId);
}
@Test
public void testDeletePolicy_Throws_PolicyIdNotFoundException_By_Null() {
// Arrange
final String policyId = null;
thrown.expect(PolicyIdNotFoundException.class);
// Act
sut.deletePolicy(policyId);
}
@Test
public void testDeletePolicy_Throws_PolicyNotFoundException() {
// Arrange
final String policyId = "policyId";
doThrow(EmptyResultDataAccessException.class).when(policyRepository)
.delete(policyId);
thrown.expect(PolicyNotFoundException.class);
// Act
sut.deletePolicy(policyId);
}
@Test
public void testGetAllPolicyMetadata() throws UnsupportedEncodingException {
// Arrange
final Policy p1 = new Policy();
p1.setId(POLICY_ID1);
p1.setPolicy(POLICY_STRING1.getBytes("UTF-8"));
p1.setValid(true);
final Policy p2 = new Policy();
p2.setId(POLICY_ID2);
p2.setPolicy(POLICY_STRING2.getBytes("UTF-8"));
p2.setValid(false);
final List<Policy> policyList = Arrays.asList(p1, p2);
final PolicyMetadataDto m1 = new PolicyMetadataDto();
final PolicyMetadataDto m2 = new PolicyMetadataDto();
m1.setId(p1.getId());
m1.setValid(p1.isValid());
m2.setId(p2.getId());
m2.setValid(p2.isValid());
when(policyRepository.findAll()).thenReturn(policyList);
when(modelMapper.map(p1, PolicyMetadataDto.class)).thenReturn(m1);
when(modelMapper.map(p2, PolicyMetadataDto.class)).thenReturn(m2);
// Act
final PolicyMetadataContainerDto response = sut.getAllPolicyMetadata();
// Assert
assertEquals(policyList.size(), response.getPolicies().size());
assertEquals(p1.getId(), response.getPolicies().get(0).getId());
assertEquals(p1.isValid(), response.getPolicies().get(0).isValid());
assertEquals(p2.getId(), response.getPolicies().get(1).getId());
assertEquals(p2.isValid(), response.getPolicies().get(1).isValid());
}
@Test
public void testGetAllPolicyMetadata_Throws_PolicyNotFoundException()
throws UnsupportedEncodingException {
// Arrange
thrown.expect(PolicyNotFoundException.class);
final List<Policy> policyList = new ArrayList<Policy>();
when(policyRepository.findAll()).thenReturn(policyList);
// Act
sut.getAllPolicyMetadata();
}
@Test
public void testGetPolicies_No_Wildcard() {
// Arrange
final String policyId = "policyId";
final String wildcard = null;
final Policy policy = mock(Policy.class);
final PolicyDto getPolicyResponseDto = mock(PolicyDto.class);
when(policyRepository.findOne(policyId)).thenReturn(policy);
when(modelMapper.map(policy, PolicyDto.class)).thenReturn(
getPolicyResponseDto);
// Act
final PolicyContainerDto response = sut.getPolicies(policyId, wildcard);
// Assert
assertEquals(getPolicyResponseDto, response.getPolicies().get(0));
}
@Test
public void testGetPolicies_No_Wildcard_Throws_PolicyNotFoundException() {
// Arrange
final String policyId = "policyId";
final String wildcard = null;
thrown.expect(PolicyNotFoundException.class);
when(policyRepository.findOne(policyId)).thenReturn(null);
// Act
sut.getPolicies(policyId, wildcard);
}
@Test
public void testGetPolicies_Throws_PolicyIdNotFoundException() {
// Arrange
final String policyId = "";
final String wildcard = null;
thrown.expect(PolicyIdNotFoundException.class);
// Assert
sut.getPolicies(policyId, wildcard);
}
@Test
public void testGetPolicies_Wildcard_Used() {
// Arrange
final String policyId = "policy*";
final String wildcard = "*";
final String policyIdLike = "policy%";
final Policy policy1 = mock(Policy.class);
final Policy policy2 = mock(Policy.class);
final List<Policy> policyList = Arrays.asList(policy1, policy2);
final PolicyDto getPolicyResponseDto1 = mock(PolicyDto.class);
final PolicyDto getPolicyResponseDto2 = mock(PolicyDto.class);
when(policyRepository.findAllByIdLike(policyIdLike)).thenReturn(
policyList);
when(modelMapper.map(policy1, PolicyDto.class)).thenReturn(
getPolicyResponseDto1);
when(modelMapper.map(policy2, PolicyDto.class)).thenReturn(
getPolicyResponseDto2);
// Act
final PolicyContainerDto response = sut.getPolicies(policyId, wildcard);
// Assert
assertTrue(response.getPolicies().contains(getPolicyResponseDto1));
assertTrue(response.getPolicies().contains(getPolicyResponseDto2));
}
@Test
public void testGetPolicies_Wildcard_Used_Throws_PolicyNotFoundException() {
// Arrange
final String policyId = "policy*";
final String wildcard = "*";
final String policyIdLike = "policy%";
thrown.expect(PolicyNotFoundException.class);
final List<Policy> policyList = Collections.emptyList();
when(policyRepository.findAllByIdLike(policyIdLike)).thenReturn(
policyList);
// Act
sut.getPolicies(policyId, wildcard);
}
@Test
public void testGetPoliciesCombinedAsPolicySet()
throws UnsupportedEncodingException {
// Arrange
final String policyId = "C2S*";
final String wildcard = "*";
final String policyCombiningAlgId = "permit-overrides";
final String policyCombiningAlgIdReturned = "urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:permit-overrides";
final PolicyServiceImpl spy = spy(sut);
final PolicyContainerDto getPolicyResponseContainerDto = new PolicyContainerDto();
final PolicyDto p1 = new PolicyDto();
p1.setId(POLICY_ID1);
p1.setPolicy(POLICY_STRING1.getBytes("UTF-8"));
p1.setValid(true);
final PolicyDto p2 = new PolicyDto();
p2.setId(POLICY_ID2);
p2.setPolicy(POLICY_STRING2.getBytes("UTF-8"));
p1.setValid(true);
getPolicyResponseContainerDto.setPolicies(Arrays.asList(p1, p2));
doReturn(getPolicyResponseContainerDto).when(spy).getPolicies(policyId,
wildcard);
when(
policyCombiningAlgIdValidator
.validateAndReturn(policyCombiningAlgId)).thenReturn(
policyCombiningAlgIdReturned);
// Act
final PolicyDto response = spy.getPoliciesCombinedAsPolicySet(policyId,
wildcard, null, policyCombiningAlgId);
// Assert
assertNotNull(response.getPolicy());
assertTrue(StringUtils.hasText(getNode(
bytesToDocument(response.getPolicy()),
XACMLXPath.XPATH_POLICY_SET_ID).get().getNodeValue()));
assertEquals(
policyCombiningAlgIdReturned,
getNode(bytesToDocument(response.getPolicy()),
XACMLXPath.XPATH_POLICY_SET_POLICY_COMBINING_ALG_ID)
.get().getNodeValue());
}
@Test
public void testGetPoliciesCombinedAsPolicySet_Custom_PolicySetId()
throws UnsupportedEncodingException {
// Arrange
final String policyId = "C2S*";
final String wildcard = "*";
final String policyCombiningAlgId = "permit-overrides";
final String policyCombiningAlgIdReturned = "urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:permit-overrides";
final String policySetId = "policySetId";
final PolicyServiceImpl spy = spy(sut);
final PolicyContainerDto getPolicyResponseContainerDto = new PolicyContainerDto();
final PolicyDto p1 = new PolicyDto();
p1.setId(POLICY_ID1);
p1.setPolicy(POLICY_STRING1.getBytes("UTF-8"));
p1.setValid(true);
final PolicyDto p2 = new PolicyDto();
p2.setId(POLICY_ID2);
p2.setPolicy(POLICY_STRING2.getBytes("UTF-8"));
p1.setValid(true);
getPolicyResponseContainerDto.setPolicies(Arrays.asList(p1, p2));
doReturn(getPolicyResponseContainerDto).when(spy).getPolicies(policyId,
wildcard);
when(
policyCombiningAlgIdValidator
.validateAndReturn(policyCombiningAlgId)).thenReturn(
policyCombiningAlgIdReturned);
// Act
final PolicyDto response = spy.getPoliciesCombinedAsPolicySet(policyId,
wildcard, policySetId, policyCombiningAlgId);
// Assert
assertNotNull(response.getPolicy());
assertEquals(
policySetId,
getNode(bytesToDocument(response.getPolicy()),
XACMLXPath.XPATH_POLICY_SET_ID).get().getNodeValue());
assertEquals(
policyCombiningAlgIdReturned,
getNode(bytesToDocument(response.getPolicy()),
XACMLXPath.XPATH_POLICY_SET_POLICY_COMBINING_ALG_ID)
.get().getNodeValue());
}
@SuppressWarnings("unchecked")
@Test
public void testGetPoliciesCombinedAsPolicySet_Throws_InvalidPolicyCombiningAlgIdException()
throws UnsupportedEncodingException {
// Arrange
thrown.expect(InvalidPolicyCombiningAlgIdException.class);
final String policyId = "C2S*";
final String wildcard = "*";
final String policyCombiningAlgId = "permit-overrides";
@SuppressWarnings("unused")
final String policyCombiningAlgIdReturned = "urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:permit-overrides";
final PolicyServiceImpl spy = spy(sut);
final PolicyContainerDto getPolicyResponseContainerDto = new PolicyContainerDto();
final PolicyDto p1 = new PolicyDto();
p1.setId(POLICY_ID1);
p1.setPolicy(POLICY_STRING1.getBytes("UTF-8"));
p1.setValid(true);
final PolicyDto p2 = new PolicyDto();
p2.setId(POLICY_ID2);
p2.setPolicy(POLICY_STRING2.getBytes("UTF-8"));
p1.setValid(true);
getPolicyResponseContainerDto.setPolicies(Arrays.asList(p1, p2));
doReturn(getPolicyResponseContainerDto).when(spy).getPolicies(policyId,
wildcard);
when(
policyCombiningAlgIdValidator
.validateAndReturn(policyCombiningAlgId)).thenThrow(
InvalidPolicyCombiningAlgIdException.class);
// Act
spy.getPoliciesCombinedAsPolicySet(policyId, wildcard, null,
policyCombiningAlgId);
}
@SuppressWarnings("unchecked")
@Test
public void testGetPoliciesCombinedAsPolicySet_Throws_PolicyCombiningAlgIdNotFoundException()
throws UnsupportedEncodingException {
// Arrange
thrown.expect(PolicyCombiningAlgIdNotFoundException.class);
final String policyId = "C2S*";
final String wildcard = "*";
final String policyCombiningAlgId = "permit-overrides";
@SuppressWarnings("unused")
final String policyCombiningAlgIdReturned = "urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:permit-overrides";
final PolicyServiceImpl spy = spy(sut);
final PolicyContainerDto getPolicyResponseContainerDto = new PolicyContainerDto();
final PolicyDto p1 = new PolicyDto();
p1.setId(POLICY_ID1);
p1.setPolicy(POLICY_STRING1.getBytes("UTF-8"));
p1.setValid(true);
final PolicyDto p2 = new PolicyDto();
p2.setId(POLICY_ID2);
p2.setPolicy(POLICY_STRING2.getBytes("UTF-8"));
p1.setValid(true);
getPolicyResponseContainerDto.setPolicies(Arrays.asList(p1, p2));
doReturn(getPolicyResponseContainerDto).when(spy).getPolicies(policyId,
wildcard);
when(
policyCombiningAlgIdValidator
.validateAndReturn(policyCombiningAlgId)).thenThrow(
PolicyCombiningAlgIdNotFoundException.class);
// Act
spy.getPoliciesCombinedAsPolicySet(policyId, wildcard, null,
policyCombiningAlgId);
}
@Test
public void testUpdatePolicy() throws UnsupportedEncodingException {
// Arrange
final byte[] policyBytes = POLICY_STRING1.getBytes("UTF-8");
final PolicyContentDto updatePolicyRequestDto = mock(PolicyContentDto.class);
final Policy policy = mock(Policy.class);
when(updatePolicyRequestDto.getPolicy()).thenReturn(policyBytes);
when(policyRepository.findOne(POLICY_ID1)).thenReturn(policy);
final PolicyMetadataDto updatePolicyResponseDto = mock(PolicyMetadataDto.class);
when(modelMapper.map(policy, PolicyMetadataDto.class)).thenReturn(
updatePolicyResponseDto);
// Act
final PolicyMetadataDto response = sut.updatePolicy(
updatePolicyRequestDto, POLICY_ID1);
// Assert
verify(policy, times(1)).setPolicy(policyBytes);
verify(policy, times(1)).setValid(true);
verify(policyRepository, times(1)).save(policy);
assertEquals(updatePolicyResponseDto, response);
}
@Test
public void testUpdatePolicy_Throws_PolicyIdNotFoundException()
throws UnsupportedEncodingException {
// Arrange
thrown.expect(PolicyIdNotFoundException.class);
final String policyId = "";
final PolicyContentDto updatePolicyRequestDto = mock(PolicyContentDto.class);
// Act
sut.updatePolicy(updatePolicyRequestDto, policyId);
}
@BeforeClass
public static void setUp() throws Exception {
SimplePDPFactory.getSimplePDP();
}
}