- Moved MusicFolderTestData from org.airsonic.player.service to org.airsonic.player.utilmaster
parent
4a728ed9a6
commit
4ce892e39d
@ -0,0 +1,138 @@ |
||||
package org.airsonic.player.service.search; |
||||
|
||||
import java.util.Map; |
||||
import java.util.concurrent.atomic.AtomicBoolean; |
||||
import java.util.function.Function; |
||||
|
||||
import org.airsonic.player.TestCaseUtils; |
||||
import org.airsonic.player.dao.DaoHelper; |
||||
import org.airsonic.player.dao.MusicFolderDao; |
||||
import org.airsonic.player.service.MediaScannerService; |
||||
import org.airsonic.player.service.SettingsService; |
||||
import org.airsonic.player.util.HomeRule; |
||||
import org.airsonic.player.util.MusicFolderTestData; |
||||
import org.junit.ClassRule; |
||||
import org.junit.Rule; |
||||
import org.junit.rules.TemporaryFolder; |
||||
import org.junit.runner.Description; |
||||
import org.junit.runners.model.Statement; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.stereotype.Component; |
||||
import org.springframework.test.annotation.DirtiesContext; |
||||
import org.springframework.test.context.ContextConfiguration; |
||||
import org.springframework.test.context.junit4.rules.SpringClassRule; |
||||
import org.springframework.test.context.junit4.rules.SpringMethodRule; |
||||
|
||||
@ContextConfiguration(locations = { |
||||
"/applicationContext-service.xml", |
||||
"/applicationContext-cache.xml", |
||||
"/applicationContext-testdb.xml"}) |
||||
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) |
||||
@Component |
||||
/** |
||||
* Abstract class for scanning MusicFolder. |
||||
*/ |
||||
public abstract class AbstractAirsonicHomeTest implements AirsonicHomeTest { |
||||
|
||||
@ClassRule |
||||
public static final SpringClassRule classRule = new SpringClassRule() { |
||||
HomeRule homeRule = new HomeRule(); |
||||
|
||||
@Override |
||||
public Statement apply(Statement base, Description description) { |
||||
Statement spring = super.apply(base, description); |
||||
return homeRule.apply(spring, description); |
||||
} |
||||
}; |
||||
|
||||
/* |
||||
* Currently, Maven is executing test classes in series, |
||||
* so this class can hold the state. |
||||
* When executing in parallel, subclasses should override this. |
||||
*/ |
||||
private static AtomicBoolean dataBasePopulated = new AtomicBoolean(); |
||||
|
||||
// Above.
|
||||
private static AtomicBoolean dataBaseReady = new AtomicBoolean(); |
||||
|
||||
protected final static Function<String, String> resolveBaseMediaPath = (childPath) -> { |
||||
return MusicFolderTestData.resolveBaseMediaPath().concat(childPath); |
||||
}; |
||||
|
||||
@Autowired |
||||
protected DaoHelper daoHelper; |
||||
|
||||
@Autowired |
||||
protected MediaScannerService mediaScannerService; |
||||
|
||||
@Autowired |
||||
protected MusicFolderDao musicFolderDao; |
||||
|
||||
@Autowired |
||||
protected SettingsService settingsService; |
||||
|
||||
@Rule |
||||
public final SpringMethodRule springMethodRule = new SpringMethodRule(); |
||||
|
||||
@Rule |
||||
public TemporaryFolder temporaryFolder = new TemporaryFolder(); |
||||
|
||||
@Override |
||||
public AtomicBoolean dataBasePopulated() { |
||||
return dataBasePopulated; |
||||
} |
||||
|
||||
@Override |
||||
public AtomicBoolean dataBaseReady() { |
||||
return dataBaseReady; |
||||
} |
||||
|
||||
@Override |
||||
public final void populateDatabaseOnlyOnce() { |
||||
if (!dataBasePopulated().get()) { |
||||
dataBasePopulated().set(true); |
||||
getMusicFolders().forEach(musicFolderDao::createMusicFolder); |
||||
settingsService.clearMusicFolderCache(); |
||||
try { |
||||
// Await time to avoid scan failure.
|
||||
for (int i = 0; i < 10; i++) { |
||||
Thread.sleep(100); |
||||
} |
||||
} catch (InterruptedException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
TestCaseUtils.execScan(mediaScannerService); |
||||
System.out.println("--- Report of records count per table ---"); |
||||
Map<String, Integer> records = TestCaseUtils.recordsInAllTables(daoHelper); |
||||
records.keySet().stream().filter(s -> |
||||
s.equals("MEDIA_FILE") |
||||
| s.equals("ARTIST") |
||||
| s.equals("MUSIC_FOLDER") |
||||
| s.equals("ALBUM")) |
||||
.forEach(tableName -> |
||||
System.out.println("\t" + tableName + " : " + records.get(tableName).toString())); |
||||
System.out.println("--- *********************** ---"); |
||||
try { |
||||
// Await for Lucene to finish writing(asynchronous).
|
||||
for (int i = 0; i < 5; i++) { |
||||
Thread.sleep(100); |
||||
} |
||||
} catch (InterruptedException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
dataBaseReady().set(true); |
||||
} else { |
||||
while (!dataBaseReady().get()) { |
||||
try { |
||||
// The subsequent test method waits while reading DB data.
|
||||
for (int i = 0; i < 10; i++) { |
||||
Thread.sleep(100); |
||||
} |
||||
} catch (InterruptedException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,45 @@ |
||||
package org.airsonic.player.service.search; |
||||
|
||||
import java.util.List; |
||||
import java.util.concurrent.atomic.AtomicBoolean; |
||||
|
||||
import org.airsonic.player.domain.MusicFolder; |
||||
import org.airsonic.player.util.MusicFolderTestData; |
||||
|
||||
/** |
||||
* Test case interface for scanning MusicFolder. |
||||
*/ |
||||
public interface AirsonicHomeTest { |
||||
|
||||
/** |
||||
* MusicFolder used by test class. |
||||
* |
||||
* @return MusicFolder used by test class
|
||||
*/ |
||||
default List<MusicFolder> getMusicFolders() { |
||||
return MusicFolderTestData.getTestMusicFolders(); |
||||
}; |
||||
|
||||
/** |
||||
* Whether the data input has been completed. |
||||
* |
||||
* @return Static AtomicBoolean indicating whether the data injection has been |
||||
* completed |
||||
*/ |
||||
abstract AtomicBoolean dataBasePopulated(); |
||||
|
||||
/** |
||||
* Whether the data input has been completed. |
||||
* |
||||
* @return Static AtomicBoolean indicating whether the data injection has been |
||||
* completed |
||||
*/ |
||||
abstract AtomicBoolean dataBaseReady(); |
||||
|
||||
/** |
||||
* Populate the database only once. |
||||
* It is called in the @Before granted method. |
||||
*/ |
||||
void populateDatabaseOnlyOnce(); |
||||
|
||||
} |
Loading…
Reference in new issue