/** * Copyright (C) 2009-2013 FoundationDB, LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.foundationdb.server.collation; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.concurrent.atomic.AtomicInteger; import com.foundationdb.server.error.UnsupportedCollationException; import org.junit.Test; import com.ibm.icu.text.Collator; public class AkCollatorFactoryTest { private final static int NTHREADS = 10; private AkCollatorFactory.Mode DEFAULT_MODE = AkCollatorFactory.Mode.STRICT; @Test public void uniquePerThread() throws Exception { final AtomicInteger threadIndex = new AtomicInteger(); final Collator[] array = new Collator[NTHREADS]; Thread[] threads = new Thread[NTHREADS]; for (int i = 0; i < NTHREADS; i++) { threads[i] = new Thread(new Runnable() { public void run() { int index = threadIndex.getAndIncrement(); AkCollatorICU icu = (AkCollatorICU) (AkCollatorFactory.getAkCollator("sv_se_ci")); array[index] = icu.collator.get(); } }); } for (int i = 0; i < NTHREADS; i++) { threads[i].start(); } for (int i = 0; i < NTHREADS; i++) { threads[i].join(); } for (int i = 0; i < NTHREADS; i++) { assertNotNull("Null", array[i]); for (int j = 0; j < i; j++) { assertTrue("Not unique", array[i] != array[j]); } } } @Test public void makeMySQLCollator() throws Exception { AkCollatorFactory.Mode saveMode = AkCollatorFactory.getCollationMode(); try { AkCollatorFactory.setCollationMode(DEFAULT_MODE); final AkCollator collator = AkCollatorFactory.getAkCollator("sv_se_ci"); assertEquals("Collector should have correct name", "sv_se_ci_co", collator.getScheme()); } finally { AkCollatorFactory.setCollationMode(saveMode); } } @Test public void collatorById() throws Exception { AkCollatorFactory.Mode saveMode = AkCollatorFactory.getCollationMode(); try { AkCollatorFactory.setCollationMode(DEFAULT_MODE); AkCollator collator = AkCollatorFactory.getAkCollator(0); assertEquals("Should be the AkCollatorBinary singleton", AkCollatorFactory.UCS_BINARY_COLLATOR, collator); } finally { AkCollatorFactory.setCollationMode(saveMode); } } @Test(expected = IllegalArgumentException.class) public void collationBadMode() throws Exception { AkCollatorFactory.Mode saveMode = AkCollatorFactory.getCollationMode(); try { AkCollatorFactory.setCollationMode(DEFAULT_MODE); AkCollatorFactory.setCollationMode("Invalid"); } finally { AkCollatorFactory.setCollationMode(saveMode); } } @Test(expected = UnsupportedCollationException.class) public void collationBadName() throws Exception { AkCollatorFactory.Mode saveMode = AkCollatorFactory.getCollationMode(); try { AkCollatorFactory.setCollationMode("Strict"); AkCollatorFactory.getAkCollator("fricostatic_sengalese_ci"); } finally { AkCollatorFactory.setCollationMode(saveMode); } } @Test(expected = UnsupportedCollationException.class) public void collationBadScheme() throws Exception { CollationSpecifier collationSpecifier = new CollationSpecifier("en_us_bad_arguments"); AkCollatorFactory.forScheme(collationSpecifier); } @Test public void collationLooseMode() throws Exception { AkCollatorFactory.Mode saveMode = AkCollatorFactory.getCollationMode(); try { AkCollatorFactory.setCollationMode("LOOSE"); assertEquals("Should be binary", AkCollatorFactory.UCS_BINARY_COLLATOR, AkCollatorFactory .getAkCollator("fricostatic_sengalese_ci")); assertEquals("Collector should have correct name", "en_ie_ci_cx", AkCollatorFactory.getAkCollator( "en_ie_ci_cx").getScheme()); } finally { AkCollatorFactory.setCollationMode(saveMode); } } @Test public void collationDisabledMode() throws Exception { AkCollatorFactory.Mode saveMode = AkCollatorFactory.getCollationMode(); try { AkCollatorFactory.setCollationMode("Disabled"); assertEquals("Should be binary", AkCollatorFactory.UCS_BINARY_COLLATOR, AkCollatorFactory .getAkCollator("latin1_swedish_ci")); assertEquals("Should be binary", AkCollatorFactory.UCS_BINARY_COLLATOR, AkCollatorFactory .getAkCollator("invalid_collation_name")); assertEquals("Should be binary", AkCollatorFactory.UCS_BINARY_COLLATOR, AkCollatorFactory .getAkCollator("en_us_ci")); } finally { AkCollatorFactory.setCollationMode(saveMode); } } @Test public void fromCache() throws Exception { AkCollatorFactory.Mode saveMode = AkCollatorFactory.getCollationMode(); try { AkCollatorFactory.setCollationMode(DEFAULT_MODE); AkCollator c = AkCollatorFactory.getAkCollator("sv_se_ci"); int cid = c.getCollationId(); int hits = AkCollatorFactory.getCacheHits(); for (int i = 0; i < 10; i++) { c = AkCollatorFactory.getAkCollator("sv_se_ci"); } assertEquals("Should have used cache", hits + 10, AkCollatorFactory.getCacheHits()); for (int i = 0; i < 10; i++) { c = AkCollatorFactory.getAkCollator(cid); } assertEquals("Should have used cache", hits + 20, AkCollatorFactory.getCacheHits()); } finally { AkCollatorFactory.setCollationMode(saveMode); } } }