content: // Licensed to the Apache Software Foundation (ASF) under one or more
  // contributor license agreements.  See the NOTICE file distributed with
  // this work for additional information regarding copyright ownership.
  // The ASF licenses this file to You under the Apache License, Version 2.0
  // (the "License"); you may not use this file except in compliance with
  // the License.  You may obtain a copy of the License at
  //
  //   http://www.apache.org/licenses/LICENSE-2.0
  //
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  package com.cloud.vpc;
  
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.network.NetworkModel;
  import com.cloud.network.dao.NetrisProviderDao;
  import com.cloud.network.dao.NetworkDao;
  import com.cloud.network.dao.NsxProviderDao;
  import com.cloud.network.vpc.NetworkACLItemDao;
  import com.cloud.network.vpc.NetworkACLItemVO;
  import com.cloud.network.vpc.NetworkACLManager;
  import com.cloud.network.vpc.NetworkACLService;
  import com.cloud.network.vpc.NetworkACLServiceImpl;
  import com.cloud.network.vpc.NetworkACLVO;
  import com.cloud.network.vpc.Vpc;
  import com.cloud.network.vpc.VpcManager;
  import com.cloud.network.vpc.VpcService;
  import com.cloud.network.vpc.VpcVO;
  import com.cloud.network.vpc.dao.NetworkACLDao;
  import com.cloud.network.vpc.dao.VpcDao;
  import com.cloud.network.vpc.dao.VpcGatewayDao;
  import com.cloud.tags.dao.ResourceTagDao;
  import com.cloud.user.Account;
  import com.cloud.user.AccountManager;
  import com.cloud.user.AccountVO;
  import com.cloud.user.User;
  import com.cloud.user.UserVO;
  import com.cloud.utils.component.ComponentContext;
  import com.cloud.utils.db.EntityManager;
  import junit.framework.TestCase;
  import org.apache.cloudstack.context.CallContext;
  import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
  import org.apache.cloudstack.test.utils.SpringUtils;
  import org.junit.After;
  import org.junit.Before;
  import org.junit.Test;
  import org.junit.runner.RunWith;
  import org.mockito.ArgumentMatchers;
  import org.mockito.Mockito;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.ComponentScan;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.context.annotation.FilterType;
  import org.springframework.core.type.classreading.MetadataReader;
  import org.springframework.core.type.classreading.MetadataReaderFactory;
  import org.springframework.core.type.filter.TypeFilter;
  import org.springframework.test.context.ContextConfiguration;
  import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  import org.springframework.test.context.support.AnnotationConfigContextLoader;
  
  import javax.inject.Inject;
  import java.io.IOException;
  import java.util.UUID;
  
  @RunWith(SpringJUnit4ClassRunner.class)
  @ContextConfiguration(loader = AnnotationConfigContextLoader.class)
  public class NetworkACLServiceTest extends TestCase {
  
      @Inject
      private NetworkACLService _aclService;
      @Inject
      private NetworkACLManager _networkAclMgr;
      @Inject
      private NetworkACLDao _networkACLDao;
      @Inject
      private NetworkACLItemDao _networkACLItemDao;
      @Inject
      private EntityManager _entityMgr;
      @Inject
      private NsxProviderDao nsxProviderDao;
      @Inject
      private NetrisProviderDao netrisProviderDao;
  
      private NetworkACLVO acl;
      private NetworkACLItemVO aclItem;
  
      @Override
      @Before
      public void setUp() {
          ComponentContext.initComponentsLifeCycle();
          Account account = new AccountVO("testaccount", 1, "testdomain", Account.Type.NORMAL, UUID.randomUUID().toString());
          UserVO user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", UUID.randomUUID().toString(), User.Source.UNKNOWN);
  
          CallContext.register(user, account);
      }
  
      @Override
      @After
      public void tearDown() {
          CallContext.unregister();
      }
  
      @Test(expected = InvalidParameterValueException.class)
      public void testDeleteDefaultACL() throws Exception {
          Mockito.when(_networkACLDao.findById(ArgumentMatchers.anyLong())).thenReturn(acl);
          Mockito.when(_networkAclMgr.deleteNetworkACL(acl)).thenReturn(true);
          _aclService.deleteNetworkACL(1L);
      }
  
      @Test
      public void testDeleteACLItem() throws Exception {
          Mockito.when(_networkACLItemDao.findById(ArgumentMatchers.anyLong())).thenReturn(aclItem);
          Mockito.when(_networkAclMgr.getNetworkACL(ArgumentMatchers.anyLong())).thenReturn(acl);
          Mockito.when(_networkAclMgr.revokeNetworkACLItem(ArgumentMatchers.anyLong())).thenReturn(true);
          Mockito.when(_entityMgr.findById(Mockito.eq(Vpc.class), Mockito.anyLong())).thenReturn(new VpcVO());
          assertTrue(_aclService.revokeNetworkACLItem(1L));
      }
  
      @Configuration
      @ComponentScan(basePackageClasses = {NetworkACLServiceImpl.class}, includeFilters = {
              @ComponentScan.Filter(value = NetworkACLTestConfiguration.Library.class, type = FilterType.CUSTOM)}, useDefaultFilters = false)
      public static class NetworkACLTestConfiguration extends SpringUtils.CloudStackTestConfiguration {
  
          @Bean
          public EntityManager entityManager() {
              return Mockito.mock(EntityManager.class);
          }
  
          @Bean
          public AccountManager accountManager() {
              return Mockito.mock(AccountManager.class);
          }
  
          @Bean
          public NetworkOrchestrationService networkManager() {
              return Mockito.mock(NetworkOrchestrationService.class);
          }
  
          @Bean
          public NetworkModel networkModel() {
              return Mockito.mock(NetworkModel.class);
          }
  
          @Bean
          public VpcManager vpcManager() {
              return Mockito.mock(VpcManager.class);
          }
  
          @Bean
          public ResourceTagDao resourceTagDao() {
              return Mockito.mock(ResourceTagDao.class);
          }
  
          @Bean
          public NetworkACLDao networkACLDao() {
              return Mockito.mock(NetworkACLDao.class);
          }
  
          @Bean
          public NetworkACLItemDao networkACLItemDao() {
              return Mockito.mock(NetworkACLItemDao.class);
          }
  
          @Bean
          public NetworkDao networkDao() {
              return Mockito.mock(NetworkDao.class);
          }
  
          @Bean
          public NetworkACLManager networkACLManager() {
              return Mockito.mock(NetworkACLManager.class);
          }
  
          @Bean
          public VpcGatewayDao vpcGatewayDao() {
              return Mockito.mock(VpcGatewayDao.class);
          }
  
          @Bean
          public VpcDao vpcDao() {
              return Mockito.mock(VpcDao.class);
          }
  
          @Bean
          public VpcService vpcService() {
              return Mockito.mock(VpcService.class);
          }
  
          @Bean
          public NsxProviderDao nsxProviderDao() { return Mockito.mock(NsxProviderDao.class); }
  
          @Bean
          public NetrisProviderDao netrisProviderDao() { return Mockito.mock(NetrisProviderDao.class); }
  
          public static class Library implements TypeFilter {
              @Override
              public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException {
                  mdr.getClassMetadata().getClassName();
                  ComponentScan cs = NetworkACLTestConfiguration.class.getAnnotation(ComponentScan.class);
                  return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs);
              }
          }
      }
  
  }
  