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 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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.easymock.EasyMock;
  29. import org.easymock.IMocksControl;
  30. import org.junit.jupiter.api.AfterEach;
  31. import org.junit.jupiter.api.BeforeEach;
  32. import org.junit.jupiter.api.Test;
  33. import org.junit.jupiter.api.TestInfo;
  34. import org.junit.jupiter.api.TestInstance;
  35. import org.junit.jupiter.api.extension.ExtendWith;
  36. import org.springframework.test.context.junit.jupiter.SpringExtension;
  37. import javax.inject.Inject;
  38. import javax.inject.Named;
  39. import java.nio.file.Files;
  40. import java.nio.file.Path;
  41. import java.nio.file.Paths;
  42. import java.util.Arrays;
  43. import java.util.List;
  44. import java.util.concurrent.CompletableFuture;
  45. import java.util.concurrent.CompletionStage;
  46. import java.util.concurrent.atomic.AtomicBoolean;
  47. import java.util.stream.Collectors;
  48. import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.truncate;
  49. import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.dropTable;
  50. import static org.assertj.core.api.Assertions.assertThat;
  51. /**
  52. * @author Olivier Lamy
  53. */
  54. @ExtendWith( SpringExtension.class )
  55. @TestInstance( TestInstance.Lifecycle.PER_CLASS )
  56. public class CassandraMetadataRepositoryTest
  57. extends AbstractMetadataRepositoryTest
  58. {
  59. @Inject
  60. @Named(value = "archivaEntityManagerFactory#cassandra")
  61. CassandraArchivaManager cassandraArchivaManager;
  62. CassandraMetadataRepository cmr;
  63. IMocksControl sessionFactoryControl;
  64. RepositorySessionFactory sessionFactory;
  65. IMocksControl sessionControl;
  66. RepositorySession session;
  67. long cTime;
  68. int testNum = 0;
  69. final AtomicBoolean clearedTables = new AtomicBoolean( false );
  70. @Override
  71. protected RepositorySessionFactory getSessionFactory( )
  72. {
  73. return sessionFactory;
  74. }
  75. @Override
  76. protected MetadataRepository getRepository( )
  77. {
  78. return cmr;
  79. }
  80. @BeforeEach
  81. public void setUp( TestInfo testInfo )
  82. throws Exception
  83. {
  84. cTime = System.currentTimeMillis( );
  85. super.setUp();
  86. assertMaxTries =1;
  87. assertRetrySleepMs=10;
  88. Path directory = Paths.get( "target/test-repositories" );
  89. if ( Files.exists(directory) )
  90. {
  91. org.apache.archiva.common.utils.FileUtils.deleteDirectory( directory );
  92. }
  93. List<MetadataFacetFactory> factories = createTestMetadataFacetFactories();
  94. MetadataService metadataService = new MetadataService( );
  95. metadataService.setMetadataFacetFactories( factories );
  96. this.cmr = new CassandraMetadataRepository( metadataService, cassandraArchivaManager );
  97. sessionFactoryControl = EasyMock.createControl( );
  98. sessionFactory = sessionFactoryControl.createMock( RepositorySessionFactory.class );
  99. sessionControl = EasyMock.createControl( );
  100. session = sessionControl.createMock( RepositorySession.class );
  101. EasyMock.expect( sessionFactory.createSession( ) ).andStubReturn( session );
  102. sessionFactoryControl.replay();
  103. if (!clearedTables.get())
  104. {
  105. clearReposAndNamespace( cassandraArchivaManager, clearedTables );
  106. }
  107. }
  108. /**
  109. * ensure all dependant tables are cleaned up (mailinglist, license, dependencies)
  110. *
  111. * @throws Exception
  112. */
  113. @Test
  114. public void clean_dependant_tables()
  115. throws Exception
  116. {
  117. super.testUpdateProjectVersionMetadataWithAllElements();
  118. String key = new ProjectVersionMetadataModel.KeyBuilder().withRepository( TEST_REPO_ID ) //
  119. .withNamespace( TEST_NAMESPACE ) //
  120. .withProjectId( TEST_PROJECT ) //
  121. .withProjectVersion( TEST_PROJECT_VERSION ) //
  122. .withId( TEST_PROJECT_VERSION ) //
  123. .build();
  124. this.cmr.removeProjectVersion( null, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION );
  125. assertThat(
  126. cmr.getProjectVersion( null , TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ) ).isNull();
  127. assertThat( cmr.getMailingLists( key ) ).isNotNull().isEmpty();
  128. assertThat( cmr.getLicenses( key ) ).isNotNull().isEmpty();
  129. assertThat( cmr.getDependencies( key ) ).isNotNull().isEmpty();
  130. }
  131. @AfterEach
  132. public void shutdown(TestInfo testInfo)
  133. throws Exception
  134. {
  135. clearReposAndNamespace( cassandraArchivaManager, clearedTables );
  136. super.tearDown();
  137. }
  138. static void clearReposAndNamespace( final CassandraArchivaManager cassandraArchivaManager, final AtomicBoolean clearedFlag )
  139. throws Exception
  140. {
  141. if (cassandraArchivaManager!=null)
  142. {
  143. CqlSession session = cassandraArchivaManager.getSession( );
  144. {
  145. List<String> tables = Arrays.asList(
  146. cassandraArchivaManager.getProjectFamilyName( ),
  147. cassandraArchivaManager.getNamespaceFamilyName( ),
  148. cassandraArchivaManager.getRepositoryFamilyName( ),
  149. cassandraArchivaManager.getProjectVersionMetadataFamilyName( ),
  150. cassandraArchivaManager.getArtifactMetadataFamilyName( ),
  151. cassandraArchivaManager.getMetadataFacetFamilyName( ),
  152. cassandraArchivaManager.getMailingListFamilyName( ),
  153. cassandraArchivaManager.getLicenseFamilyName( ),
  154. cassandraArchivaManager.getDependencyFamilyName( )
  155. );
  156. CompletableFuture.allOf( tables.stream( ).map( table -> session.executeAsync( truncate( table ).build( ) ) )
  157. .map( CompletionStage::toCompletableFuture ).collect( Collectors.toList( ) ).toArray( new CompletableFuture[0] ) )
  158. .whenComplete( ( c, e ) -> {
  159. if ( clearedFlag != null ) clearedFlag.set( true );
  160. if (e!=null) {
  161. System.err.println( "TRUNCATE ERROR DETECTED: " + e.getMessage( ) );
  162. }
  163. } ).get( )
  164. ;
  165. }
  166. } else {
  167. System.err.println( "cassandraArchivaManager is null" );
  168. }
  169. }
  170. static void clearReposAndNamespace( final CassandraArchivaManager cassandraArchivaManager)
  171. throws Exception {
  172. clearReposAndNamespace( cassandraArchivaManager, null );
  173. }
  174. }