|
|
@ -3,8 +3,8 @@ package org.libresonic.player.service; |
|
|
|
import com.codahale.metrics.ConsoleReporter; |
|
|
|
import com.codahale.metrics.ConsoleReporter; |
|
|
|
import com.codahale.metrics.MetricRegistry; |
|
|
|
import com.codahale.metrics.MetricRegistry; |
|
|
|
import com.codahale.metrics.Timer; |
|
|
|
import com.codahale.metrics.Timer; |
|
|
|
import junit.framework.Assert; |
|
|
|
|
|
|
|
import org.apache.commons.io.IOUtils; |
|
|
|
import org.apache.commons.io.IOUtils; |
|
|
|
|
|
|
|
import org.junit.Assert; |
|
|
|
import org.junit.ClassRule; |
|
|
|
import org.junit.ClassRule; |
|
|
|
import org.junit.Rule; |
|
|
|
import org.junit.Rule; |
|
|
|
import org.junit.Test; |
|
|
|
import org.junit.Test; |
|
|
@ -38,16 +38,15 @@ import static org.junit.Assert.assertNotNull; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* A unit test class to test the MediaScannerService. |
|
|
|
* A unit test class to test the MediaScannerService. |
|
|
|
* |
|
|
|
* <p> |
|
|
|
* This class uses the Spring application context configuration present in the |
|
|
|
* This class uses the Spring application context configuration present in the |
|
|
|
* /org/libresonic/player/service/mediaScannerServiceTestCase/ directory. |
|
|
|
* /org/libresonic/player/service/mediaScannerServiceTestCase/ directory. |
|
|
|
* |
|
|
|
* <p> |
|
|
|
* The media library is found in the /MEDIAS directory. |
|
|
|
* The media library is found in the /MEDIAS directory. |
|
|
|
* It is composed of 2 musicFolders (Music and Music2) and several little weight audio files. |
|
|
|
* It is composed of 2 musicFolders (Music and Music2) and several little weight audio files. |
|
|
|
* |
|
|
|
* <p> |
|
|
|
* At runtime, the subsonic_home dir is set to target/test-classes/org/libresonic/player/service/mediaScannerServiceTestCase. |
|
|
|
* At runtime, the subsonic_home dir is set to target/test-classes/org/libresonic/player/service/mediaScannerServiceTestCase. |
|
|
|
* An empty database is created on the fly. |
|
|
|
* An empty database is created on the fly. |
|
|
|
* |
|
|
|
|
|
|
|
*/ |
|
|
|
*/ |
|
|
|
@ContextConfiguration(locations = { |
|
|
|
@ContextConfiguration(locations = { |
|
|
|
"/applicationContext-service.xml", |
|
|
|
"/applicationContext-service.xml", |
|
|
@ -57,44 +56,45 @@ import static org.junit.Assert.assertNotNull; |
|
|
|
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) |
|
|
|
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) |
|
|
|
public class MediaScannerServiceTestCase { |
|
|
|
public class MediaScannerServiceTestCase { |
|
|
|
|
|
|
|
|
|
|
|
@ClassRule |
|
|
|
@ClassRule |
|
|
|
public static final SpringClassRule classRule = new SpringClassRule() { |
|
|
|
public static final SpringClassRule classRule = new SpringClassRule() { |
|
|
|
LibresonicHomeRule libresonicRule = new LibresonicHomeRule(); |
|
|
|
LibresonicHomeRule libresonicRule = new LibresonicHomeRule(); |
|
|
|
@Override |
|
|
|
|
|
|
|
public Statement apply(Statement base, Description description) { |
|
|
|
@Override |
|
|
|
Statement spring = super.apply(base, description); |
|
|
|
public Statement apply(Statement base, Description description) { |
|
|
|
return libresonicRule.apply(spring, description); |
|
|
|
Statement spring = super.apply(base, description); |
|
|
|
} |
|
|
|
return libresonicRule.apply(spring, description); |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
@Rule |
|
|
|
@Rule |
|
|
|
public final SpringMethodRule springMethodRule = new SpringMethodRule(); |
|
|
|
public final SpringMethodRule springMethodRule = new SpringMethodRule(); |
|
|
|
|
|
|
|
|
|
|
|
private final MetricRegistry metrics = new MetricRegistry(); |
|
|
|
private final MetricRegistry metrics = new MetricRegistry(); |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
@Autowired |
|
|
|
private MediaScannerService mediaScannerService; |
|
|
|
private MediaScannerService mediaScannerService; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
@Autowired |
|
|
|
private MediaFileDao mediaFileDao; |
|
|
|
private MediaFileDao mediaFileDao; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
@Autowired |
|
|
|
private MusicFolderDao musicFolderDao; |
|
|
|
private MusicFolderDao musicFolderDao; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
@Autowired |
|
|
|
private DaoHelper daoHelper; |
|
|
|
private DaoHelper daoHelper; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
@Autowired |
|
|
|
private MediaFileService mediaFileService; |
|
|
|
private MediaFileService mediaFileService; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
@Autowired |
|
|
|
private ArtistDao artistDao; |
|
|
|
private ArtistDao artistDao; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
@Autowired |
|
|
|
private AlbumDao albumDao; |
|
|
|
private AlbumDao albumDao; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
@Autowired |
|
|
|
private SettingsService settingsService; |
|
|
|
private SettingsService settingsService; |
|
|
|
|
|
|
|
|
|
|
|
@Rule |
|
|
|
@Rule |
|
|
|
public TemporaryFolder temporaryFolder = new TemporaryFolder(); |
|
|
|
public TemporaryFolder temporaryFolder = new TemporaryFolder(); |
|
|
@ -103,58 +103,58 @@ public class MediaScannerServiceTestCase { |
|
|
|
ResourceLoader resourceLoader; |
|
|
|
ResourceLoader resourceLoader; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Tests the MediaScannerService by scanning the test media library into an empty database. |
|
|
|
* Tests the MediaScannerService by scanning the test media library into an empty database. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void testScanLibrary() { |
|
|
|
public void testScanLibrary() { |
|
|
|
MusicFolderTestData.getTestMusicFolders().forEach(musicFolderDao::createMusicFolder); |
|
|
|
MusicFolderTestData.getTestMusicFolders().forEach(musicFolderDao::createMusicFolder); |
|
|
|
settingsService.clearMusicFolderCache(); |
|
|
|
settingsService.clearMusicFolderCache(); |
|
|
|
|
|
|
|
|
|
|
|
Timer globalTimer = metrics.timer(MetricRegistry.name(MediaScannerServiceTestCase.class, "Timer.global")); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Timer.Context globalTimerContext = globalTimer.time(); |
|
|
|
|
|
|
|
TestCaseUtils.execScan(mediaScannerService); |
|
|
|
|
|
|
|
globalTimerContext.stop(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
System.out.println("--- Report of records count per table ---"); |
|
|
|
|
|
|
|
Map<String,Integer> records = TestCaseUtils.recordsInAllTables(daoHelper); |
|
|
|
|
|
|
|
records.keySet().forEach(tableName -> System.out.println(tableName+" : "+records.get(tableName).toString() )); |
|
|
|
|
|
|
|
System.out.println("--- *********************** ---"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Music Folder Music must have 3 children
|
|
|
|
|
|
|
|
List<MediaFile> listeMusicChildren = mediaFileDao.getChildrenOf(MusicFolderTestData.resolveMusicFolderPath()); |
|
|
|
|
|
|
|
Assert.assertEquals(3,listeMusicChildren.size()); |
|
|
|
|
|
|
|
// Music Folder Music2 must have 1 children
|
|
|
|
|
|
|
|
List<MediaFile> listeMusic2Children = mediaFileDao.getChildrenOf(MusicFolderTestData.resolveMusic2FolderPath()); |
|
|
|
|
|
|
|
Assert.assertEquals(1,listeMusic2Children.size()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
System.out.println("--- List of all artists ---"); |
|
|
|
|
|
|
|
System.out.println("artistName#albumCount"); |
|
|
|
|
|
|
|
List<Artist> allArtists = artistDao.getAlphabetialArtists(0,0,musicFolderDao.getAllMusicFolders()); |
|
|
|
|
|
|
|
allArtists.forEach(artist -> System.out.println(artist.getName()+"#"+artist.getAlbumCount())); |
|
|
|
|
|
|
|
System.out.println("--- *********************** ---"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
System.out.println("--- List of all albums ---"); |
|
|
|
|
|
|
|
System.out.println("name#artist"); |
|
|
|
|
|
|
|
List<Album> allAlbums = albumDao.getAlphabetialAlbums(0,0,true,musicFolderDao.getAllMusicFolders()); |
|
|
|
|
|
|
|
allAlbums.forEach(album -> System.out.println(album.getName()+"#"+album.getArtist())); |
|
|
|
|
|
|
|
Assert.assertEquals(5,allAlbums.size()); |
|
|
|
|
|
|
|
System.out.println("--- *********************** ---"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<MediaFile> listeSongs = mediaFileDao.getSongsByGenre("Baroque Instrumental",0,0,musicFolderDao.getAllMusicFolders()); |
|
|
|
|
|
|
|
Assert.assertEquals(2,listeSongs.size()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// display out metrics report
|
|
|
|
Timer globalTimer = metrics.timer(MetricRegistry.name(MediaScannerServiceTestCase.class, "Timer.global")); |
|
|
|
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics) |
|
|
|
|
|
|
|
.convertRatesTo(TimeUnit.SECONDS.SECONDS) |
|
|
|
|
|
|
|
.convertDurationsTo(TimeUnit.MILLISECONDS) |
|
|
|
|
|
|
|
.build(); |
|
|
|
|
|
|
|
reporter.report(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
System.out.print("End"); |
|
|
|
Timer.Context globalTimerContext = globalTimer.time(); |
|
|
|
} |
|
|
|
TestCaseUtils.execScan(mediaScannerService); |
|
|
|
|
|
|
|
globalTimerContext.stop(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
System.out.println("--- Report of records count per table ---"); |
|
|
|
|
|
|
|
Map<String, Integer> records = TestCaseUtils.recordsInAllTables(daoHelper); |
|
|
|
|
|
|
|
records.keySet().forEach(tableName -> System.out.println(tableName + " : " + records.get(tableName).toString())); |
|
|
|
|
|
|
|
System.out.println("--- *********************** ---"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Music Folder Music must have 3 children
|
|
|
|
|
|
|
|
List<MediaFile> listeMusicChildren = mediaFileDao.getChildrenOf(MusicFolderTestData.resolveMusicFolderPath()); |
|
|
|
|
|
|
|
Assert.assertEquals(3, listeMusicChildren.size()); |
|
|
|
|
|
|
|
// Music Folder Music2 must have 1 children
|
|
|
|
|
|
|
|
List<MediaFile> listeMusic2Children = mediaFileDao.getChildrenOf(MusicFolderTestData.resolveMusic2FolderPath()); |
|
|
|
|
|
|
|
Assert.assertEquals(1, listeMusic2Children.size()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
System.out.println("--- List of all artists ---"); |
|
|
|
|
|
|
|
System.out.println("artistName#albumCount"); |
|
|
|
|
|
|
|
List<Artist> allArtists = artistDao.getAlphabetialArtists(0, 0, musicFolderDao.getAllMusicFolders()); |
|
|
|
|
|
|
|
allArtists.forEach(artist -> System.out.println(artist.getName() + "#" + artist.getAlbumCount())); |
|
|
|
|
|
|
|
System.out.println("--- *********************** ---"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
System.out.println("--- List of all albums ---"); |
|
|
|
|
|
|
|
System.out.println("name#artist"); |
|
|
|
|
|
|
|
List<Album> allAlbums = albumDao.getAlphabetialAlbums(0, 0, true, musicFolderDao.getAllMusicFolders()); |
|
|
|
|
|
|
|
allAlbums.forEach(album -> System.out.println(album.getName() + "#" + album.getArtist())); |
|
|
|
|
|
|
|
Assert.assertEquals(5, allAlbums.size()); |
|
|
|
|
|
|
|
System.out.println("--- *********************** ---"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<MediaFile> listeSongs = mediaFileDao.getSongsByGenre("Baroque Instrumental", 0, 0, musicFolderDao.getAllMusicFolders()); |
|
|
|
|
|
|
|
Assert.assertEquals(2, listeSongs.size()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// display out metrics report
|
|
|
|
|
|
|
|
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics) |
|
|
|
|
|
|
|
.convertRatesTo(TimeUnit.SECONDS.SECONDS) |
|
|
|
|
|
|
|
.convertDurationsTo(TimeUnit.MILLISECONDS) |
|
|
|
|
|
|
|
.build(); |
|
|
|
|
|
|
|
reporter.report(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
System.out.print("End"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void testSpecialCharactersInFilename() throws Exception { |
|
|
|
public void testSpecialCharactersInFilename() throws Exception { |
|
|
@ -165,7 +165,7 @@ public class MediaScannerServiceTestCase { |
|
|
|
File musicFile = artistDir.toPath().resolve(fileName).toFile(); |
|
|
|
File musicFile = artistDir.toPath().resolve(fileName).toFile(); |
|
|
|
IOUtils.copy(resource.getInputStream(), new FileOutputStream(musicFile)); |
|
|
|
IOUtils.copy(resource.getInputStream(), new FileOutputStream(musicFile)); |
|
|
|
|
|
|
|
|
|
|
|
MusicFolder musicFolder = new MusicFolder(1, temporaryFolder.getRoot(),"Music",true,new Date()); |
|
|
|
MusicFolder musicFolder = new MusicFolder(1, temporaryFolder.getRoot(), "Music", true, new Date()); |
|
|
|
musicFolderDao.createMusicFolder(musicFolder); |
|
|
|
musicFolderDao.createMusicFolder(musicFolder); |
|
|
|
settingsService.clearMusicFolderCache(); |
|
|
|
settingsService.clearMusicFolderCache(); |
|
|
|
TestCaseUtils.execScan(mediaScannerService); |
|
|
|
TestCaseUtils.execScan(mediaScannerService); |
|
|
|