Merge Pull Request #124 into develop
commit
9d3d6ce52d
@ -0,0 +1,123 @@ |
||||
package org.libresonic.player; |
||||
|
||||
import org.apache.commons.io.FileUtils; |
||||
import org.libresonic.player.dao.DaoHelper; |
||||
import org.libresonic.player.service.MediaScannerService; |
||||
import org.springframework.context.ApplicationContext; |
||||
import org.springframework.context.support.ClassPathXmlApplicationContext; |
||||
|
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.nio.file.Files; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.stream.Collectors; |
||||
|
||||
public class TestCaseUtils { |
||||
|
||||
private static final String LIBRESONIC_HOME_FOR_TEST = "/tmp/libresonic"; |
||||
|
||||
private static File libresonicHomeDirForTest = null; |
||||
|
||||
/** |
||||
* Returns the path of the LIBRESONIC_HOME directory to use for tests. |
||||
* This will create a temporary directory. |
||||
* |
||||
* @return LIBRESONIC_HOME directory path. |
||||
* @throws RuntimeException if it fails to create the temp directory. |
||||
*/ |
||||
public static String libresonicHomePathForTest() { |
||||
|
||||
if (libresonicHomeDirForTest == null) { |
||||
try { |
||||
libresonicHomeDirForTest = Files.createTempDirectory("libresonic_test_").toFile(); |
||||
} catch (IOException e) { |
||||
throw new RuntimeException("Error while creating temporary LIBRESONIC_HOME directory for tests"); |
||||
} |
||||
System.out.println("LIBRESONIC_HOME directory will be "+libresonicHomeDirForTest.getAbsolutePath()); |
||||
} |
||||
return libresonicHomeDirForTest.getAbsolutePath(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Cleans the LIBRESONIC_HOME directory used for tests. |
||||
* |
||||
* @throws IOException |
||||
*/ |
||||
public static void cleanLibresonicHomeForTest() throws IOException { |
||||
|
||||
File libresonicHomeDir = new File(libresonicHomePathForTest()); |
||||
if (libresonicHomeDir.exists() && libresonicHomeDir.isDirectory()) { |
||||
System.out.println("Delete libresonic home (ie. "+libresonicHomeDir.getAbsolutePath()+")."); |
||||
try { |
||||
FileUtils.deleteDirectory(libresonicHomeDir); |
||||
} catch (IOException e) { |
||||
System.out.println("Error while deleting libresonic home."); |
||||
e.printStackTrace(); |
||||
throw e; |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
/** |
||||
* Constructs a map of records count per table. |
||||
* |
||||
* @param daoHelper DaoHelper object |
||||
* @return Map table name -> records count |
||||
*/ |
||||
public static Map<String, Integer> recordsInAllTables(DaoHelper daoHelper) { |
||||
List<String> tableNames = daoHelper.getJdbcTemplate().queryForList("" + |
||||
"select table_name " + |
||||
"from information_schema.system_tables " + |
||||
"where table_name not like 'SYSTEM%'" |
||||
, String.class); |
||||
Map<String, Integer> nbRecords = |
||||
tableNames.stream() |
||||
.collect(Collectors.toMap(table -> table, table -> recordsInTable(table,daoHelper))); |
||||
|
||||
return nbRecords; |
||||
} |
||||
|
||||
/** |
||||
* Counts records in a table. |
||||
* |
||||
* @param tableName |
||||
* @param daoHelper |
||||
* @return |
||||
*/ |
||||
public static Integer recordsInTable(String tableName, DaoHelper daoHelper) { |
||||
return daoHelper.getJdbcTemplate().queryForInt("select count(1) from " + tableName); |
||||
} |
||||
|
||||
|
||||
public static ApplicationContext loadSpringApplicationContext(String baseResources) { |
||||
String applicationContextService = baseResources + "applicationContext-service.xml"; |
||||
String applicationContextCache = baseResources + "applicationContext-cache.xml"; |
||||
|
||||
String[] configLocations = new String[]{ |
||||
TestCaseUtils.class.getClass().getResource(applicationContextCache).toString(), |
||||
TestCaseUtils.class.getClass().getResource(applicationContextService).toString() |
||||
}; |
||||
return new ClassPathXmlApplicationContext(configLocations); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Scans the music library * @param mediaScannerService |
||||
*/ |
||||
public static void execScan(MediaScannerService mediaScannerService) { |
||||
mediaScannerService.scanLibrary(); |
||||
|
||||
while (mediaScannerService.isScanning()) { |
||||
try { |
||||
Thread.sleep(1000); |
||||
} catch (InterruptedException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,39 @@ |
||||
package org.libresonic.player.dao; |
||||
|
||||
import org.libresonic.player.domain.MusicFolder; |
||||
|
||||
import java.io.File; |
||||
import java.util.ArrayList; |
||||
import java.util.Date; |
||||
import java.util.List; |
||||
|
||||
public class MusicFolderDaoMock extends MusicFolderDao { |
||||
|
||||
private static String baseResources = "/MEDIAS/"; |
||||
|
||||
public static String resolveBaseMediaPath() { |
||||
String baseDir = MusicFolderDaoMock.class.getResource(baseResources).toString().replace("file:",""); |
||||
return baseDir; |
||||
} |
||||
|
||||
public static String resolveMusicFolderPath() { |
||||
return (MusicFolderDaoMock.resolveBaseMediaPath() + "Music"); |
||||
} |
||||
|
||||
public static String resolveMusic2FolderPath() { |
||||
return (MusicFolderDaoMock.resolveBaseMediaPath() + "Music2"); |
||||
} |
||||
|
||||
@Override |
||||
public List<MusicFolder> getAllMusicFolders() { |
||||
List<MusicFolder> liste = new ArrayList<>(); |
||||
File musicDir = new File(MusicFolderDaoMock.resolveMusicFolderPath()); |
||||
MusicFolder musicFolder = new MusicFolder(1,musicDir,"Music",true,new Date()); |
||||
liste.add(musicFolder); |
||||
|
||||
File music2Dir = new File(MusicFolderDaoMock.resolveMusic2FolderPath()); |
||||
MusicFolder musicFolder2 = new MusicFolder(2,music2Dir,"Music2",true,new Date()); |
||||
liste.add(musicFolder2); |
||||
return liste; |
||||
} |
||||
} |
@ -0,0 +1,120 @@ |
||||
package org.libresonic.player.service; |
||||
|
||||
import com.codahale.metrics.ConsoleReporter; |
||||
import com.codahale.metrics.JmxReporter; |
||||
import com.codahale.metrics.MetricRegistry; |
||||
import com.codahale.metrics.Timer; |
||||
import junit.framework.Assert; |
||||
import junit.framework.TestCase; |
||||
import org.libresonic.player.TestCaseUtils; |
||||
import org.libresonic.player.dao.*; |
||||
import org.libresonic.player.domain.Album; |
||||
import org.libresonic.player.domain.Artist; |
||||
import org.libresonic.player.domain.MediaFile; |
||||
import org.springframework.context.ApplicationContext; |
||||
|
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.concurrent.TimeUnit; |
||||
|
||||
/** |
||||
* A unit test class to test the MediaScannerService. |
||||
* |
||||
* This class uses the Spring application context configuration present in the |
||||
* /org/libresonic/player/service/mediaScannerServiceTestCase/ 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. |
||||
* |
||||
* 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. |
||||
* |
||||
*/ |
||||
public class MediaScannerServiceTestCase extends TestCase { |
||||
|
||||
private static String baseResources = "/org/libresonic/player/service/mediaScannerServiceTestCase/"; |
||||
|
||||
private final MetricRegistry metrics = new MetricRegistry(); |
||||
|
||||
|
||||
private MediaScannerService mediaScannerService = null; |
||||
private MediaFileDao mediaFileDao = null; |
||||
private MusicFolderDao musicFolderDao = null; |
||||
private DaoHelper daoHelper = null; |
||||
private MediaFileService mediaFileService = null; |
||||
private ArtistDao artistDao = null; |
||||
private AlbumDao albumDao = null; |
||||
|
||||
|
||||
@Override |
||||
protected void setUp() throws Exception { |
||||
super.setUp(); |
||||
|
||||
System.setProperty("libresonic.home", TestCaseUtils.libresonicHomePathForTest()); |
||||
|
||||
TestCaseUtils.cleanLibresonicHomeForTest(); |
||||
|
||||
// load spring context
|
||||
ApplicationContext context = TestCaseUtils.loadSpringApplicationContext(baseResources); |
||||
|
||||
mediaScannerService = (MediaScannerService)context.getBean("mediaScannerService"); |
||||
mediaFileDao = (MediaFileDao)context.getBean("mediaFileDao"); |
||||
musicFolderDao = (MusicFolderDao) context.getBean("musicFolderDao"); |
||||
daoHelper = (DaoHelper) context.getBean("daoHelper"); |
||||
mediaFileService = (MediaFileService) context.getBean("mediaFileService"); |
||||
artistDao = (ArtistDao) context.getBean("artistDao"); |
||||
albumDao = (AlbumDao) context.getBean("albumDao"); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Tests the MediaScannerService by scanning the test media library into an empty database. |
||||
*/ |
||||
public void testScanLibrary() { |
||||
|
||||
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(MusicFolderDaoMock.resolveMusicFolderPath()); |
||||
Assert.assertEquals(3,listeMusicChildren.size()); |
||||
// Music Folder Music2 must have 1 children
|
||||
List<MediaFile> listeMusic2Children = mediaFileDao.getChildrenOf(MusicFolderDaoMock.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"); |
||||
} |
||||
|
||||
} |
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 39 KiB |
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 47 KiB |
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 70 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 51 KiB |
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
@ -0,0 +1,17 @@ |
||||
<?xml version="1.0" encoding="ISO-8859-1"?> |
||||
|
||||
<beans xmlns="http://www.springframework.org/schema/beans" |
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> |
||||
|
||||
<bean id="cacheFactory" class="org.libresonic.player.cache.CacheFactory"/> |
||||
|
||||
<bean id="userCache" factory-bean="cacheFactory" factory-method="getCache"> |
||||
<constructor-arg value="userCache"/> |
||||
</bean> |
||||
|
||||
<bean id="mediaFileMemoryCache" factory-bean="cacheFactory" factory-method="getCache"> |
||||
<constructor-arg value="mediaFileMemoryCache"/> |
||||
</bean> |
||||
|
||||
</beans> |
@ -0,0 +1,186 @@ |
||||
<?xml version="1.0" encoding="ISO-8859-1"?> |
||||
|
||||
<beans xmlns="http://www.springframework.org/schema/beans" |
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> |
||||
|
||||
|
||||
<!-- DAO's --> |
||||
|
||||
<bean id="playerDao" class="org.libresonic.player.dao.PlayerDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="mediaFileDao" class="org.libresonic.player.dao.MediaFileDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="artistDao" class="org.libresonic.player.dao.ArtistDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="albumDao" class="org.libresonic.player.dao.AlbumDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="playlistDao" class="org.libresonic.player.dao.PlaylistDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="playQueueDao" class="org.libresonic.player.dao.PlayQueueDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="internetRadioDao" class="org.libresonic.player.dao.InternetRadioDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="musicFileInfoDao" class="org.libresonic.player.dao.RatingDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="musicFolderDao" class="org.libresonic.player.dao.MusicFolderDaoMock"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="userDao" class="org.libresonic.player.dao.UserDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="transcodingDao" class="org.libresonic.player.dao.TranscodingDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="podcastDao" class="org.libresonic.player.dao.PodcastDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="avatarDao" class="org.libresonic.player.dao.AvatarDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="shareDao" class="org.libresonic.player.dao.ShareDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="bookmarkDao" class="org.libresonic.player.dao.BookmarkDao"> |
||||
<property name="daoHelper" ref="daoHelper"/> |
||||
</bean> |
||||
|
||||
<bean id="daoHelper" class="org.libresonic.player.dao.DaoHelperFactory" factory-method="create"/> |
||||
|
||||
|
||||
<!-- Services --> |
||||
|
||||
<bean id="mediaFileService" class="org.libresonic.player.service.MediaFileService"> |
||||
<property name="securityService" ref="securityService"/> |
||||
<property name="settingsService" ref="settingsService"/> |
||||
<property name="mediaFileMemoryCache" ref="mediaFileMemoryCache"/> |
||||
<property name="mediaFileDao" ref="mediaFileDao"/> |
||||
<property name="albumDao" ref="albumDao"/> |
||||
<property name="metaDataParserFactory" ref="metaDataParserFactory"/> |
||||
</bean> |
||||
|
||||
<bean id="securityService" class="org.libresonic.player.service.SecurityService"> |
||||
<property name="settingsService" ref="settingsService"/> |
||||
<property name="userDao" ref="userDao"/> |
||||
<property name="userCache" ref="userCache"/> |
||||
</bean> |
||||
|
||||
<bean id="settingsService" class="org.libresonic.player.service.SettingsService" init-method="init"> |
||||
<property name="internetRadioDao" ref="internetRadioDao"/> |
||||
<property name="musicFolderDao" ref="musicFolderDao"/> |
||||
<property name="userDao" ref="userDao"/> |
||||
<property name="avatarDao" ref="avatarDao"/> |
||||
<property name="versionService" ref="versionService"/> |
||||
</bean> |
||||
|
||||
<bean id="mediaScannerService" class="org.libresonic.player.service.MediaScannerService" init-method="initNoSchedule" depends-on="metaDataParserFactory"> |
||||
<property name="settingsService" ref="settingsService"/> |
||||
<property name="mediaFileService" ref="mediaFileService"/> |
||||
<property name="mediaFileDao" ref="mediaFileDao"/> |
||||
<property name="playlistService" ref="playlistService"/> |
||||
<property name="artistDao" ref="artistDao"/> |
||||
<property name="albumDao" ref="albumDao"/> |
||||
<property name="searchService" ref="searchService"/> |
||||
<!-- <property name="queueSender" ref="queueSender"/> --> |
||||
</bean> |
||||
|
||||
|
||||
<bean id="searchService" class="org.libresonic.player.service.SearchService"> |
||||
<property name="mediaFileService" ref="mediaFileService"/> |
||||
<property name="artistDao" ref="artistDao"/> |
||||
<property name="albumDao" ref="albumDao"/> |
||||
</bean> |
||||
|
||||
<bean id="networkService" class="org.libresonic.player.service.NetworkService" init-method="init"> |
||||
<property name="settingsService" ref="settingsService"/> |
||||
</bean> |
||||
|
||||
<bean id="playerService" class="org.libresonic.player.service.PlayerService" init-method="init"> |
||||
<property name="playerDao" ref="playerDao"/> |
||||
<property name="statusService" ref="statusService"/> |
||||
<property name="securityService" ref="securityService"/> |
||||
<property name="transcodingService" ref="transcodingService"/> |
||||
</bean> |
||||
|
||||
<bean id="playlistService" class="org.libresonic.player.service.PlaylistService"> |
||||
<property name="mediaFileService" ref="mediaFileService"/> |
||||
<property name="securityService" ref="securityService"/> |
||||
<property name="settingsService" ref="settingsService"/> |
||||
<property name="mediaFileDao" ref="mediaFileDao"/> |
||||
<property name="playlistDao" ref="playlistDao"/> |
||||
</bean> |
||||
|
||||
<bean id="versionService" class="org.libresonic.player.service.VersionService" init-method="init"/> |
||||
|
||||
<bean id="statusService" class="org.libresonic.player.service.StatusService"> |
||||
<property name="mediaFileService" ref="mediaFileService"/> |
||||
</bean> |
||||
|
||||
<bean id="ratingService" class="org.libresonic.player.service.RatingService"> |
||||
<property name="ratingDao" ref="musicFileInfoDao"/> |
||||
<property name="mediaFileService" ref="mediaFileService"/> |
||||
<property name="securityService" ref="securityService"/> |
||||
</bean> |
||||
|
||||
<bean id="musicIndexService" class="org.libresonic.player.service.MusicIndexService"> |
||||
<property name="settingsService" ref="settingsService"/> |
||||
<property name="mediaFileService" ref="mediaFileService"/> |
||||
</bean> |
||||
|
||||
<bean id="transcodingService" class="org.libresonic.player.service.TranscodingService"> |
||||
<property name="transcodingDao" ref="transcodingDao"/> |
||||
<property name="settingsService" ref="settingsService"/> |
||||
</bean> |
||||
|
||||
|
||||
<bean id="podcastService" class="org.libresonic.player.service.PodcastService" init-method="init"> |
||||
<property name="podcastDao" ref="podcastDao"/> |
||||
<property name="settingsService" ref="settingsService"/> |
||||
<property name="securityService" ref="securityService"/> |
||||
<property name="mediaFileService" ref="mediaFileService"/> |
||||
<property name="metaDataParserFactory" ref="metaDataParserFactory"/> |
||||
</bean> |
||||
|
||||
|
||||
|
||||
<bean id="metaDataParserFactory" class="org.libresonic.player.service.metadata.MetaDataParserFactory"> |
||||
<property name="parsers"> |
||||
<list> |
||||
<bean class="org.libresonic.player.service.metadata.JaudiotaggerParser"/> |
||||
<bean class="org.libresonic.player.service.metadata.FFmpegParser"> |
||||
<property name="transcodingService" ref="transcodingService"/> |
||||
</bean> |
||||
<bean class="org.libresonic.player.service.metadata.DefaultMetaDataParser"/> |
||||
</list> |
||||
</property> |
||||
</bean> |
||||
|
||||
|
||||
<bean id="localeResolver" class="org.libresonic.player.i18n.LibresonicLocaleResolver"> |
||||
<property name="securityService" ref="securityService"/> |
||||
<property name="settingsService" ref="settingsService"/> |
||||
</bean> |
||||
|
||||
</beans> |
Loading…
Reference in new issue