You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CassandraMetadataRepositoryTest.java 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package org.apache.archiva.metadata.repository.cassandra;
  2. /*
  3. * Licensed to the Apache Software Foundation (ASF) under one
  4. * or more contributor license agreements. See the NOTICE file
  5. * distributed with this work for additional information
  6. * regarding copyright ownership. The ASF licenses this file
  7. * to you under the Apache License, Version 2.0 (the
  8. * "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing,
  14. * software distributed under the License is distributed on an
  15. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  16. * KIND, either express or implied. See the License for the
  17. * specific language governing permissions and limitations
  18. * under the License.
  19. */
  20. import com.datastax.oss.driver.api.core.CqlSession;
  21. import org.apache.archiva.metadata.model.MetadataFacetFactory;
  22. import org.apache.archiva.metadata.repository.AbstractMetadataRepositoryTest;
  23. import org.apache.archiva.metadata.repository.MetadataRepository;
  24. import org.apache.archiva.metadata.repository.MetadataService;
  25. import org.apache.archiva.metadata.repository.RepositorySession;
  26. import org.apache.archiva.metadata.repository.RepositorySessionFactory;
  27. import org.apache.archiva.metadata.repository.cassandra.model.ProjectVersionMetadataModel;
  28. import org.junit.jupiter.api.AfterAll;
  29. import org.junit.jupiter.api.AfterEach;
  30. import org.junit.jupiter.api.BeforeEach;
  31. import org.junit.jupiter.api.Test;
  32. import org.junit.jupiter.api.TestInstance;
  33. import org.junit.jupiter.api.extension.ExtendWith;
  34. import org.slf4j.Logger;
  35. import org.slf4j.LoggerFactory;
  36. import org.springframework.test.context.ContextConfiguration;
  37. import org.springframework.test.context.junit.jupiter.SpringExtension;
  38. import org.testcontainers.containers.CassandraContainer;
  39. import org.testcontainers.containers.output.Slf4jLogConsumer;
  40. import org.testcontainers.utility.DockerImageName;
  41. import javax.inject.Inject;
  42. import javax.inject.Named;
  43. import java.nio.file.Files;
  44. import java.nio.file.Path;
  45. import java.nio.file.Paths;
  46. import java.util.Arrays;
  47. import java.util.List;
  48. import java.util.concurrent.CompletableFuture;
  49. import java.util.concurrent.CompletionStage;
  50. import java.util.concurrent.atomic.AtomicBoolean;
  51. import java.util.stream.Collectors;
  52. import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.truncate;
  53. import static org.assertj.core.api.Assertions.assertThat;
  54. import static org.mockito.Mockito.mock;
  55. import static org.mockito.Mockito.when;
  56. /**
  57. * @author Olivier Lamy
  58. */
  59. @ExtendWith( SpringExtension.class )
  60. @TestInstance( TestInstance.Lifecycle.PER_CLASS )
  61. @ContextConfiguration( locations = {"classpath*:/META-INF/spring-context.xml"} )
  62. public class CassandraMetadataRepositoryTest
  63. extends AbstractMetadataRepositoryTest
  64. {
  65. private static final Logger LOGGER = LoggerFactory.getLogger( CassandraMetadataRepositoryTest.class );
  66. @Inject
  67. @Named(value = "archivaEntityManagerFactory#cassandra")
  68. CassandraArchivaManager cassandraArchivaManager;
  69. CassandraMetadataRepository cmr;
  70. RepositorySessionFactory sessionFactory;
  71. RepositorySession session;
  72. private static final CassandraContainer CASSANDRA =
  73. new CassandraContainer(DockerImageName.parse("cassandra")
  74. .withTag(System.getProperty("cassandraVersion","3.11.2")));
  75. // because of @ExtendWith( SpringExtension.class ) @BeforeAll will not be executed before spring resolution so need to use this...
  76. static {
  77. LOGGER.info("initCassandra");
  78. CASSANDRA.withLogConsumer(new Slf4jLogConsumer(LoggerFactory.getLogger("org.apache.archiva.metadata.repository.cassandra.logs")));
  79. CASSANDRA.start();
  80. System.setProperty("cassandra.host", CASSANDRA.getHost());
  81. System.setProperty("cassandra.port", CASSANDRA.getMappedPort(9042).toString());
  82. }
  83. long cTime;
  84. int testNum = 0;
  85. final AtomicBoolean clearedTables = new AtomicBoolean( false );
  86. @Override
  87. protected RepositorySessionFactory getSessionFactory( )
  88. {
  89. return sessionFactory;
  90. }
  91. @Override
  92. protected MetadataRepository getRepository( )
  93. {
  94. return cmr;
  95. }
  96. @AfterAll
  97. public static void stopCassandra()
  98. throws Exception {
  99. CASSANDRA.close();
  100. }
  101. @BeforeEach
  102. @Override
  103. public void setUp()
  104. throws Exception
  105. {
  106. cTime = System.currentTimeMillis( );
  107. super.setUp();
  108. assertMaxTries =1;
  109. assertRetrySleepMs=10;
  110. Path directory = Paths.get( "target/test-repositories" );
  111. if ( Files.exists(directory) )
  112. {
  113. org.apache.archiva.common.utils.FileUtils.deleteDirectory( directory );
  114. }
  115. List<MetadataFacetFactory> factories = createTestMetadataFacetFactories();
  116. MetadataService metadataService = new MetadataService( );
  117. metadataService.setMetadataFacetFactories( factories );
  118. this.cmr = new CassandraMetadataRepository( metadataService, cassandraArchivaManager );
  119. sessionFactory = mock( RepositorySessionFactory.class );
  120. session = mock( RepositorySession.class );
  121. when( sessionFactory.createSession( ) ).thenReturn( session );
  122. if (!clearedTables.get())
  123. {
  124. clearReposAndNamespace( cassandraArchivaManager, clearedTables );
  125. }
  126. }
  127. /**
  128. * ensure all dependant tables are cleaned up (mailinglist, license, dependencies)
  129. *
  130. * @throws Exception
  131. */
  132. @Test
  133. public void clean_dependant_tables()
  134. throws Exception
  135. {
  136. super.testUpdateProjectVersionMetadataWithAllElements();
  137. String key = new ProjectVersionMetadataModel.KeyBuilder().withRepository( TEST_REPO_ID ) //
  138. .withNamespace( TEST_NAMESPACE ) //
  139. .withProjectId( TEST_PROJECT ) //
  140. .withProjectVersion( TEST_PROJECT_VERSION ) //
  141. .withId( TEST_PROJECT_VERSION ) //
  142. .build();
  143. this.cmr.removeProjectVersion( null, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION );
  144. assertThat(
  145. cmr.getProjectVersion( null , TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ) ).isNull();
  146. assertThat( cmr.getMailingLists( key ) ).isNotNull().isEmpty();
  147. assertThat( cmr.getLicenses( key ) ).isNotNull().isEmpty();
  148. assertThat( cmr.getDependencies( key ) ).isNotNull().isEmpty();
  149. }
  150. @AfterEach
  151. public void shutdown()
  152. throws Exception
  153. {
  154. clearReposAndNamespace( cassandraArchivaManager, clearedTables );
  155. super.tearDown();
  156. }
  157. static void clearReposAndNamespace( final CassandraArchivaManager cassandraArchivaManager, final AtomicBoolean clearedFlag )
  158. throws Exception
  159. {
  160. if (cassandraArchivaManager!=null)
  161. {
  162. CqlSession session = cassandraArchivaManager.getSession( );
  163. {
  164. List<String> tables = Arrays.asList(
  165. cassandraArchivaManager.getProjectFamilyName( ),
  166. cassandraArchivaManager.getNamespaceFamilyName( ),
  167. cassandraArchivaManager.getRepositoryFamilyName( ),
  168. cassandraArchivaManager.getProjectVersionMetadataFamilyName( ),
  169. cassandraArchivaManager.getArtifactMetadataFamilyName( ),
  170. cassandraArchivaManager.getMetadataFacetFamilyName( ),
  171. cassandraArchivaManager.getMailingListFamilyName( ),
  172. cassandraArchivaManager.getLicenseFamilyName( ),
  173. cassandraArchivaManager.getDependencyFamilyName( )
  174. );
  175. CompletableFuture.allOf(tables.stream()
  176. .map(table -> session.executeAsync(truncate(table).build()))
  177. .map( CompletionStage::toCompletableFuture ).collect( Collectors.toList( ) ).toArray( new CompletableFuture[0] ) )
  178. .whenComplete( ( c, e ) -> {
  179. if ( clearedFlag != null ) clearedFlag.set( true );
  180. if (e!=null) {
  181. System.err.println( "TRUNCATE ERROR DETECTED: " + e.getMessage( ) );
  182. }
  183. } ).get( )
  184. ;
  185. }
  186. } else {
  187. System.err.println( "cassandraArchivaManager is null" );
  188. }
  189. }
  190. static void clearReposAndNamespace( final CassandraArchivaManager cassandraArchivaManager)
  191. throws Exception {
  192. clearReposAndNamespace( cassandraArchivaManager, null );
  193. }
  194. }