From f2d26348b6f97aaa0af0d56f7163a2422fd92b32 Mon Sep 17 00:00:00 2001 From: tesshucom Date: Sun, 7 Jul 2019 22:41:55 +0900 Subject: [PATCH 1/9] Add tests for SearchService Test cases related to current issues or points that need confirmation after Lucene update. --- .../search/AnalyzerFactoryTestCase.java | 71 ++++- .../SearchServiceSpecialGenreTestCase.java | 242 ++++++++++++++++++ .../SearchServiceSpecialPathTestCase.java | 174 +++++++++++++ ...archServiceStartWithStopwardsTestCase.java | 153 +++++++++++ .../service/search/SearchServiceTestCase.java | 32 ++- .../SpecialGenre/ARTIST1/ALBUM_A/FILE01.mp3 | Bin 0 -> 13807 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE02.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE03.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE04.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE05.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE06.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE07.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE08.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE09.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE10.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE11.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE12.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE13.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE14.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE15.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE16.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE17.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE18.mp3 | Bin 0 -> 13772 bytes .../SpecialGenre/ARTIST1/ALBUM_A/FILE19.mp3 | Bin 0 -> 13772 bytes .../accessible's/ARTIST3/ALBUM_C/FILE03.mp3 | Bin 0 -> 11494 bytes .../accessible+s/ARTIST2/ALBUM_B/FILE02.mp3 | Bin 0 -> 11494 bytes .../accessible/ARTIST1/ALBUM_A/FILE01.mp3 | Bin 0 -> 11494 bytes .../ARTIST1/ALBUM_A/FILE01.mp3 | Bin 0 -> 11622 bytes 28 files changed, 661 insertions(+), 11 deletions(-) create mode 100644 airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java create mode 100644 airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialPathTestCase.java create mode 100644 airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceStartWithStopwardsTestCase.java create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE01.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE02.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE03.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE04.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE05.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE06.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE07.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE08.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE09.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE10.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE11.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE12.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE13.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE14.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE15.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE16.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE17.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE18.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE19.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialPath/accessible's/ARTIST3/ALBUM_C/FILE03.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialPath/accessible+s/ARTIST2/ALBUM_B/FILE02.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/SpecialPath/accessible/ARTIST1/ALBUM_A/FILE01.mp3 create mode 100644 airsonic-main/src/test/resources/MEDIAS/Search/StartWithStopwards/ARTIST1/ALBUM_A/FILE01.mp3 diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java index e9f23390..f244eabc 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java @@ -1,6 +1,7 @@ package org.airsonic.player.service.search; +import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import java.io.IOException; @@ -412,7 +413,7 @@ public class AnalyzerFactoryTestCase { * Case using test resource name */ - // title + // Semicolon , comma and hyphen. String query = "Bach: Goldberg Variations, BWV 988 - Aria"; List terms = toTermString(query); assertEquals(6, terms.size()); @@ -423,7 +424,7 @@ public class AnalyzerFactoryTestCase { assertEquals("988", terms.get(4)); assertEquals("aria", terms.get(5)); - // artist + // Underbars around words, ascii and semicolon. query = "_ID3_ARTIST_ Céline Frisch: Café Zimmermann"; terms = toTermString(query); assertEquals(5, terms.size()); @@ -433,6 +434,72 @@ public class AnalyzerFactoryTestCase { assertEquals("cafe", terms.get(3)); assertEquals("zimmermann", terms.get(4)); + // Underbars around words and slashes + query = "_ID3_ARTIST_ Sarah Walker/Nash Ensemble"; + terms = toTermString(query); + assertEquals(5, terms.size()); + assertEquals("id3_artist", terms.get(0)); + assertEquals("sarah", terms.get(1)); + assertEquals("walker", terms.get(2)); + assertEquals("nash", terms.get(3)); + assertEquals("ensemble", terms.get(4)); + + // space + assertEquals(asList("abc", "def"), toTermString(" ABC DEF ")); + assertEquals(asList("abc1", "def"), toTermString(" ABC1 DEF ")); + + // trim and delimiter + assertEquals(asList("abc", "def"), toTermString("+ABC+DEF+")); + assertEquals(asList("abc", "def"), toTermString("|ABC|DEF|")); + assertEquals(asList("abc", "def"), toTermString("!ABC!DEF!")); + assertEquals(asList("abc", "def"), toTermString("(ABC(DEF(")); + assertEquals(asList("abc", "def"), toTermString(")ABC)DEF)")); + assertEquals(asList("abc", "def"), toTermString("{ABC{DEF{")); + assertEquals(asList("abc", "def"), toTermString("}ABC}DEF}")); + assertEquals(asList("abc", "def"), toTermString("[ABC[DEF[")); + assertEquals(asList("abc", "def"), toTermString("]ABC]DEF]")); + assertEquals(asList("abc", "def"), toTermString("^ABC^DEF^")); + assertEquals(asList("abc", "def"), toTermString("\\ABC\\DEF\\")); + assertEquals(asList("abc", "def"), toTermString("\"ABC\"DEF\"")); + assertEquals(asList("abc", "def"), toTermString("~ABC~DEF~")); + assertEquals(asList("abc", "def"), toTermString("*ABC*DEF*")); + assertEquals(asList("abc", "def"), toTermString("?ABC?DEF?")); + assertEquals(asList("abc", "def"), toTermString(":ABC:DEF:")); + assertEquals(asList("abc", "def"), toTermString("-ABC-DEF-")); + assertEquals(asList("abc", "def"), toTermString("/ABC/DEF/")); + assertEquals(asList("abc", "def"), toTermString("_ABC_DEF_")); + assertEquals(asList("abc", "def"), toTermString(",ABC,DEF,")); + assertEquals(asList("abc.def"), toTermString(".ABC.DEF.")); + assertEquals(asList("abc&def"), toTermString("&ABC&DEF&")); + assertEquals(asList("abc@def"), toTermString("@ABC@DEF@")); + assertEquals(asList("abc'def"), toTermString("'ABC'DEF'")); + + // trim and delimiter and number + assertEquals(asList("abc1", "def"), toTermString("+ABC1+DEF+")); + assertEquals(asList("abc1", "def"), toTermString("|ABC1|DEF|")); + assertEquals(asList("abc1", "def"), toTermString("!ABC1!DEF!")); + assertEquals(asList("abc1", "def"), toTermString("(ABC1(DEF(")); + assertEquals(asList("abc1", "def"), toTermString(")ABC1)DEF)")); + assertEquals(asList("abc1", "def"), toTermString("{ABC1{DEF{")); + assertEquals(asList("abc1", "def"), toTermString("}ABC1}DEF}")); + assertEquals(asList("abc1", "def"), toTermString("[ABC1[DEF[")); + assertEquals(asList("abc1", "def"), toTermString("]ABC1]DEF]")); + assertEquals(asList("abc1", "def"), toTermString("^ABC1^DEF^")); + assertEquals(asList("abc1", "def"), toTermString("\\ABC1\\DEF\\")); + assertEquals(asList("abc1", "def"), toTermString("\"ABC1\"DEF\"")); + assertEquals(asList("abc1", "def"), toTermString("~ABC1~DEF~")); + assertEquals(asList("abc1", "def"), toTermString("*ABC1*DEF*")); + assertEquals(asList("abc1", "def"), toTermString("?ABC1?DEF?")); + assertEquals(asList("abc1", "def"), toTermString(":ABC1:DEF:")); + assertEquals(asList("abc1,def"), toTermString(",ABC1,DEF,")); + assertEquals(asList("abc1-def"), toTermString("-ABC1-DEF-")); + assertEquals(asList("abc1/def"), toTermString("/ABC1/DEF/")); + assertEquals(asList("abc1_def"), toTermString("_ABC1_DEF_")); + assertEquals(asList("abc1.def"), toTermString(".ABC1.DEF.")); + assertEquals(asList("abc1", "def"), toTermString("&ABC1&DEF&")); + assertEquals(asList("abc1", "def"), toTermString("@ABC1@DEF@")); + assertEquals(asList("abc1", "def"), toTermString("'ABC1'DEF'")); + } /** diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java new file mode 100644 index 00000000..4953e08b --- /dev/null +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java @@ -0,0 +1,242 @@ + +package org.airsonic.player.service.search; + +import com.google.common.base.Function; + +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.airsonic.player.TestCaseUtils; +import org.airsonic.player.dao.DaoHelper; +import org.airsonic.player.dao.MusicFolderDao; +import org.airsonic.player.dao.MusicFolderTestData; +import org.airsonic.player.domain.MediaFile; +import org.airsonic.player.domain.MusicFolder; +import org.airsonic.player.domain.RandomSearchCriteria; +import org.airsonic.player.service.MediaScannerService; +import org.airsonic.player.service.SearchService; +import org.airsonic.player.service.SettingsService; +import org.airsonic.player.util.HomeRule; +import org.junit.Assert; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +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.core.io.ResourceLoader; +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; +import static org.springframework.util.ObjectUtils.isEmpty; + +@ContextConfiguration( + locations = { + "/applicationContext-service.xml", + "/applicationContext-cache.xml", + "/applicationContext-testdb.xml", + "/applicationContext-mockSonos.xml" }) +@DirtiesContext( + classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +/* + * Tests to clarify strings that can be used in genre. + */ +public class SearchServiceSpecialGenreTestCase { + + @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); + } + }; + + @Rule + public final SpringMethodRule springMethodRule = new SpringMethodRule(); + + @Autowired + private MediaScannerService mediaScannerService; + + @Autowired + private MusicFolderDao musicFolderDao; + + @Autowired + private DaoHelper daoHelper; + + @Autowired + private SearchService searchService; + + @Autowired + private SettingsService settingsService; + + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Autowired + ResourceLoader resourceLoader; + + @Before + public void setup() throws Exception { + populateDatabase(); + } + + private static boolean dataBasePopulated; + + private static Function resolvePath = (childPath) ->{ + return MusicFolderTestData.resolveBaseMediaPath() + childPath; + }; + + private List musicFolders; + + private List getTestMusicFolders() { + if (isEmpty(musicFolders)) { + musicFolders = new ArrayList<>(); + + File musicDir = new File(resolvePath.apply("Search/SpecialGenre")); + musicFolders.add(new MusicFolder(1, musicDir, "accessible", true, new Date())); + + } + return musicFolders; + } + + private int count = 1; + + private synchronized void populateDatabase() { + + try { + Thread.sleep(300 * count++); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + if (!dataBasePopulated) { + getTestMusicFolders().forEach(musicFolderDao::createMusicFolder); + settingsService.clearMusicFolderCache(); + TestCaseUtils.execScan(mediaScannerService); + System.out.println("--- Report of records count per table ---"); + Map records = TestCaseUtils.recordsInAllTables(daoHelper); + records.keySet().stream().filter(s -> s.equals("MEDIA_FILE") // 20 + | s.equals("ARTIST") // 5 + | s.equals("MUSIC_FOLDER")// 3 + | s.equals("ALBUM"))// 5 + .forEach(tableName -> System.out + .println("\t" + tableName + " : " + records.get(tableName).toString())); + System.out.println("--- *********************** ---"); + dataBasePopulated = true; + } + } + + @Test + public void testQueryEscapeRequires() { + + /* + * Legacy is not searchable. (FILE01 - FILE16) + */ + + } + + @Test + public void testBrackets() { + + /* + * Jaudiotagger applies special treatment to bracket (FILE17). + * + */ + + List folders = getTestMusicFolders(); + + RandomSearchCriteria criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count + "-(GENRE)-", // genre, + null, // fromYear + null, // toYear + folders // musicFolders + ); + + List songs = searchService.getRandomSongs(criteria); + Assert.assertEquals(0, songs.size()); + + criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count + " genre", // genre, + null, // fromYear + null, // toYear + folders // musicFolders + ); + + songs = searchService.getRandomSongs(criteria); + Assert.assertEquals(1, songs.size()); + Assert.assertEquals("Consistency with Tag Parser 1", songs.get(0).getTitle()); + Assert.assertEquals("-GENRE -", songs.get(0).getGenre()); + + } + + @Test + public void testNumericMapping() { + + /* + * Jaudiotagger applies special treatment to numeric. (FILE18) + */ + List folders = getTestMusicFolders(); + + RandomSearchCriteria criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count + "Rock", // genre, + null, // fromYear + null, // toYear + folders // musicFolders + ); + + List songs = searchService.getRandomSongs(criteria); + Assert.assertEquals(1, songs.size()); + Assert.assertEquals("Numeric mapping specification of genre 1", songs.get(0).getTitle()); + + // The value registered in the file is 17 + Assert.assertEquals("Rock", songs.get(0).getGenre()); + + } + + @Test + public void testOthers() { + + /* + * Other special strings. (FILE19) + * + * {'“『【【】】[︴○◎@ $〒→+]FULL-WIDTHCæsar's + * + * Legacy stores with Analyze, + * so searchable characters are different. + * + */ + List folders = getTestMusicFolders(); + + RandomSearchCriteria criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count + "{'“『【【】】[︴○◎@ $〒→+]FULL-WIDTHCæsar's", // genre, + null, // fromYear + null, // toYear + folders // musicFolders + ); + + List songs = searchService.getRandomSongs(criteria); + Assert.assertEquals(0, songs.size()); + + criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count + "widthcaesar", // genre, + null, // fromYear + null, // toYear + folders // musicFolders + ); + + songs = searchService.getRandomSongs(criteria); + Assert.assertEquals(1, songs.size()); + Assert.assertEquals("Other special strings 1", songs.get(0).getTitle()); + Assert.assertEquals("{'“『【【】】[︴○◎@ $〒→+]FULL-WIDTHCæsar's", songs.get(0).getGenre()); + + } +} diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialPathTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialPathTestCase.java new file mode 100644 index 00000000..62380963 --- /dev/null +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialPathTestCase.java @@ -0,0 +1,174 @@ + +package org.airsonic.player.service.search; + +import com.google.common.base.Function; + +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.airsonic.player.TestCaseUtils; +import org.airsonic.player.dao.DaoHelper; +import org.airsonic.player.dao.MusicFolderDao; +import org.airsonic.player.dao.MusicFolderTestData; +import org.airsonic.player.domain.MediaFile; +import org.airsonic.player.domain.MusicFolder; +import org.airsonic.player.service.MediaScannerService; +import org.airsonic.player.service.SearchService; +import org.airsonic.player.service.SettingsService; +import org.airsonic.player.util.HomeRule; +import org.junit.Assert; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +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.core.io.ResourceLoader; +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; +import static org.springframework.util.ObjectUtils.isEmpty; + +@ContextConfiguration( + locations = { + "/applicationContext-service.xml", + "/applicationContext-cache.xml", + "/applicationContext-testdb.xml", + "/applicationContext-mockSonos.xml" }) +@DirtiesContext( + classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +/* + * Test cases related to #1139. + * Confirming whether shuffle search can be performed correctly in MusicFolder containing special strings. + * + * (Since the query of getRandomAlbums consists of folder paths only, + * this verification is easy to perform.) + * + * This test case is a FalsePattern for search, + * but there may be problems with the data flow prior to creating the search index. + */ +public class SearchServiceSpecialPathTestCase { + + @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); + } + }; + + @Rule + public final SpringMethodRule springMethodRule = new SpringMethodRule(); + + @Autowired + private MediaScannerService mediaScannerService; + + @Autowired + private MusicFolderDao musicFolderDao; + + @Autowired + private DaoHelper daoHelper; + + @Autowired + private SearchService searchService; + + @Autowired + private SettingsService settingsService; + + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Autowired + ResourceLoader resourceLoader; + + @Before + public void setup() throws Exception { + populateDatabase(); + } + + private static boolean dataBasePopulated; + + private static Function resolvePath = (childPath) ->{ + return MusicFolderTestData.resolveBaseMediaPath() + childPath; + }; + + private List musicFolders; + + private List getTestMusicFolders() { + if (isEmpty(musicFolders)) { + musicFolders = new ArrayList<>(); + + File musicDir = new File(resolvePath.apply("Search/SpecialPath/accessible")); + musicFolders.add(new MusicFolder(1, musicDir, "accessible", true, new Date())); + + File music2Dir = new File(resolvePath.apply("Search/SpecialPath/accessible's")); + musicFolders.add(new MusicFolder(2, music2Dir, "accessible's", true, new Date())); + + File music3Dir = new File(resolvePath.apply("Search/SpecialPath/accessible+s")); + musicFolders.add(new MusicFolder(3, music3Dir, "accessible+s", true, new Date())); + } + return musicFolders; + } + + private synchronized void populateDatabase() { + + if (!dataBasePopulated) { + getTestMusicFolders().forEach(musicFolderDao::createMusicFolder); + settingsService.clearMusicFolderCache(); + TestCaseUtils.execScan(mediaScannerService); + System.out.println("--- Report of records count per table ---"); + Map records = TestCaseUtils.recordsInAllTables(daoHelper); + records.keySet().stream().filter(s -> s.equals("MEDIA_FILE") // 20 + | s.equals("ARTIST") // 5 + | s.equals("MUSIC_FOLDER")// 3 + | s.equals("ALBUM"))// 5 + .forEach(tableName -> System.out + .println("\t" + tableName + " : " + records.get(tableName).toString())); + System.out.println("--- *********************** ---"); + dataBasePopulated = true; + } + } + + @Test + public void testSpecialCharactersInDirName() { + + List folders = getTestMusicFolders(); + + // ALL Songs + List randomAlbums = searchService.getRandomAlbums(Integer.MAX_VALUE, folders); + Assert.assertEquals("ALL Albums ", 3, randomAlbums.size()); + + // dir - accessible + List folder01 = folders.stream() + .filter(m -> "accessible".equals(m.getName())) + .collect(Collectors.toList()); + randomAlbums = searchService.getRandomAlbums(Integer.MAX_VALUE, folder01); + Assert.assertEquals("Albums in \"accessible\" ", 3, randomAlbums.size()); + + // dir - accessible's + List folder02 = folders.stream() + .filter(m -> "accessible's".equals(m.getName())) + .collect(Collectors.toList()); + randomAlbums = searchService.getRandomAlbums(Integer.MAX_VALUE, folder02); + Assert.assertEquals("Albums in \"accessible's\" ", 0, randomAlbums.size()); + + // dir - accessible+s + List folder03 = folders.stream() + .filter(m -> "accessible+s".equals(m.getName())) + .collect(Collectors.toList()); + randomAlbums = searchService.getRandomAlbums(Integer.MAX_VALUE, folder03); + Assert.assertEquals("Albums in \"accessible+s\" ", 1, folder03.size()); + + } + +} diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceStartWithStopwardsTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceStartWithStopwardsTestCase.java new file mode 100644 index 00000000..a4b1b778 --- /dev/null +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceStartWithStopwardsTestCase.java @@ -0,0 +1,153 @@ + +package org.airsonic.player.service.search; + +import com.google.common.base.Function; + +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.airsonic.player.TestCaseUtils; +import org.airsonic.player.dao.DaoHelper; +import org.airsonic.player.dao.MusicFolderDao; +import org.airsonic.player.dao.MusicFolderTestData; +import org.airsonic.player.domain.MusicFolder; +import org.airsonic.player.domain.SearchCriteria; +import org.airsonic.player.domain.SearchResult; +import org.airsonic.player.service.MediaScannerService; +import org.airsonic.player.service.SearchService; +import org.airsonic.player.service.SettingsService; +import org.airsonic.player.util.HomeRule; +import org.junit.Assert; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +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.core.io.ResourceLoader; +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; +import static org.springframework.util.ObjectUtils.isEmpty; + +@ContextConfiguration( + locations = { + "/applicationContext-service.xml", + "/applicationContext-cache.xml", + "/applicationContext-testdb.xml", + "/applicationContext-mockSonos.xml" }) +@DirtiesContext( + classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +/* + * Test cases related to #1142. + * The filter is not properly applied when analyzing the query, + * + * In the process of hardening the Analyzer implementation, + * this problem is solved side by side. + */ +public class SearchServiceStartWithStopwardsTestCase { + + @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); + } + }; + + @Rule + public final SpringMethodRule springMethodRule = new SpringMethodRule(); + + @Autowired + private MediaScannerService mediaScannerService; + + @Autowired + private MusicFolderDao musicFolderDao; + + @Autowired + private DaoHelper daoHelper; + + @Autowired + private SearchService searchService; + + @Autowired + private SettingsService settingsService; + + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Autowired + ResourceLoader resourceLoader; + + @Before + public void setup() throws Exception { + populateDatabase(); + } + + private static boolean dataBasePopulated; + + private static Function resolvePath = (childPath) ->{ + return MusicFolderTestData.resolveBaseMediaPath() + childPath; + }; + + private List musicFolders; + + private List getTestMusicFolders() { + if (isEmpty(musicFolders)) { + musicFolders = new ArrayList<>(); + + File musicDir = new File(resolvePath.apply("Search/StartWithStopwards")); + musicFolders.add(new MusicFolder(1, musicDir, "accessible", true, new Date())); + + } + return musicFolders; + } + + private synchronized void populateDatabase() { + + if (!dataBasePopulated) { + getTestMusicFolders().forEach(musicFolderDao::createMusicFolder); + settingsService.clearMusicFolderCache(); + TestCaseUtils.execScan(mediaScannerService); + System.out.println("--- Report of records count per table ---"); + Map records = TestCaseUtils.recordsInAllTables(daoHelper); + records.keySet().stream().filter(s -> s.equals("MEDIA_FILE") // 20 + | s.equals("ARTIST") // 5 + | s.equals("MUSIC_FOLDER")// 3 + | s.equals("ALBUM"))// 5 + .forEach(tableName -> System.out + .println("\t" + tableName + " : " + records.get(tableName).toString())); + System.out.println("--- *********************** ---"); + dataBasePopulated = true; + } + } + + @Test + public void testStartWithStopwards() { + + List folders = getTestMusicFolders(); + + final SearchCriteria criteria = new SearchCriteria(); + criteria.setCount(Integer.MAX_VALUE); + criteria.setOffset(0); + + criteria.setQuery("will"); + SearchResult result = searchService.search(criteria, folders, IndexType.ARTIST_ID3); + Assert.assertEquals("Williams hit by \"will\" ", 1, result.getTotalHits()); + + criteria.setQuery("the"); + result = searchService.search(criteria, folders, IndexType.SONG); + Assert.assertEquals("Theater hit by \"the\" ", 1, result.getTotalHits()); + + } + +} diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceTestCase.java index e2871753..fb40b0ee 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceTestCase.java @@ -319,16 +319,30 @@ public class SearchServiceTestCase { Assert.assertEquals("(24) Specify music as 'genre', and randomly acquire songs.", 0, allRandomSongs.size()); + /* + * Genre including blank. + * Regardless of the Lucene version, It should be 2. + */ + randomSearchCriteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count + "Baroque Instrumental", // genre, + null, // fromYear + null, // toYear + allMusicFolders // musicFolders + ); + allRandomSongs = searchService.getRandomSongs(randomSearchCriteria); + Assert.assertEquals("(25) Search by specifying genres including spaces and hyphens.", 2, + allRandomSongs.size()); + // *** testGetRandomAlbums() *** /* * Acquisition of maximum number(5). */ List allAlbums = albumDao.getAlphabeticalAlbums(0, 0, true, true, allMusicFolders); - Assert.assertEquals("(25) Get all albums with Dao.", 5, allAlbums.size()); + Assert.assertEquals("(26) Get all albums with Dao.", 5, allAlbums.size()); List allRandomAlbums = searchService.getRandomAlbums(Integer.MAX_VALUE, allMusicFolders); - Assert.assertEquals("(26) Specify Integer.MAX_VALUE as the upper limit," + Assert.assertEquals("(27) Specify Integer.MAX_VALUE as the upper limit," + "and randomly acquire albums(file struct).", 5, allRandomAlbums.size()); /* @@ -337,7 +351,7 @@ public class SearchServiceTestCase { List allRandomAlbumsId3 = searchService.getRandomAlbumsId3(Integer.MAX_VALUE, allMusicFolders); Assert.assertEquals( - "(27) Specify Integer.MAX_VALUE as the upper limit, and randomly acquire albums(ID3).", + "(28) Specify Integer.MAX_VALUE as the upper limit, and randomly acquire albums(ID3).", 5, allRandomAlbumsId3.size()); /* @@ -346,13 +360,13 @@ public class SearchServiceTestCase { query = "ID 3 ARTIST"; searchCriteria.setQuery(query); result = searchService.search(searchCriteria, allMusicFolders, IndexType.ARTIST_ID3); - Assert.assertEquals("(28) Specify '" + query + "', total Hits is", 4, + Assert.assertEquals("(29) Specify '" + query + "', total Hits is", 4, result.getTotalHits()); - Assert.assertEquals("(29) Specify '" + query + "', and get an artists. Artist SIZE is ", 4, + Assert.assertEquals("(30) Specify '" + query + "', and get an artists. Artist SIZE is ", 4, result.getArtists().size()); - Assert.assertEquals("(30) Specify '" + query + "', and get a artists. Album SIZE is ", 0, + Assert.assertEquals("(31) Specify '" + query + "', and get a artists. Album SIZE is ", 0, result.getAlbums().size()); - Assert.assertEquals("(31) Specify '" + query + "', and get a artists. MediaFile SIZE is ", + Assert.assertEquals("(32) Specify '" + query + "', and get a artists. MediaFile SIZE is ", 0, result.getMediaFiles().size()); /* @@ -362,7 +376,7 @@ public class SearchServiceTestCase { */ long count = result.getArtists().stream() .filter(a -> a.getName().startsWith("_ID3_ARTIST_")).count(); - Assert.assertEquals("(32) Artist whose name contains \\\"_ID3_ARTIST_\\\" is 3 records.", + Assert.assertEquals("(33) Artist whose name contains \\\"_ID3_ARTIST_\\\" is 3 records.", 3L, count); /* @@ -373,7 +387,7 @@ public class SearchServiceTestCase { */ count = result.getArtists().stream() .filter(a -> a.getName().startsWith("_ID3_ALBUMARTIST_")).count(); - Assert.assertEquals("(33) Artist whose name is \"_ID3_ARTIST_\" is 1 records.", 1L, count); + Assert.assertEquals("(34) Artist whose name is \"_ID3_ARTIST_\" is 1 records.", 1L, count); /* * Below is a simple loop test. diff --git a/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE01.mp3 b/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE01.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9469db281829f382ce762c12d66e891816c10a18 GIT binary patch literal 13807 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 IlECl(19ps2l>h($ literal 0 HcmV?d00001 diff --git a/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE04.mp3 b/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE04.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1d1c4a6b4a166f41004cb5f53d36bd0af20521e9 GIT binary patch literal 13772 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 K;=d&D`~LvL4pKq@ literal 0 HcmV?d00001 diff --git a/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE05.mp3 b/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE05.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..215fdfedb14707dd4a681c6656279349a41cab58 GIT binary patch literal 13772 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 F{4WZiQIh}w literal 0 HcmV?d00001 diff --git a/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE06.mp3 b/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE06.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..3bc7c2a4b51aeffa7b798cd33da4b9ffc519340a GIT binary patch literal 13772 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 H3H<&)YTi+E literal 0 HcmV?d00001 diff --git a/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE07.mp3 b/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE07.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..14061b0938fd01616ddb70145c961bb91b4a633c GIT binary patch literal 13772 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 K0{Pd31psh<|FQ;f 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 IB=GzH04j4)s{jB1 literal 0 HcmV?d00001 diff --git a/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE10.mp3 b/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE10.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0a922377e7db3763326982e4c2812759eb31a6e9 GIT binary patch literal 13772 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 Le=7X9B!2%NS$|QP literal 0 HcmV?d00001 diff --git a/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE11.mp3 b/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE11.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c3cbdd30903dd20d518159c02b1623abb02341ac GIT binary patch literal 13772 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 Le=7X9B!2%N56e-x literal 0 HcmV?d00001 diff --git a/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE14.mp3 b/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE14.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..21842e20178b30e5821bd37bb1e60788aa7ed22c GIT binary patch literal 13772 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 Le=7X9B!2%NRIpL3 literal 0 HcmV?d00001 diff --git a/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE17.mp3 b/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE17.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..19eba156808ae33b187baea559757333510c395d GIT binary patch literal 13772 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

g)81# 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 literal 0 HcmV?d00001 diff --git a/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE18.mp3 b/airsonic-main/src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A/FILE18.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..2af3e0416dee2c36907c22be3ceb6fe1c2499e30 GIT binary patch literal 13772 zcmeHsXH=9;mu=JJ+~k~_oV&>alIbQkIYX0al4L<;Bk&?QCrOe~i6Ti5 z5JAz)H}n0QKXYeh&CI>)t!J&O^VF$RKlWO+YoAkaH7GXVzJaWbRrU4m4MG3_>(6g- zfb_j>3^#_{4<`RIr3VNEcmbRNegG7}5x{e{VbAdr$zEe_3G< z2)G{~-Fw;Zdzbs(_1^D&AMbo`i{J12cl#TGzY+Kwfxi*>8-c$O`2QJ!KR>tC007)m zC$%FTDH%*n@LLquD2sh5dEK7y&Yl$Vs=KL;1G44~zl^6=YFwC--ov_9vH>zMQMw4^ z+azPe2e98%$f^UConQ<7x?FX_T_7wM)b_?oD}2SaZ8`C@+3Kas8@cOAGn`#qnkN>G z0?(u=)E^jyGqZ1}w`~g!n~D9(1M1#||0R+g*xKTJ@^Hc!Y})^&+`)3dqpO4`sB2I> z941WlF<0AdkxC}~V*#ZvC2|EW*iiq*GeEpW(T2BT->#>&`e|7?qfo1%5zVI!uV{O#V=XBV)2lu>pt1p{&c$rCpn&8iCg@oDl~0jWS;Jo(J1F>SvP_iiq53!=wh< z1-1ThcfO2^Zzm_;E(HyYmW9*>yQ*ro3I?OLX8T&0^YKX74>?RgF4!x>Mq}U4A8eOPt5KdXScmZE^2HI;vEN% zhuOLlmb+b}(rLD*M~|xfPimF@y+dUb_czE#CdPxVmc2!(W!x$)F|iuh z`ir2-GGJNawM`_^8SxrTz;7OijwB zK5=BkbqXhXZ?GdrjU%gexB`{?;iN9W>3n-TM7ws~eUqs!!GXw~KhJl3+!yn|nNL5;&%k%JT0;=Xt0kJ99rnN=2cXeurOT2%7SSvG;+eJEx2c&Q5-C_+X zm*$czni{4M+mL4LIMhH6u}7Qo*7YX8IO#kt$%{-w#yK&Jp>?BT`*30kAXc97oG|7^ zJn6jtC3J>gT;<}pXJm5DA|v}CtM~vxPC~vq7T5vn#AdWib&wKQ^%c$I$a9iLUiDkc zM8hDKiW*Wio6m4{OXDuFc_jVuv7ymJ&SOKCSH)qxYv_8hIsW~P4;`r%#?A@pnFc`$ z`EqR$t}_@MH7PzRcDsOqx=lR{F@#X3+qt72y8YL{GG4#@f$ipa!o!!VuNm4cg_>uQ zTpiMGyS}9U^qDNRotJBkm8*wlMeDrET=)%r(V6nvpRA~%wz13VrO1MF~$9*i_(?1+m7AtS5vT&bwiis|0aJqnfd zKUQc4x6>GAC;&73-z7CU4I6rud`ojJdV(_6ou8b5Ee*5jR!V0|weAmaC%DUk6X`ly z{PVvEX+$&R$lAQ^`b^A!wYqXeKh-W-zow#uzUOAP`tHyVkA5f~h z-yjNj<0;}0oU!9h0n_So;`AQH@oC*lmB^TlcSO!yv}@#VWNEy79J|^g9mHlL4`9jF z==fcZEQ1dfTJtbOfdul)do}G!PHBgDDHTnhkcuo}UTOI*ffwx>FCX=G)31M!Cn zfc&PI5%dm?eF*Vl`*3GhS`zK*lEg-LpoR()+@C494bfN>!x+4ofYG3$I#lfv|B$R7 zg(Zi1NL76W3^=QuFs~62qEhrQ@SoREi z&U9`^@~!=-k;dYhcDqQ%Lm3*5&m_8rcX$%bUNJn}Orj-g?|ECUuYb8NFbIsEt$N(% z1~c5>T}1OOfzG!W$JQop$VvOU7doA8);EkB6jzaYZV~AhO2TjvMXMnPkkzI#?FZ{{ zbD8hflWT;aDCpkH+K+?VCw(J%iVZr-e@ttXt{dceu0e-lV{UvnLYSf^^57?8ea*4M zxNK8W^Ws>1WQyeQ-BA!HNYe{ExwzYqVL|koXkqEi1Nxuo+tU}G)6jez*beEbNsiwr zT>SxWL54DC)9kY>VVsp^ReO#~ba#YOi4%p-JN4Ik?^=O|)7rfA;MB1NC~RAT#X%4} zk0qvsu2KRhk(^=EwmPoHTj3M&xd?F!f_1Y^Arv$QUTlb2?T$EyDC$1QV#4j@{Uvd*E0?Q7~~Vg9`y0s_2=75fZ5ETGHUX zSB89ETdpH{8uaKd&F z`!2nTFfP2L$lyXoQqmzSI6)cTMGpYvX2c3wQ$qGxgGgAbf$X_~{&d39nt(Lt&<1m@ zNclvKGhsG!eeHuGHu7kt^xPdCEl|2;OmRuq+S#j)Qo{4}n!HZrXJr9XE#o6C#DY@@ zsJC*H>N@^vLyezQX7O`gQ53Xbb)1!D8whfC;)rrk7mq~)=ZV>^XR9j92=WScI~bri zcnl=+Q%MEfHgK}9YG{QBg!QX%BD%C`3N;cCCpVnZ-Ap2r!sN@fnY;~$%H>3KmVnX_ z$(0U8w*0~*{$ON!46Vsr!!o<_1^@rx>HZJW$v?9PJ%?cr9m)I_kB(5(ekg}?Iey(% z+OeS0>#KIAVh;LO-s7!tB}!2fXp(lrv_=NqQONn$9CV_lbS@-3k`=|R7e3nd`V2hI*> z%NW}+w5-JaIjUtygrgQu%c@rT$ex#<)JiU?W>53!{<`bO8!Ni2-mk8|#{)iuG;C7E zuipwp`Zq8Cr1}2##8mp{&SPKABNlFij8pmp;VMd8D6w2XpZ1i8BPY&GuO$cG(jgne zVtKhYC*X=1XF$@ZmC)Cd_%Y$agz@F*Z9AuzX*M#&U?$#8vrCm4pP4W>)oVrngvj0m zsvOhxBJPnZGajvtr;?7smo6fUIN5SeU$;V=m$TwBx>NxsG%MnFynK}wM-@c6&sH=+ zgGN1(cR-ytOXHCrE>8J{UL+hY<4Y?pO84BgkhUOa=UmZl3tM`< z+^WS>Jjm~-=&LWt-fyrRQ z#_Gw@_bwY3m5l?FxRV{B-RG4XCjrIP@vZ_NzUvAsPzF~AF{Fd?pRLOmPX|{#UOY|L zG^!Y|FMFA8#RMCe%2YbYA*0UC>pPmCGWN2k1BBPOU~TQEj6PzEjv99Tyxo#RT**5S&OxF3 zbYI=Ef3Zn`fiWuCJm&Dt%95ensMjPf{xO@z0L_HAptO<66iZ%;_e#I)p(eih@f){J zr61Wb+~wdt_+hD@T7Oh*s*azjJu8tig`njs$QTa`yk_Z7VG?IF@`Wc??zQ`8(uoqZ zWAlx9PHtxWWUh{~t~yjiR#rsvKX|VHQ(^x~3N$!I>i5|LtV;)DgW~F9{&Jr^*e5x8 z^x3s_ci-4oEc#isB~gmYW`?Z|1XGT2hY<5T(Bnw%vLuAPk1Gw+%rZ|3S`T41)%30S&Q=plXA&?ic65%Y#*5yn0f8`%;E`j0_XB zDh0dOPRj|&fGljgb@T#;Ff>vvJ%@pc3OuI$Dj{I0Ts6)6g!X z*-K5~m8cs@b#!lj8g%hY0my1P7s5!Pp(hsg%ktS90nc1(^tpb#QcC!#cvDI_F9ic_ zS~#fhB0@Dck{Vy57Ibtj=SrUAzopHew1h}HcDFquEu=9<7YK7C)KYJ2>Gm{(5uaMT zq9E{Z4#=;pR3mi0Iq4_>lZcCyoBaaLY~9$WFm#GZjsott7r<&Dx5=iYWiz1?x~?l( zxH*K|p(tPp9nGS}*v1lLtxE0dHl{5o!9pIurn!AHZqW+O+Vx`?|7kNwbI#6`s=p1% zg=@P|Zmk(DO=>1;C$(BRO$hJPo0%>kGWDUh0qc6q=O{i6Vhh=DALJT3O6^#`ud^zeEPweSnKO$T!6Z( zqDjd4B2#reeC>9HRhG%2B}1IqkFaxSmJh4*xi)HH`^@#77O&Hs{ChNGcqh4gqAPv9 zFC$%5)*Bi{hBc}+J)NP=2jzm}nO4@#Q-c!iCp8$$v#p*oedhqF6`o6r9c3pMd-rwR zXYPAfR?=+O%>!*7@*>}w_B_LnXt`b9g`$^1b{#mr6(Exs`!+TKg@<( zbp~jEj;ksbmdK70+AP}VEtBS75`Ro($lPrk^uf`aVX00OzhE+kcY9#_d~DDs>t-U| z!RZBy<)EOU2;o%Sld*)*Z0$f^?SOddg4~o-8~?*yc>3^brr@7lv8#9QHa`zlvprC~ zwn9#Ii1P^&^55j7W-#N$-}+Aad)h3HN-*BBWHg_)FeS@~g!p;V zBLt3##3ro_klO-VggY>FoF6Ai9{!3L*vhlF+~fHoxp3ePjoq3#m2qo;xFvn$rf{~f ztg|~d)c92yu#B_Ro0v&lw_5~l7HumuOok0E$KiBI?IkHDg>YB^1d0U0DJ9DYht*xy z(T6efA18{9i;wxy$}-!JWp}MCsiGe}IZ^R6&l6rBL}#Qc$-Y_JFfmRtj|_Ide5|vf^XaHHPY#$+F)og*|)NhetN|N9->K&HboB2akytmPctDiNV;JDcJzqUjeB^BUf9r1CmnQdIsQWD-P2bPuJGQ= z$w+yNhkD7KUyJZcg&AC$rN#xDvQP|hA>a6Nx4&c?AjS19oTj2k_W`3V+adH zP5Hj_wZeB3A3%v7XW8(H zwq{G3=$paGi`LINnmC`~kBX8Q&=T?rkEbg#>k#PE;y|fCdOR7sr<$5# zc2pgbr{s+PP%=Fuz2k|Cf~D!HAcV3=SKI52mm@446G4_cgkk)oQt#jYS!#upKrBOJ z&~pz@j04}cqMQInjoDs8go_;vG9+|TBJAINo<5+&ouO<_&j%xO+n)7LjB83wU!wsp zsw6V7OJfD8n5aj&sz&kIi$+kQWE}~ya#L$2@@3aa!XHylc{eVjFr+1b*9r&^E&tR5 zYlei3O-fbMrOedUPH_%?+A6ch$v6FV#qlDg*42yTnYE&b$?lfK&FcNB)bjY?+G<+9 z_bJ)@9KA0Muj#LXN4o2+w>!$4?7p5~dp<&pHnoP2o3~sl`Uhj4{ts3f|CJQ*SS$wb zUnF6Zr1UnZm^y|zU($aR8Xch=lI={w9HqpD<27+%T8$;El}fII1&&)8Q(L~+1oDkx zLd;xP#&cq{sq#KWHFuGeaS7No*b3lKl(SB@)~5A7$=4Q)u>y60M?nkupcj_7ytE30 z(vpY}v#IyQ2?j1=T7!?`Yb=F_h)rN;&DF}Js}keG=y>EGh$@wNu|ca4NvixLnfXckLTy{;f{N_eU$(V zyFBvY&g-j+-(7a*1{%lh_k00FOcps7i6zRB90rrNZXb)NR}$;u{_2SUmK0fo$^MKQ zD#X>9=}x$;WwqlsONZjL8SsBn-h+8>@W=3^kfm6qQ^ z7fO&~nOZ;rCz~Lr<*`kM|BoqlHEF^0aQhZqyNqUau(?mV2xp!$wb`4VlmW#^3 ztTge}1znpuD&G5o5eUUQ7FDHhGau0;~2c-F5sMyvhQ((#DQev4|f_Jvl zl#*iSL}jQSKqgqFw7658(sF8y*yEcRg2u}9_7Rpf4tU})p0g|Kz>7!ln+O*WyCVm^ zHze#ZNX;PH*tq}oZH7SCi6kl4_|*Ap!JmnHDs?XJ=UYjTrH!3%L| z3WDS7 z23McYe!Y9bM3YDU;r4%HUhwZsGXAL)3f$E03ymEEy7XSCm{+X6Z}IEIHjbXR7T>=< z2nkC}``LK70U>-_DNuJEzfxMjYPbYJzYwY~4yKXa@%jR z?j&doQYhC&nL0nb`e{0^^X2RENm1qR77lL<&-M`|FgqFsMS*6};$YR`csDJLnbP)^ z+}XA#N`#C{`NvMP-agcdZ%dAgoMP-A087-j-Evz&c%OL)ws|x%;(xLcczmtF3V-zR z`Hb(xdB1n?$pL(p28&Txcne1gLkEt$U=11ACWg6l4-yKm!Sp7h*yL^N724I zJwIR3-nV4&Kl%cZ>Yh6nFIS&xh|)z=Mk+0lbzqDYWJm8ku9K1;l5?6 zo_&!vy|yZvYqv7$Iq^E-x^!%yRPVb$t_`%Sfwby8tdEp+11SigqsyyHED${}1`0FC zl?{K5)dm^>a=E&C&8&gRe1ys|iWb?wNrQw3R{PFebipsf(_C1>wqg)}{_<2W7)Opt z;h2#FuiM7N_ZEsOU1PbiF3+MY1RGg$UssAz67|%p06Vf36`vIun)9$EagATZ1*rLY zkE|j6eTzAaG}VnRg?Tvj{kBqlQoD5xc;Mt&GrjOsoTZ=cZkBtji5q{1$dbfp3pXFG z;Z%y}L@`z0)Z)NF4<#l^=e#i^okKrpPK_KkYl)E$zp-SZ($s%I%>c|b3HqJ8d7 zq8L+jYKqissJ)#=pUt7r8uYvx?EHIz(IoJ=t}aoMe{Md?mM#vJN!%aD{#6S;=`CdK z#TiMcFN6nW{C|Zf{)H5PxO&JT4h33Jw<_UQWTVVl9DGq z)WUN1H?VF?Z(6spm8_#dNenJP0V9YCtj>-H<3^H~Q#I7dWE0Stq|<9+^7D?H@66OZ z0UWuC61QPUZN^2b+52;sWyN3*Iq{kaCs}tj7N5w*n&~8o)^Fb4?#^`9{nE3%OlC$n z%!VuTIaMT6V_}%sdGNf2hOm|AQ=j6*;sDFV=Rc-ifVo>Vs+IvV&O72Z`U z0TpXVZ^2I@gE_1ch_rA{Tq9)_nNsEGc|I*8ASJHEihT?%!IIG@4YJ0|1F~?ld@Ye6 zm3&oBqE5+=+D_3zWKqa42DdX?s^;A(185xs4!5ZY(fpxJhRay<%U$K61`f@tf1{x>cFAB+`GR-&WRK(9~tG-}OF6 znR^~^YO*w21bT78G)Cf6xKpWn+-pZ}WgdTJ=e%GbQ-dgRq}c;4R4Brt;&H(sg!-;u z&N_t-PXm6=)kfj7LNyIj-e^v{7?i!XbteZBcPHRe+?;*ECKkP2%$Xetrv@I-T7GP< ztllX33c?tuQ((jxOH2utBO~EA!tA?bw2?#K8UFBKCndng>QR2(%s&3)Re*leCPVqJ zpS}Q2=NnE1wz+p%@#;j!7`XMLQ5|;y=}U&TZ9~HGHnUZa_$Mt(2`m_l6Z1= zarJ;FNBb22$ZsQ%QKu*SO3uW9OVZfgC77(FeVpRE#R-G?CZpVaGB?_xVZ>)kzbO6W zE~q24KudRO_2QZ3{^N!bt{IV>9!{xBV>P49`#YMoMcXO{kTx+oDjecq z{`8`n=pB3|yK4d40SEZ;j9K^FPYpW1mwK5rK7S_*;`S>Ra4K2>Q;?BUq^cPGeQ%Mp$h_cV$rq#Jo28 zPhn1%wik?=hwCBbN1>EB)O?Ap|129@hdf>3LB89~RboX$zW9+IM<|(~@3+XudExy_ zv_K`_C`z?WR{EzP_14x|WyPmR_%{8ZwryyM@Z_Pn7l zEvYPgTj?BFDkPG@LzKEWYFR_Y2of2Qh^LSrjVE~qv7A6+h0ofw0k_~+=11P8!??(^ zO8$b*B!!KPF*7deRO8fE)2o*-@Vm9KAiJF8=<%|ckGyyhEXISFeHlXgKFgvC0yZ)S zST}hC!Y3+~Oa7s}f*dk9;0IAQP5Xmn4`s^po2GEL2wCgg*h8$XzU&Lv(;79$&++jU z=kA%%mfS3UDjluI0B1(Zp2kgu#BjFqz)D8ldy3OtSv|QDn8RhK< zakVFdOKCU8gKXCF16rhu(Z^PezfMa+)izIJq;^&|+-YjO^k8odyN6pkrS~8W4BknV zFQ(#UHoUdc*g=emv@g5EV{qvSZ|bNSAA~|@zMug`ac&%mxPZuTPheywcasJqLX1U5 zu+x3%YB8jI`bZres?oY9t(kD@^G2>PZMBJX;CL{VxR=rt|1P~-pQ;lm%Jb=uD!PKE ze})RDWaV(1ac+O>>48k93wrm3GA|YWLd1cXB5UGsbg8)%FAjb<7<*v*Ak)*<+*ZuI zZNT@C*HOyuOK_n~dSZq0R=x`G8H=%D0-D}pjt{ZJeW>;}8k|w?Kt-I79QT|4X*n}7 zVJT%kYWk>3acLkLrU%F%RPpq38%luzYD zg<3`mHq^iI@E31Uu;wk_vwc@v{j{`!+312 z-9hM2y0>81TD9eiw$f;AvUZQp3uL6V3+1>)Q=y@w>6i=Pl4CESZ!!E9qJjK z94hr*@_5{GX+&y8v3JD&0B89 z17E2NBAhA!j?V!31`q*Pr)J|9JSul)IlJxDa?qoz5U*Hd9KyzpsLb^WokqJgHF8+x zcU-IJ=M^HYu(wVzJU$k9x#T5EBjZL>lUj#Ib9}iq*t=6Z(dLnY)Y9r0TwV_?D&}ip zW5)`|!Hx~1tQ{o4pzWA(%O-JQJ1j?}DWwj&u`q^1Wj>pQ?@NKExVRB`fVx2N{Mw@I z@9H7XpwAq=){ln*%Bn|l!arwa)1aZ-2pUqY_?SaWQql;HIzqc4f+?g|4tuf|i?N@j z^7%XhEFZO`>24Fo%3@|?wjy!a`t0H)!x=VB$0chO{ZOdB^*3Ra@u5+gdU5XRhp3A$ zK}Q5$!`n+fq(9HIR4}{IJc0$*5l*8Aagh~?@V;}x%9`X2U6P3Kt7J~h?m$Pj3P)z` zP&qp1<8ht87h$Y_bKHNpVROP7YCutxGX=9H^lN zK~W~Wbv;QhjysQvb0bnwv5t(R812ZIUfk$>h^0pyCxT@GUn;k65tHs4Td^?a5s{R= zzyum#6YnR?j?YuY0^4I9TaT0~4^ZJLzoLB{aYow6t9oORU=YY!UPGp0{ROFNVbmoy zhhjK7GBA9|d1S!)swk9q6;m%Z%fGk&u_MLY$SFQ8LqAYHPqr=GWx5hqMUqbvWb5Bw zx1m!>0wL1scIv2yZvEB2gx@E(Z?iEL|M2C?YsPj9q2}pC7yHzkuCFP-yeCR*=44xA zWb2`sQChDu=KnxnbSA&{BQI>IZS1mqDKc+kpL!Hd?QL_i$f+MP9eMF7LMwK8>^WGa3q9UquU8t#3i|F6bKMIlXJCbh(x6>M=%VVeey-#d% z95V1M{+{Ym_yldFJvT9qSR7*4u8_)*Y~AbUj(3v*C(w7a_~m^SQj22Dma%@@^@W80 za%K6FVX|GKepLyM;=w1)v1hTH-OL>et^8V*0OvqP!Fh1;2uLQW=*0WX^psGIl;MhB z*HJ!JV%acfEIdKJ#>}JeiKDD|mShwPOU&x+Y%9Yf(;El|09Qgg%ypX()zx3(*brdGPIuF4qa^#_F~f!`-r4!OxzAfrvArrjX8u~J`DBs zgNkMar<8r1q>{RKaCxRMuasPuz>9XZmydd&Q*BM=rjWN2jHL*PG{!rbM?JyJla+VP zYf(z({H8G`SE~jAq6&i#(XsrM}8{lMFDb@kh2o>5@rbjAH9Cy4R>>>{3P32?fpbZBkj zh8(xAd1BJ&XM94rfwAQ&XXX*UA*77wk#uUZ02xhclRmH(H<#H?J%w5@nv(v5jNKTx zeZnV#r%1n}?B|qP$(nwy$0~F%Ci>c&BbYgIJQsN^*4rF2gvUN9IVXH>E^_*iRTyJJYe{hwl#I`F$K-TMQoFu7-##AAXOjm=BF!iHqAWC6vka% zQnur$z;uVhiybMw->bgXdEbg{Fr~>m2TmECha$FMtoDN7IV>>^OcfjeCq2cXYjs$O zvm_wqa~9$j1Z!uRKqzVTJ=yhUG&^GLBdsRLVPN7Vw5ifr#&XJlugI5!Hd2iOQe26m zj1CI>ab{pMJ;=z8yZ;ELAebQH{H1N@*8b5oY zBXxvSKuapRSW2Xi#jJ+A)X131Q&@Z`cRbrpUx>4h)3 zg^|$wl`%HfEo`8ZBS)mYs(1_rdyWKTHB(hlN|>9!)4>SE#b+dyn@r5-wnmbFQ^ClG z>sh@DBc@NCqEsOTa&jZ7+)QB^l*V7LOy#UOlrF}jG6mp+q?cNhS#t9e1OpLi(R9YM z4ND-!bN>Iv-Tfb=lYdqZI`%{ES`v9J?j0fMy$}wkGJ?9z)FVOo>&tfLA`XUEUSqAX z#qh{+3~9T;(MTJ45*ZtpfdfuhEujVlIWUutZhf*6BnHD;MgiT}+a}(ZRR6Sbhhc_S z-FhBbU6zG=f3NItgbk*0tZCCvyd^Rt+wX%rQvqVVksu^{`slWSMFrlk5e)-kT$MOF zHkFb`cD(##ma>U8yXsH()?7YaThd?ld~^9T=KnFcVS_qu?M5KNuX*Vg?T@#|CQ`q) zAN!~uvU2N5JElDluA;(&lF0h^YEHU4aN>u$aV+BF`3b+! zi}-^j0x5+Bsdu+6WG$$fSr?4!{H9LN88e^2kX98CX-cn<6Pl=~88?a(#xXqTpp}0>oPkdeXH0Lr-y&@`X-o1tUcw>uITV zG)J8U;%h47^<*C*i458de&XVJ8Gn}?p(tb(r7F61B^j3fh7=Ok1kPWiv14_fp2vKz zB>8IBF04HK1`6m4;NKjH+X$?Ku_~V)UNOfO__xB()3C#vgj&H#ubJ#<-1zAuO9~g1 zMGAo&#l?BW4ws36kmor+E0M%VeDz5dyJvrf_;TEK1Cqc7jnxw)ADq|ED;oPJ@FqG! zy3Z=skNu0P<6Hzj{?HbfrwXbLWK09*JzJA2nhGj^yl|4HZdl%LSNbx|k{QuInE~I= zCa1~C?LC~EH26$NBOoSbb?=M=J9=lBa6<x=$vfi0-H*P}Of3*z}KF+PZSqZV|qw%vN z();c#9~(7J@X-$IiBBU5COS@gl1 z|-FG~J-=)DA@y z(&I0pD(WRlm&MmPUEK7u)if{__$0p(5uP&cKxu<@+8`d@s?9Ej;c>j7^%TzvBK50s zCFqZH>c#W)r$S&>18Nl^+QHsc!Eu1C9n5D_Y9Sps&eost!j0fv})5f>SL zTd-#g6KW?99i<@Bj#VA#X6Lw0$fbhVquov9oB9EwRc&X&jf{sOxio7;Fp!lIc7j;ZTP5^fIWwlDNw#6+=bFtxEp zTPf4{xQ=QH!dNN%+10nM$IM%ynLECWW528iXwN{*DY{#b9Hgc*)#j?<;)HsFW@4+Q z~9UWP8z#(zzRh2rJ|1=ZWAi&6Bp%)^Hzqz&-u^MMDI#kAWYzeM5*O3YgJ z6R&orZgl_hw@j(`yP1SdRyCzhIjXzde8|(;V2^+D?I_zTqp9vmoIy?)dhxvW6(R0g z+?WRkI}~L2M_tO1S{gvU1$*kq2U*~Ve82E9W4q%-dRh#U!6KVLWX8uiNle7W)>bY7 zlRSq0{!Kw5tkZUp5?`zM9?QV4m;^#tD;gtK@N&evP_YIPtPuZ{Lv_#`!SP5f4iv`XL0G?4o}!XP{H?4na_DtgpC!`{=0sn*BSC?9=WMH`>}Rl4eG=*smHt2Bc{ zLz*O`PtVrASuV8B`^vC|{R`I*I{Z#EiXTx-VVx9i2`&uvK1}pgnQv$n7+0xRb+iUI z9+U}=WmsA@PY%G^k83I|PB-6`>N@#LF7sTNZ!0=F+qtdbJ#*W=w3K4MYVL1ymlOHk zwCfReNXPB`J_NG_v~`DC_nW6Q=7i_PJ6rksTDkqF_VNGI$^TReK%=2UQRtH~Q9c1Q z*Q6s4>5pl<w7q?)D*bvSVmT_{!ff~Ik#V+M6@giXs z*X|aPpZAeJC96`fX0r5{Z8eAf}6#tC;&zP-ldKA@kz!>20XGFd%Gb9^up=7kAVo zWDbiE1E7IO16`wmI8Mq*DXd*+dkP+JmxX)#=ESlOifa_k zS#GRh(lKZJ%NX78*O~cln1RDmSc zz?7G$9|UQuoDn0rV_p-7rwiAu+~h?qFXBf8$@gDbFBP#1Di%wmFd91%hiQV}xP#HW zK8@rrOM`18Sop*n2^m+<2rWE|dRbCX5%`?t_KGB8EJEq{lH`S$wwO|PB{m*&FhHPb z!^?BXwBsz6(m^gQqr>D!Rw)}Tj*jZjU3u3Zn@Fy2Yd1}~zSItpnM}<2TR^w{pRM78 zipV&Q@Ri)P1s*XCW@^nnTt{e_^xp2JKwLP{D7WH1ZeIRMv+pO-G;G6gwChU#0|D7^ z+n`IkgHc9XVHTG9#9;a6)C9^7L(dUe{DfDk)4z!~E$SPT?l_fQZGJJM4{DU2Ff6R?`!eizrGi% z%L$;JJGV3j=%Mj}fj6{RLgl$icgn`*%)gM*6%BtG+q0J2oWj~|Hde8~`t=#b`KM8A zq!SXUD(Le(<-thTRQ7nz77`)NCb<>juFeQa=fd26|D%Mh*cCh40MW-(!kxI!sa}@o z9gN8$9}>To`~mDDX}v3>(^4^qMZfv;dp*);NWfJU+b)0EQ{AcA(ozK!HR}2a6lQqcAp-Uyxl| z9}@6ixZthgIUn>G*zJkhfjd#^rUA1xY+x2IJG(_lT9hhKt?RgPSFcHhE?E}Cajts>bkH(;=$BG35cf6#%t9W(m5EEdT_KU6#AR|| zbW{Z0*0Ca$h^$5;#fP^m51_=4aa#hn zmUBz$*L?*!g_r^TZuXsVFe*c4kV*jYV3?XTH?=0o3_Ahw=1g%DLo+yO!RlE@6X!F6 z5m8coIwD@-u`~r1Eka#7Tqw;KytAV-ruo!sGLD?zNF)8w$sL3c;g?9IfTXmFhwRhw zlXV8IZt4Vc4cE6{t4hLh(ERx*87s`u;rBDqXPD3-1^;IWG@#zA0HUPg$k!eR## z;R1ny21JfrJ|5kEN#k3Z5Eph&tdsfLU>b#c>eXuhH+U7 zhEU=pEtpuDi4`-&lFJ0q&&j8}>lcxgWW|8j@_OzXekuD_jPdCkRLUlc87Zxu;vD>R zRi=-VuKVhW;zUZUsuw6SYDM)Xx?2)9s`n;S%Ho1*tLgYYBxmt+^t?2+%?yk4m z>L_cn{dRWc@kno^sWoiOtmQ(%FR1eAf1}g*Z=`_FYCdp(BZ-(GW3Wa?*D=oekp07G zbbxY5v@;8Hl#m#V)x?HsG#0N^z+DFN9X8V^H+^sj8- z<8f$l<~?Qc4gi3u2B2yh|uDsqHC zZ80oZY#b+ZwpKb#nS=mA&m;FhR6*a$X{WhF;KsV`y{UpmfZt4e=i(<*a|HhDEghPI zE+@Sa9C8}TLGv9$)O%@zrHO0(`9R>uXfaa z&llKw6NL_iVhOUO2SH@5TSp?Q6(rhtzu$#p7Z+NA$?rxC$HLN`KSuK_fS!7D;sfeCLv_Cvy%BzICh9npO%cCi%ehU3+cr%0TP!GIXQmQ_WEw;e(PcdO1EwoU<>)-!H}gLdm8^krGQfhYHKo0=&JI3Qvrg6_uuW02ybK)Zk8b zOwFz_1jRKm29B2M?CDw5*yD>Mcup^^0?r>Hufv^zAO{WxFG%P?po)H!kx}34n{AuYC;Gnt)8 zAJ7u6?a`92Z?Uf~4iD8+HsOm!l|AM+W$-F1CKF;sjn$MyZ&WM#yBVy&Sw4`qc^p;wftBYo-)^5U)8owqp_o3o52$u{ff=!EkT{w`r-4|qWjwiAz|2*ueG}?HiU088S19x zTS5m|34;;#388yq5xTiz${ev-ZT+|S^idO*S%~!`=?X-sdTgJ+ zTzRS{N*_g|RN3jEvnnkmOw2vE6@zu!R|AONYM2XkzOFa=5yBOs%k! z_=psv70k2#kOd0&uk@ZeYlB~gr8={QZbs|f{pF#WKZY8W#5JYBzG@p4-<>b4aEal@ zx;TwA7i?tBd0in!Mf|Q_3A-apLE%}Uff)~LBG=e?tiOtn*YGOJ&!>pPP+isVLYRkB z*LO3;JEdD&p9e{iNqehR!W~5|fp>V|2nQMD5lK6Xr6@vDkt~iDs2Nz2)`c%QSVq+J z3z`1JhblFjz+YtSS0VC0IZHm@UN60~B5C{+EJGTtDcpRpid!L`9m!mMU5`&g$|7x7 z8rllcQyE3{R_aHmXGRfGP|!Dlzo}IIdQTEb8J^Ry8Yb68=_;(kCL|eAPW(yFc+5YF z$u-zpA=dJ2kQM)iZ&iz)hwqWmNPHD2l_WE$h~e1GcxuxT6=xtUE$9ZI@y&yv;LUc{ z)LeXQlAKCv`-DSkD&J|QOxz%8n(scQO1@i6Uh3CL8*iU|lOV<%m69wu6Jlqp)@ywr zv!3-0Vzu*8SG8xJY8rv!4l5X&ZRuXjlsn(6QBE(at`Kd+3wi*^q`uZK=ctp8iDwLbynGP_q#$4Eoqs$BAl28 z-=}t?kwf`q1{p9cle+OgKNT(=q|7ZtWU3s!VE{6#2mmVJ8=AJHpyx2!a^8}#fuZQQ z{a0|k=VglGAF8x8;wiIWQ(P$-+ABiiyfop*R2P0q-lIjZ0)q(}&S1F}HUs^mdX=Uf z4aHXE$d-(TcRI4a))vUqJUS8RBvWVKt|MmN#!}==tjoB#IOY->UkjwNv zy3NPI$l%f0LJlSu#hOu9c3ksxe|4+;iJiTLbVmapq};1Y$-jIRamnx`QWsFbJ7N!%&%Nz*Y(h&&P% z%IJD(L*2YHsSmAV#N{>-A)Y(1PIn${ez~JK*g(qZSZpfJT3b#0R)?L!=rKx{(fMUs zCLGN&)wrWxp_fA}sq!5ymnyUPzEsTN^>Iuy(>o8NaS=79V=c$l&->+^!J}nz0-18A z;+Mc2?!VsCPIgwu>DO908zP?R%Hfwei%4hE#i-#mDfRW^RMRFbHjlCm#VzWGv=o`W za(}R##cS%hqtCsHeK)o4rP<#nV8LeYsxntUyK0 zgg1)QHX3cGY1PSr!rS)$96M{5zk$VI8+~d^%BhBrZ6!B4TUu|JbO~V!(8@PtiXou_ z%aW7w8&>W)r?*i+-y8gN2aypHV7*g(-3%Ig^2%SgX@jxs_b=XdsE+S?9fafwn>>-r zlzIy!Gk*z87OtTalh!uX*eyZXwldX9|aOk@pz@+sq z>r&QOpG(5X%{hp?xP6TBhxsw1*#?vBeK9xEp=QWu!>}OroVxh&$>M1u`G*@9=88O{!4o^ zap0uqA4X%XuHAJQg9PmN0w#Gh7J6SYkMx4jau>9kpMh*WA^2&)lv)v|B3Yz0O#UnstSmcc{4x zl}_OvTCc`Kd*VmvblMC_M&KYK87@R2?j!6&wx3P?pxnW)Eh(&gn`sq!%Zexa1zn$;+aG z{C^T>(Y8NGa#y4}yKV||4VSUXi8;X9?9DoNIjK=`_!1Xae&&_|ZOO^xr`FPVEby8o zd6Z4~vQ3wF9KUM>WeO&zLYLeyG! zrPSk3yx+(cq^>lP^&btSkn~WQ5ZtD9>r!`Oi}HNFQ^u6j_Dxgc7B3%cG0pC6KHZnj zaK`MsP~@d1m=E6?Pqw{nAwP#we|ZP@H$A^ehn&+PD?0P z+{{zLe#UBK5RYLnpXJlr<~~q)8wE};v!^D>Lyh@P{j!)IAGeS+8!@>n=!zmCpw8kK z@+qryT^HV+Jb(CcZ{Xy7QtU}SjNOZsp9o`>CH7w=HH;M1ReYW7JV8dTPImrIzW)cG Tn4&#A&~~2x_$})HL)`rfhDm4d literal 0 HcmV?d00001 diff --git a/airsonic-main/src/test/resources/MEDIAS/Search/SpecialPath/accessible's/ARTIST3/ALBUM_C/FILE03.mp3 b/airsonic-main/src/test/resources/MEDIAS/Search/SpecialPath/accessible's/ARTIST3/ALBUM_C/FILE03.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..cdd7842226e5b2ed87f5fa3527e257ab39854766 GIT binary patch literal 11494 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 WmUvPKF-X@+hDM7m2#8kH0&K|lmW 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 WmUvPKF-X@+hDM7m2#8kH0&K|lmW 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 WmUvPK^cs3cL^`2&1RkXKCQUjjRip_5 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 Jzvbf3zW|_xK|ufj literal 0 HcmV?d00001 From eb5963dfa3aff63dfe1e00426e4d84896fdd7405 Mon Sep 17 00:00:00 2001 From: "tesshu.com" Date: Mon, 8 Jul 2019 00:27:04 +0900 Subject: [PATCH 2/9] Update airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java Fix comment Co-Authored-By: jvoisin --- .../airsonic/player/service/search/AnalyzerFactoryTestCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java index f244eabc..262f3eb7 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java @@ -424,7 +424,7 @@ public class AnalyzerFactoryTestCase { assertEquals("988", terms.get(4)); assertEquals("aria", terms.get(5)); - // Underbars around words, ascii and semicolon. + // Underscores around words, ascii and semicolon. query = "_ID3_ARTIST_ Céline Frisch: Café Zimmermann"; terms = toTermString(query); assertEquals(5, terms.size()); From c74ef2ea30739242e516822990d20376e36f341d Mon Sep 17 00:00:00 2001 From: "tesshu.com" Date: Mon, 8 Jul 2019 00:27:55 +0900 Subject: [PATCH 3/9] Update airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java Fix comment Co-Authored-By: jvoisin --- .../airsonic/player/service/search/AnalyzerFactoryTestCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java index 262f3eb7..00f46f32 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java @@ -413,7 +413,7 @@ public class AnalyzerFactoryTestCase { * Case using test resource name */ - // Semicolon , comma and hyphen. + // Semicolon, comma and hyphen. String query = "Bach: Goldberg Variations, BWV 988 - Aria"; List terms = toTermString(query); assertEquals(6, terms.size()); From 5bfc2320211536643544b6e708e97b5b3c9089e7 Mon Sep 17 00:00:00 2001 From: "tesshu.com" Date: Mon, 8 Jul 2019 00:28:08 +0900 Subject: [PATCH 4/9] Update airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java Fix comment Co-Authored-By: jvoisin --- .../airsonic/player/service/search/AnalyzerFactoryTestCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java index 00f46f32..4f61c6e7 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java @@ -434,7 +434,7 @@ public class AnalyzerFactoryTestCase { assertEquals("cafe", terms.get(3)); assertEquals("zimmermann", terms.get(4)); - // Underbars around words and slashes + // Underscores around words and slashes. query = "_ID3_ARTIST_ Sarah Walker/Nash Ensemble"; terms = toTermString(query); assertEquals(5, terms.size()); From 810920556e383676e10a1ef86b34a8bc29875537 Mon Sep 17 00:00:00 2001 From: "tesshu.com" Date: Mon, 8 Jul 2019 00:28:16 +0900 Subject: [PATCH 5/9] Update airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java Fix comment Co-Authored-By: jvoisin --- .../airsonic/player/service/search/AnalyzerFactoryTestCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java index 4f61c6e7..e9680023 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/AnalyzerFactoryTestCase.java @@ -444,7 +444,7 @@ public class AnalyzerFactoryTestCase { assertEquals("nash", terms.get(3)); assertEquals("ensemble", terms.get(4)); - // space + // Space assertEquals(asList("abc", "def"), toTermString(" ABC DEF ")); assertEquals(asList("abc1", "def"), toTermString(" ABC1 DEF ")); From 76f665b3c4afa8a30b5e8135b160c7dac86136e9 Mon Sep 17 00:00:00 2001 From: "tesshu.com" Date: Mon, 8 Jul 2019 00:28:29 +0900 Subject: [PATCH 6/9] Update airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java Fix comment Co-Authored-By: jvoisin --- .../service/search/SearchServiceSpecialGenreTestCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java index 4953e08b..6e658338 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java @@ -45,7 +45,7 @@ import static org.springframework.util.ObjectUtils.isEmpty; @DirtiesContext( classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) /* - * Tests to clarify strings that can be used in genre. + * Tests to prove what kind of strings/chars can be used in the genre field. */ public class SearchServiceSpecialGenreTestCase { From f67c758c4e144259b329ae6c01dfad82fe86a34c Mon Sep 17 00:00:00 2001 From: tesshucom Date: Mon, 8 Jul 2019 01:09:49 +0900 Subject: [PATCH 7/9] Add missing test cases --- .../SearchServiceSpecialGenreTestCase.java | 71 ++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java index 6e658338..799ea8b3 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java @@ -137,11 +137,78 @@ public class SearchServiceSpecialGenreTestCase { @Test public void testQueryEscapeRequires() { - + /* - * Legacy is not searchable. (FILE01 - FILE16) + * There are 19 files + * in src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A. + * In FILE01 to FILE16, Special strings for Lucene syntax are stored + * as tag values ​​of Genre. + * + * Legacy can not search all these genres. + * (Strictly speaking, the genre field is not created at index creation.) */ + List folders = getTestMusicFolders(); + + Function simpleStringCriteria = s -> + new RandomSearchCriteria(Integer.MAX_VALUE, // count + s, // genre, + null, // fromYear + null, // toYear + folders // musicFolders + ); + + List songs = searchService.getRandomSongs(simpleStringCriteria.apply("+")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply("-")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply("&&")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply("+")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply("||")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply(" ("));// space & bracket + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply(")")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply("{}")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply("[]")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply("^")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply("\"")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply("~")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply("*")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply("?")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply(":")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply("\\")); + Assert.assertEquals(0, songs.size()); + + songs = searchService.getRandomSongs(simpleStringCriteria.apply("/")); + Assert.assertEquals(0, songs.size()); + } @Test From 4a728ed9a6da5a5c53b75178cea02bdd6f679f02 Mon Sep 17 00:00:00 2001 From: tesshucom Date: Mon, 8 Jul 2019 05:44:03 +0900 Subject: [PATCH 8/9] Add and modify comments --- .../SearchServiceSpecialGenreTestCase.java | 57 ++++++++++--------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java index 799ea8b3..760d99a1 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java @@ -108,6 +108,11 @@ public class SearchServiceSpecialGenreTestCase { return musicFolders; } + /* + * A count to deliberately stagger the execution of populateDatabase. + * If populate Database is called from multiple methods almost simultaneously, + * it may not execute correctly. + */ private int count = 1; private synchronized void populateDatabase() { @@ -135,19 +140,18 @@ public class SearchServiceSpecialGenreTestCase { } } + /* + * There are 19 files + * in src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A. + * In FILE01 to FILE16, Special strings for Lucene syntax are stored + * as tag values ​​of Genre. + * + * Legacy can not search all these genres. + * (Strictly speaking, the genre field is not created at index creation.) + */ @Test public void testQueryEscapeRequires() { - /* - * There are 19 files - * in src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A. - * In FILE01 to FILE16, Special strings for Lucene syntax are stored - * as tag values ​​of Genre. - * - * Legacy can not search all these genres. - * (Strictly speaking, the genre field is not created at index creation.) - */ - List folders = getTestMusicFolders(); Function simpleStringCriteria = s -> @@ -211,13 +215,12 @@ public class SearchServiceSpecialGenreTestCase { } + /* + * Jaudiotagger applies special treatment to bracket (FILE17). + * + */ @Test public void testBrackets() { - - /* - * Jaudiotagger applies special treatment to bracket (FILE17). - * - */ List folders = getTestMusicFolders(); @@ -245,12 +248,12 @@ public class SearchServiceSpecialGenreTestCase { } + /* + * Jaudiotagger applies special treatment to numeric. (FILE18) + */ @Test public void testNumericMapping() { - /* - * Jaudiotagger applies special treatment to numeric. (FILE18) - */ List folders = getTestMusicFolders(); RandomSearchCriteria criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count @@ -269,18 +272,18 @@ public class SearchServiceSpecialGenreTestCase { } + /* + * Other special strings. (FILE19) + * + * {'“『【【】】[︴○◎@ $〒→+]FULL-WIDTHCæsar's + * + * Legacy stores with Analyze, + * so searchable characters are different. + * + */ @Test public void testOthers() { - /* - * Other special strings. (FILE19) - * - * {'“『【【】】[︴○◎@ $〒→+]FULL-WIDTHCæsar's - * - * Legacy stores with Analyze, - * so searchable characters are different. - * - */ List folders = getTestMusicFolders(); RandomSearchCriteria criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count From 4ce892e39dc550a7824f8ba8784cfa9ce95deb74 Mon Sep 17 00:00:00 2001 From: tesshucom Date: Wed, 10 Jul 2019 04:45:22 +0900 Subject: [PATCH 9/9] Fix for duplication and synchronization. - Moved MusicFolderTestData from org.airsonic.player.service to org.airsonic.player.util --- ...AbstractAirsonicRestApiJukeboxIntTest.java | 1 + .../service/MediaScannerServiceTestCase.java | 1 + .../search/AbstractAirsonicHomeTest.java | 138 +++++++++++++++++ .../service/search/AirsonicHomeTest.java | 45 ++++++ .../SearchServiceSpecialGenreTestCase.java | 126 ++-------------- .../SearchServiceSpecialPathTestCase.java | 106 ++----------- ...archServiceStartWithStopwardsTestCase.java | 104 ++----------- .../service/search/SearchServiceTestCase.java | 140 +++--------------- .../{dao => util}/MusicFolderTestData.java | 3 +- 9 files changed, 239 insertions(+), 425 deletions(-) create mode 100644 airsonic-main/src/test/java/org/airsonic/player/service/search/AbstractAirsonicHomeTest.java create mode 100644 airsonic-main/src/test/java/org/airsonic/player/service/search/AirsonicHomeTest.java rename airsonic-main/src/test/java/org/airsonic/player/{dao => util}/MusicFolderTestData.java (97%) diff --git a/airsonic-main/src/test/java/org/airsonic/player/api/jukebox/AbstractAirsonicRestApiJukeboxIntTest.java b/airsonic-main/src/test/java/org/airsonic/player/api/jukebox/AbstractAirsonicRestApiJukeboxIntTest.java index c56e9a0b..f49d66a9 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/api/jukebox/AbstractAirsonicRestApiJukeboxIntTest.java +++ b/airsonic-main/src/test/java/org/airsonic/player/api/jukebox/AbstractAirsonicRestApiJukeboxIntTest.java @@ -7,6 +7,7 @@ import org.airsonic.player.service.MediaScannerService; import org.airsonic.player.service.PlayerService; import org.airsonic.player.service.SettingsService; import org.airsonic.player.util.HomeRule; +import org.airsonic.player.util.MusicFolderTestData; import org.airsonic.player.util.StringUtil; import org.junit.*; import org.junit.runner.RunWith; diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/MediaScannerServiceTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/MediaScannerServiceTestCase.java index 86ffdfae..f7c895f6 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/MediaScannerServiceTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/MediaScannerServiceTestCase.java @@ -18,6 +18,7 @@ import org.airsonic.player.TestCaseUtils; import org.airsonic.player.domain.Album; import org.airsonic.player.domain.Artist; import org.airsonic.player.util.HomeRule; +import org.airsonic.player.util.MusicFolderTestData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/AbstractAirsonicHomeTest.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/AbstractAirsonicHomeTest.java new file mode 100644 index 00000000..0681f799 --- /dev/null +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/AbstractAirsonicHomeTest.java @@ -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 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 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(); + } + } + } + } + +} \ No newline at end of file diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/AirsonicHomeTest.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/AirsonicHomeTest.java new file mode 100644 index 00000000..b30116ef --- /dev/null +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/AirsonicHomeTest.java @@ -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 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(); + +} diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java index 760d99a1..e4e09b6c 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialGenreTestCase.java @@ -1,143 +1,47 @@ package org.airsonic.player.service.search; -import com.google.common.base.Function; +import static org.springframework.util.ObjectUtils.isEmpty; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.Map; -import org.airsonic.player.TestCaseUtils; -import org.airsonic.player.dao.DaoHelper; -import org.airsonic.player.dao.MusicFolderDao; -import org.airsonic.player.dao.MusicFolderTestData; import org.airsonic.player.domain.MediaFile; import org.airsonic.player.domain.MusicFolder; import org.airsonic.player.domain.RandomSearchCriteria; -import org.airsonic.player.service.MediaScannerService; import org.airsonic.player.service.SearchService; -import org.airsonic.player.service.SettingsService; -import org.airsonic.player.util.HomeRule; import org.junit.Assert; import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; import org.junit.Test; -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.core.io.ResourceLoader; -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; -import static org.springframework.util.ObjectUtils.isEmpty; -@ContextConfiguration( - locations = { - "/applicationContext-service.xml", - "/applicationContext-cache.xml", - "/applicationContext-testdb.xml", - "/applicationContext-mockSonos.xml" }) -@DirtiesContext( - classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +import com.google.common.base.Function; + /* * Tests to prove what kind of strings/chars can be used in the genre field. */ -public class SearchServiceSpecialGenreTestCase { +public class SearchServiceSpecialGenreTestCase extends AbstractAirsonicHomeTest { - @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); - } - }; - - @Rule - public final SpringMethodRule springMethodRule = new SpringMethodRule(); - - @Autowired - private MediaScannerService mediaScannerService; - - @Autowired - private MusicFolderDao musicFolderDao; - - @Autowired - private DaoHelper daoHelper; + private List musicFolders; @Autowired private SearchService searchService; - @Autowired - private SettingsService settingsService; - - @Rule - public TemporaryFolder temporaryFolder = new TemporaryFolder(); - - @Autowired - ResourceLoader resourceLoader; - - @Before - public void setup() throws Exception { - populateDatabase(); - } - - private static boolean dataBasePopulated; - - private static Function resolvePath = (childPath) ->{ - return MusicFolderTestData.resolveBaseMediaPath() + childPath; - }; - - private List musicFolders; - - private List getTestMusicFolders() { + @Override + public List getMusicFolders() { if (isEmpty(musicFolders)) { musicFolders = new ArrayList<>(); - - File musicDir = new File(resolvePath.apply("Search/SpecialGenre")); + File musicDir = new File(resolveBaseMediaPath.apply("Search/SpecialGenre")); musicFolders.add(new MusicFolder(1, musicDir, "accessible", true, new Date())); - } return musicFolders; } - /* - * A count to deliberately stagger the execution of populateDatabase. - * If populate Database is called from multiple methods almost simultaneously, - * it may not execute correctly. - */ - private int count = 1; - - private synchronized void populateDatabase() { - - try { - Thread.sleep(300 * count++); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - if (!dataBasePopulated) { - getTestMusicFolders().forEach(musicFolderDao::createMusicFolder); - settingsService.clearMusicFolderCache(); - TestCaseUtils.execScan(mediaScannerService); - System.out.println("--- Report of records count per table ---"); - Map records = TestCaseUtils.recordsInAllTables(daoHelper); - records.keySet().stream().filter(s -> s.equals("MEDIA_FILE") // 20 - | s.equals("ARTIST") // 5 - | s.equals("MUSIC_FOLDER")// 3 - | s.equals("ALBUM"))// 5 - .forEach(tableName -> System.out - .println("\t" + tableName + " : " + records.get(tableName).toString())); - System.out.println("--- *********************** ---"); - dataBasePopulated = true; - } + @Before + public void setup() throws Exception { + populateDatabaseOnlyOnce(); } /* @@ -152,7 +56,7 @@ public class SearchServiceSpecialGenreTestCase { @Test public void testQueryEscapeRequires() { - List folders = getTestMusicFolders(); + List folders = getMusicFolders(); Function simpleStringCriteria = s -> new RandomSearchCriteria(Integer.MAX_VALUE, // count @@ -222,7 +126,7 @@ public class SearchServiceSpecialGenreTestCase { @Test public void testBrackets() { - List folders = getTestMusicFolders(); + List folders = getMusicFolders(); RandomSearchCriteria criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count "-(GENRE)-", // genre, @@ -254,7 +158,7 @@ public class SearchServiceSpecialGenreTestCase { @Test public void testNumericMapping() { - List folders = getTestMusicFolders(); + List folders = getMusicFolders(); RandomSearchCriteria criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count "Rock", // genre, @@ -284,7 +188,7 @@ public class SearchServiceSpecialGenreTestCase { @Test public void testOthers() { - List folders = getTestMusicFolders(); + List folders = getMusicFolders(); RandomSearchCriteria criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count "{'“『【【】】[︴○◎@ $〒→+]FULL-WIDTHCæsar's", // genre, diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialPathTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialPathTestCase.java index 62380963..132323cd 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialPathTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceSpecialPathTestCase.java @@ -1,49 +1,21 @@ package org.airsonic.player.service.search; -import com.google.common.base.Function; - import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; -import org.airsonic.player.TestCaseUtils; -import org.airsonic.player.dao.DaoHelper; -import org.airsonic.player.dao.MusicFolderDao; -import org.airsonic.player.dao.MusicFolderTestData; import org.airsonic.player.domain.MediaFile; import org.airsonic.player.domain.MusicFolder; -import org.airsonic.player.service.MediaScannerService; import org.airsonic.player.service.SearchService; -import org.airsonic.player.service.SettingsService; -import org.airsonic.player.util.HomeRule; import org.junit.Assert; import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; import org.junit.Test; -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.core.io.ResourceLoader; -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; import static org.springframework.util.ObjectUtils.isEmpty; -@ContextConfiguration( - locations = { - "/applicationContext-service.xml", - "/applicationContext-cache.xml", - "/applicationContext-testdb.xml", - "/applicationContext-mockSonos.xml" }) -@DirtiesContext( - classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) /* * Test cases related to #1139. * Confirming whether shuffle search can be performed correctly in MusicFolder containing special strings. @@ -54,95 +26,39 @@ import static org.springframework.util.ObjectUtils.isEmpty; * This test case is a FalsePattern for search, * but there may be problems with the data flow prior to creating the search index. */ -public class SearchServiceSpecialPathTestCase { - - @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); - } - }; - - @Rule - public final SpringMethodRule springMethodRule = new SpringMethodRule(); - - @Autowired - private MediaScannerService mediaScannerService; +public class SearchServiceSpecialPathTestCase extends AbstractAirsonicHomeTest { - @Autowired - private MusicFolderDao musicFolderDao; - - @Autowired - private DaoHelper daoHelper; + private List musicFolders; @Autowired private SearchService searchService; - @Autowired - private SettingsService settingsService; - - @Rule - public TemporaryFolder temporaryFolder = new TemporaryFolder(); - - @Autowired - ResourceLoader resourceLoader; - - @Before - public void setup() throws Exception { - populateDatabase(); - } - - private static boolean dataBasePopulated; - - private static Function resolvePath = (childPath) ->{ - return MusicFolderTestData.resolveBaseMediaPath() + childPath; - }; - - private List musicFolders; - - private List getTestMusicFolders() { + @Override + public List getMusicFolders() { if (isEmpty(musicFolders)) { musicFolders = new ArrayList<>(); - File musicDir = new File(resolvePath.apply("Search/SpecialPath/accessible")); + File musicDir = new File(resolveBaseMediaPath.apply("Search/SpecialPath/accessible")); musicFolders.add(new MusicFolder(1, musicDir, "accessible", true, new Date())); - File music2Dir = new File(resolvePath.apply("Search/SpecialPath/accessible's")); + File music2Dir = new File(resolveBaseMediaPath.apply("Search/SpecialPath/accessible's")); musicFolders.add(new MusicFolder(2, music2Dir, "accessible's", true, new Date())); - File music3Dir = new File(resolvePath.apply("Search/SpecialPath/accessible+s")); + File music3Dir = new File(resolveBaseMediaPath.apply("Search/SpecialPath/accessible+s")); musicFolders.add(new MusicFolder(3, music3Dir, "accessible+s", true, new Date())); } return musicFolders; } - private synchronized void populateDatabase() { - - if (!dataBasePopulated) { - getTestMusicFolders().forEach(musicFolderDao::createMusicFolder); - settingsService.clearMusicFolderCache(); - TestCaseUtils.execScan(mediaScannerService); - System.out.println("--- Report of records count per table ---"); - Map records = TestCaseUtils.recordsInAllTables(daoHelper); - records.keySet().stream().filter(s -> s.equals("MEDIA_FILE") // 20 - | s.equals("ARTIST") // 5 - | s.equals("MUSIC_FOLDER")// 3 - | s.equals("ALBUM"))// 5 - .forEach(tableName -> System.out - .println("\t" + tableName + " : " + records.get(tableName).toString())); - System.out.println("--- *********************** ---"); - dataBasePopulated = true; - } + @Before + public void setup() throws Exception { + populateDatabaseOnlyOnce(); } @Test public void testSpecialCharactersInDirName() { - List folders = getTestMusicFolders(); + List folders = getMusicFolders(); // ALL Songs List randomAlbums = searchService.getRandomAlbums(Integer.MAX_VALUE, folders); diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceStartWithStopwardsTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceStartWithStopwardsTestCase.java index a4b1b778..58854333 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceStartWithStopwardsTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceStartWithStopwardsTestCase.java @@ -1,49 +1,21 @@ package org.airsonic.player.service.search; -import com.google.common.base.Function; - import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.Map; -import org.airsonic.player.TestCaseUtils; -import org.airsonic.player.dao.DaoHelper; -import org.airsonic.player.dao.MusicFolderDao; -import org.airsonic.player.dao.MusicFolderTestData; import org.airsonic.player.domain.MusicFolder; import org.airsonic.player.domain.SearchCriteria; import org.airsonic.player.domain.SearchResult; -import org.airsonic.player.service.MediaScannerService; import org.airsonic.player.service.SearchService; -import org.airsonic.player.service.SettingsService; -import org.airsonic.player.util.HomeRule; import org.junit.Assert; import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; import org.junit.Test; -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.core.io.ResourceLoader; -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; import static org.springframework.util.ObjectUtils.isEmpty; -@ContextConfiguration( - locations = { - "/applicationContext-service.xml", - "/applicationContext-cache.xml", - "/applicationContext-testdb.xml", - "/applicationContext-mockSonos.xml" }) -@DirtiesContext( - classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) /* * Test cases related to #1142. * The filter is not properly applied when analyzing the query, @@ -51,90 +23,32 @@ import static org.springframework.util.ObjectUtils.isEmpty; * In the process of hardening the Analyzer implementation, * this problem is solved side by side. */ -public class SearchServiceStartWithStopwardsTestCase { - - @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); - } - }; - - @Rule - public final SpringMethodRule springMethodRule = new SpringMethodRule(); - - @Autowired - private MediaScannerService mediaScannerService; +public class SearchServiceStartWithStopwardsTestCase extends AbstractAirsonicHomeTest { - @Autowired - private MusicFolderDao musicFolderDao; - - @Autowired - private DaoHelper daoHelper; + private List musicFolders; @Autowired private SearchService searchService; - @Autowired - private SettingsService settingsService; - - @Rule - public TemporaryFolder temporaryFolder = new TemporaryFolder(); - - @Autowired - ResourceLoader resourceLoader; - - @Before - public void setup() throws Exception { - populateDatabase(); - } - - private static boolean dataBasePopulated; - - private static Function resolvePath = (childPath) ->{ - return MusicFolderTestData.resolveBaseMediaPath() + childPath; - }; - - private List musicFolders; - - private List getTestMusicFolders() { + @Override + public List getMusicFolders() { if (isEmpty(musicFolders)) { musicFolders = new ArrayList<>(); - - File musicDir = new File(resolvePath.apply("Search/StartWithStopwards")); + File musicDir = new File(resolveBaseMediaPath.apply("Search/StartWithStopwards")); musicFolders.add(new MusicFolder(1, musicDir, "accessible", true, new Date())); - } return musicFolders; } - private synchronized void populateDatabase() { - - if (!dataBasePopulated) { - getTestMusicFolders().forEach(musicFolderDao::createMusicFolder); - settingsService.clearMusicFolderCache(); - TestCaseUtils.execScan(mediaScannerService); - System.out.println("--- Report of records count per table ---"); - Map records = TestCaseUtils.recordsInAllTables(daoHelper); - records.keySet().stream().filter(s -> s.equals("MEDIA_FILE") // 20 - | s.equals("ARTIST") // 5 - | s.equals("MUSIC_FOLDER")// 3 - | s.equals("ALBUM"))// 5 - .forEach(tableName -> System.out - .println("\t" + tableName + " : " + records.get(tableName).toString())); - System.out.println("--- *********************** ---"); - dataBasePopulated = true; - } + @Before + public void setup() throws Exception { + populateDatabaseOnlyOnce(); } @Test public void testStartWithStopwards() { - List folders = getTestMusicFolders(); + List folders = getMusicFolders(); final SearchCriteria criteria = new SearchCriteria(); criteria.setCount(Integer.MAX_VALUE); diff --git a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceTestCase.java b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceTestCase.java index fb40b0ee..9d2691b9 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceTestCase.java +++ b/airsonic-main/src/test/java/org/airsonic/player/service/search/SearchServiceTestCase.java @@ -5,19 +5,13 @@ import com.codahale.metrics.ConsoleReporter; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.Timer; -import java.io.File; import java.util.Arrays; import java.util.List; -import java.util.Map; import java.util.Random; import java.util.concurrent.TimeUnit; -import org.airsonic.player.TestCaseUtils; import org.airsonic.player.dao.AlbumDao; -import org.airsonic.player.dao.DaoHelper; -import org.airsonic.player.dao.MediaFileDao; import org.airsonic.player.dao.MusicFolderDao; -import org.airsonic.player.dao.MusicFolderTestData; import org.airsonic.player.domain.Album; import org.airsonic.player.domain.Artist; import org.airsonic.player.domain.MediaFile; @@ -27,150 +21,50 @@ import org.airsonic.player.domain.ParamSearchResult; import org.airsonic.player.domain.RandomSearchCriteria; import org.airsonic.player.domain.SearchCriteria; import org.airsonic.player.domain.SearchResult; -import org.airsonic.player.service.MediaScannerService; import org.airsonic.player.service.SearchService; -import org.airsonic.player.service.SettingsService; import org.airsonic.player.service.search.IndexType; -import org.airsonic.player.util.HomeRule; import org.junit.Assert; import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; import org.junit.Test; -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.core.io.ResourceLoader; -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; import org.subsonic.restapi.ArtistID3; -@ContextConfiguration( - locations = { - "/applicationContext-service.xml", - "/applicationContext-cache.xml", - "/applicationContext-testdb.xml", - "/applicationContext-mockSonos.xml" }) -@DirtiesContext( - classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) -public class SearchServiceTestCase { - - @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); - } - }; - - @Rule - public final SpringMethodRule springMethodRule = new SpringMethodRule(); - - private final MetricRegistry metrics = new MetricRegistry(); +public class SearchServiceTestCase extends AbstractAirsonicHomeTest { @Autowired - private MediaScannerService mediaScannerService; + private AlbumDao albumDao; - @Autowired - private MediaFileDao mediaFileDao; + private final MetricRegistry metrics = new MetricRegistry(); @Autowired private MusicFolderDao musicFolderDao; - @Autowired - private DaoHelper daoHelper; - - @Autowired - private AlbumDao albumDao; - @Autowired private SearchService searchService; - @Autowired - private SettingsService settingsService; - - @Rule - public TemporaryFolder temporaryFolder = new TemporaryFolder(); - - @Autowired - ResourceLoader resourceLoader; - @Before public void setup() throws Exception { - populateDatabase(); + populateDatabaseOnlyOnce(); } - private static boolean dataBasePopulated; - - private int count = 1; - - /* - * Cases susceptible to SerchService refactoring and version upgrades. - * It is not exhaustive. - */ - private synchronized void populateDatabase() { + @Test + public void testSearchTypical() { /* - * It seems that there is a case that does not work well - * if you test immediately after initialization in 1 method. - * It may be improved later. + * A simple test that is expected to easily detect API syntax differences when updating lucene. + * Complete route coverage and data coverage in this case alone are not conscious. */ - try { - Thread.sleep(300 * count++); - } catch (InterruptedException e) { - e.printStackTrace(); - } - if (!dataBasePopulated) { - - MusicFolderTestData.getTestMusicFolders().forEach(musicFolderDao::createMusicFolder); - settingsService.clearMusicFolderCache(); - TestCaseUtils.execScan(mediaScannerService); - System.out.println("--- Report of records count per table ---"); - Map records = TestCaseUtils.recordsInAllTables(daoHelper); - records.keySet().stream().filter(s -> s.equals("MEDIA_FILE") // 20 - | s.equals("ARTIST") // 5 - | s.equals("MUSIC_FOLDER")// 3 - | s.equals("ALBUM"))// 5 - .forEach(tableName -> System.out - .println("\t" + tableName + " : " + records.get(tableName).toString())); - // Music Folder Music must have 3 children - List listeMusicChildren = mediaFileDao.getChildrenOf( - new File(MusicFolderTestData.resolveMusicFolderPath()).getPath()); - Assert.assertEquals(3, listeMusicChildren.size()); - // Music Folder Music2 must have 1 children - List listeMusic2Children = mediaFileDao.getChildrenOf( - new File(MusicFolderTestData.resolveMusic2FolderPath()).getPath()); - Assert.assertEquals(1, listeMusic2Children.size()); - System.out.println("--- *********************** ---"); - dataBasePopulated = true; - } - } - - @Test - public void testSearchTypical() { - - /* - * A simple test that is expected to easily detect API syntax differences when updating lucene. - * Complete route coverage and data coverage in this case alone are not conscious. - */ + List allMusicFolders = musicFolderDao.getAllMusicFolders(); + Assert.assertEquals(3, allMusicFolders.size()); + + // *** testSearch() *** - List allMusicFolders = musicFolderDao.getAllMusicFolders(); - Assert.assertEquals(3, allMusicFolders.size()); - - // *** testSearch() *** - - String query = "Sarah Walker"; - final SearchCriteria searchCriteria = new SearchCriteria(); - searchCriteria.setQuery(query); - searchCriteria.setCount(Integer.MAX_VALUE); - searchCriteria.setOffset(0); + String query = "Sarah Walker"; + final SearchCriteria searchCriteria = new SearchCriteria(); + searchCriteria.setQuery(query); + searchCriteria.setCount(Integer.MAX_VALUE); + searchCriteria.setOffset(0); /* * _ID3_ALBUMARTIST_ Sarah Walker/Nash Ensemble diff --git a/airsonic-main/src/test/java/org/airsonic/player/dao/MusicFolderTestData.java b/airsonic-main/src/test/java/org/airsonic/player/util/MusicFolderTestData.java similarity index 97% rename from airsonic-main/src/test/java/org/airsonic/player/dao/MusicFolderTestData.java rename to airsonic-main/src/test/java/org/airsonic/player/util/MusicFolderTestData.java index b2c03870..44b719a9 100644 --- a/airsonic-main/src/test/java/org/airsonic/player/dao/MusicFolderTestData.java +++ b/airsonic-main/src/test/java/org/airsonic/player/util/MusicFolderTestData.java @@ -1,4 +1,4 @@ -package org.airsonic.player.dao; +package org.airsonic.player.util; import org.airsonic.player.domain.MusicFolder; @@ -38,4 +38,5 @@ public class MusicFolderTestData { liste.add(musicFolder2); return liste; } + }