- 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