From ef6e713214ee61583a83339c7b2c2f1580e2943a Mon Sep 17 00:00:00 2001 From: ribeaudc <ribeaudc> Date: Tue, 12 Jun 2007 07:11:45 +0000 Subject: [PATCH] change: - 'DBRestrictions' and 'SQLCommandTokenizer' (with corresponding Unit tests) moved from package 'ch.systemsx.cisd.common.parser' to package 'ch.systemsx.cisd.common.db' - [DBRestrictions] 'findInArray' method uses 'ArrayUtils.indexOf' method. - [DBRestrictions] better diagnostics when command starts correctly but can not be parsed because it is ill-formed. SVN: 467 --- .../cisd/common/db/DBRestrictionsTest.java | 183 ++++++++++++++++++ .../cisd/common/db/DBRestrictionsTest.sql | 50 +++++ .../common/db/SQLCommandTokenizerTest.java | 111 +++++++++++ 3 files changed, 344 insertions(+) create mode 100644 common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.java create mode 100644 common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql create mode 100644 common/sourceTest/java/ch/systemsx/cisd/common/db/SQLCommandTokenizerTest.java diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.java new file mode 100644 index 00000000000..15defe1c9a4 --- /dev/null +++ b/common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.java @@ -0,0 +1,183 @@ +/* + * Copyright 2007 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.common.db; + +import static org.testng.AssertJUnit.assertEquals; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +import org.testng.annotations.Test; + +import ch.systemsx.cisd.common.exceptions.UserFailureException; +import ch.systemsx.cisd.common.logging.LogInitializer; +import ch.systemsx.cisd.common.utilities.FileUtilities; + +/** + * Test cases for the {@link DBRestrictions}. + * + * @author Bernd Rinn + */ +public class DBRestrictionsTest +{ + + static + { + LogInitializer.init(); + } + + @Test + public void testNormalize() + { + final List<String> normalizedList = DBRestrictions.normalize(" a 1 ;; B\t2;\n\nC; \n--D\n E "); + assertEquals(Arrays.asList("a 1", "b 2", "c", "e"), normalizedList); + } + + @Test + public void testGetDomains() + { + final List<String> domainScript = + Arrays.asList("create table sometable", "create domain user_id as varchar(15)", + "create domain bla for varchar(0)", "create domain code as varchar(8)", + "create domain description_80 as varchar(81)"); + final Map<String, Integer> domains = DBRestrictions.parseDomains(domainScript); + final Map<String, Integer> expectedDomains = new HashMap<String, Integer>(); + expectedDomains.put("user_id", 15); + expectedDomains.put("code", 8); + expectedDomains.put("description_80", 81); + assertEquals(expectedDomains, domains); + } + + @Test + public void testColumnLengths() + { + final String sqlScript = + FileUtilities.loadToString(getClass(), "/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql"); + assert sqlScript != null; + final DBRestrictions parser = new DBRestrictions(sqlScript); + + assertEquals(10, parser.getTableRestrictions("contacts").getLength("cnta_type")); + assertEquals(30, parser.getTableRestrictions("contacts").getLength("firstname")); + assertEquals(1, parser.getTableRestrictions("contacts").getLength("midinitial")); + assertEquals(30, parser.getTableRestrictions("contacts").getLength("lastname")); + assertEquals(50, parser.getTableRestrictions("contacts").getLength("email")); + assertEquals(15, parser.getTableRestrictions("contacts").getLength("user_id")); + + assertEquals(8, parser.getTableRestrictions("material_types").getLength("code")); + assertEquals(80, parser.getTableRestrictions("material_types").getLength("description")); + + assertEquals(50, parser.getTableRestrictions("materials").getLength("name")); + assertEquals(4, parser.getTableRestrictions("materials").getLength("mate_sub_type")); + } + + @Test(expectedExceptions = AssertionError.class) + public void testInvalidTable() + { + final DBRestrictions parser = new DBRestrictions(""); + assertEquals(Integer.MAX_VALUE, parser.getTableRestrictions("doesnotexit").getLength("doesnotexist")); + } + + @Test(expectedExceptions = AssertionError.class) + public void testInvalidColumn() + { + final DBRestrictions parser = new DBRestrictions("create table tab (a integer, b varchar(1))"); + assertEquals(Integer.MAX_VALUE, parser.getTableRestrictions("tab").getLength("doesnotexist")); + } + + @Test + public void testCheckedConstraints() + { + final String sqlScript = + FileUtilities.loadToString(getClass(), "/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql"); + assert sqlScript != null; + final DBRestrictions parser = new DBRestrictions(sqlScript); + + assertEquals(new HashSet<String>(Arrays.asList("PERS", "ORGA")), parser.getTableRestrictions("contacts") + .getCheckedConstaint("cnta_type")); + assertEquals(new HashSet<String>(Arrays.asList("STOB", "MATE")), parser.getTableRestrictions("materials") + .getCheckedConstaint("mate_sub_type")); + } + + @Test + public void testCheckOK() + { + final String sqlScript = + FileUtilities.loadToString(getClass(), "/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql"); + assert sqlScript != null; + final DBRestrictions parser = new DBRestrictions(sqlScript); + + parser.check("contacts", "cnta_type", "ORGA"); + parser.check("material_types", "code", "somecode"); + } + + @Test(expectedExceptions = UserFailureException.class) + public void testCheckViolateLength() + { + final String sqlScript = + FileUtilities.loadToString(getClass(), "/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql"); + assert sqlScript != null; + final DBRestrictions parser = new DBRestrictions(sqlScript); + + try + { + parser.check("material_types", "code", "somecode1"); + } catch (UserFailureException ex) + { + System.err.println(ex.getMessage()); + throw ex; + } + } + + @Test(expectedExceptions = UserFailureException.class) + public void testCheckAlternatives() + { + final String sqlScript = + FileUtilities.loadToString(getClass(), "/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql"); + assert sqlScript != null; + final DBRestrictions parser = new DBRestrictions(sqlScript); + + try + { + parser.check("materials", "mate_sub_type", "stob"); + } catch (UserFailureException ex) + { + System.err.println(ex.getMessage()); + throw ex; + } + } + + @Test(expectedExceptions = UserFailureException.class) + public void testCheckNotNullConstraint() + { + final String sqlScript = + FileUtilities.loadToString(getClass(), "/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql"); + assert sqlScript != null; + final DBRestrictions parser = new DBRestrictions(sqlScript); + + try + { + parser.check("material_types", "description", null); + } catch (UserFailureException ex) + { + System.err.println(ex.getMessage()); + throw ex; + } + } +} diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql b/common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql new file mode 100644 index 00000000000..39419d793b6 --- /dev/null +++ b/common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql @@ -0,0 +1,50 @@ +-- D:\DDL\postgresql\3V_LIMS_Version_1.sql +-- +-- Generated for ANSI SQL92 on Thu May 10 15:50:21 2007 by Server Generator 10.1.2.6.18 + + + CREATE DOMAIN DESCRIPTION_80 AS VARCHAR(80); +CREATE DOMAIN USER_ID AS VARCHAR(15); +CREATE DOMAIN TECH_ID AS INTEGER; +CREATE DOMAIN OBJECT_NAME AS VARCHAR(50); +CREATE DOMAIN CODE AS VARCHAR(8); +CREATE DOMAIN DESCRIPTION_250 AS VARCHAR(250); +CREATE TABLE EXPERIMENT_TYPES (CODE CODE NOT NULL,DESCRIPTION +DESCRIPTION_80 NOT NULL) ; +CREATE TABLE CONTACTS (ID TECH_ID NOT NULL,CNTA_TYPE VARCHAR(10) NOT NULL DEFAULT 'PERS',FIRSTNAME VARCHAR(30),MIDINITIAL VARCHAR(1),LASTNAME VARCHAR(30),EMAIL VARCHAR(50),USER_ID USER_ID,CNTA_ID_ORGANIZATION TECH_ID,ORGANIZATION_NAME OBJECT_NAME,DESCRIPTION DESCRIPTION_80) ; +CREATE TABLE MATERIAL_TYPES (CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_80 NOT NULL) ; +CREATE TABLE MATERIALS (ID TECH_ID NOT NULL,NAME OBJECT_NAME,MATE_SUB_TYPE VARCHAR(4) NOT NULL DEFAULT 'MATE',MATY_CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_250) ; +CREATE TABLE EXPERIMENTS (ID TECH_ID NOT NULL,NAME OBJECT_NAME,CNTA_ID_REGISTERER TECH_ID NOT NULL,MATE_ID_STUDY_OBJECT TECH_ID NOT NULL,EXTY_CODE CODE NOT NULL,REGISTRATION_DATE DATE,DESCRIPTION DESCRIPTION_250) ; + +ALTER TABLE EXPERIMENT_TYPES ADD CONSTRAINT EXTY_PK PRIMARY KEY(CODE); +ALTER TABLE CONTACTS ADD CONSTRAINT CNTA_PK PRIMARY KEY(ID); +ALTER TABLE MATERIAL_TYPES ADD CONSTRAINT MATY_PK PRIMARY KEY(CODE); +ALTER TABLE MATERIALS ADD CONSTRAINT MATE_PK PRIMARY KEY(ID); +ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_PK PRIMARY KEY(ID); + +ALTER TABLE CONTACTS ADD CONSTRAINT AVCON_1178805021_CNTA__000 CHECK (CNTA_TYPE IN + ('PERS', + 'ORGA') +) ; +ALTER TABLE MATERIALS ADD CONSTRAINT AVCON_1178805021_MATE__000 CHECK (MATE_SUB_TYPE IN ('MATE', 'STOB')) ; +ALTER TABLE CONTACTS ADD CONSTRAINT CNTA_CNTA_ORGANIZATION_FK FOREIGN KEY (CNTA_ID_ORGANIZATION)REFERENCES CONTACTS(ID); +ALTER TABLE MATERIALS ADD CONSTRAINT MATE_MATY_FK FOREIGN KEY (MATY_CODE)REFERENCES MATERIAL_TYPES(CODE); +ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_CNTA_FK FOREIGN KEY (CNTA_ID_REGISTERER)REFERENCES CONTACTS(ID); +ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_MATE_FK FOREIGN KEY (MATE_ID_STUDY_OBJECT)REFERENCES MATERIALS(ID); +ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_EXTY_FK FOREIGN KEY (EXTY_CODE)REFERENCES EXPERIMENT_TYPES(CODE); + +-- D:\DDL\oracle\3V_LIMS_Version_1.sqs +-- +-- Generated for Oracle 9i on Thu May 10 15:49:25 2007 by Server Generator 10.1.2.6.18 + +-- Creating Sequence 'CONTACT_ID_SEQ' +CREATE SEQUENCE CONTACT_ID_SEQ; + +-- Creating Sequence 'EXPERIMENT_ID_SEQ' +CREATE SEQUENCE EXPERIMENT_ID_SEQ; + +-- Creating Sequence 'MATERIAL_ID_SEQ' +CREATE SEQUENCE MATERIAL_ID_SEQ; + + + diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/db/SQLCommandTokenizerTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/db/SQLCommandTokenizerTest.java new file mode 100644 index 00000000000..a771314becd --- /dev/null +++ b/common/sourceTest/java/ch/systemsx/cisd/common/db/SQLCommandTokenizerTest.java @@ -0,0 +1,111 @@ +/* + * Copyright 2007 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.common.db; + +import org.testng.annotations.Test; +import static org.testng.AssertJUnit.*; + +/** + * Test cases for the {@link SQLCommandTokenizer}. + * + * @author Bernd Rinn + */ +public class SQLCommandTokenizerTest +{ + @Test + public void testNormal() + { + final SQLCommandTokenizer cmdTokenizer = new SQLCommandTokenizer("A;\nb;\ncC;"); + assertEquals("a", cmdTokenizer.getNextCommand()); + assertEquals("b", cmdTokenizer.getNextCommand()); + assertEquals("cc", cmdTokenizer.getNextCommand()); + assertNull(cmdTokenizer.getNextCommand()); + } + + @Test + public void testOneLine() + { + final SQLCommandTokenizer cmdTokenizer = new SQLCommandTokenizer("A;b;cC;"); + assertEquals("a", cmdTokenizer.getNextCommand()); + assertEquals("b", cmdTokenizer.getNextCommand()); + assertEquals("cc", cmdTokenizer.getNextCommand()); + assertNull(cmdTokenizer.getNextCommand()); + } + + @Test + public void testMissingSemicolon() + { + final SQLCommandTokenizer cmdTokenizer = new SQLCommandTokenizer("A;\nb;\ncC"); + assertEquals("a", cmdTokenizer.getNextCommand()); + assertEquals("b", cmdTokenizer.getNextCommand()); + assertEquals("cc", cmdTokenizer.getNextCommand()); + assertNull(cmdTokenizer.getNextCommand()); + } + + @Test + public void testMissingSemicolonButEOL() + { + final SQLCommandTokenizer cmdTokenizer = new SQLCommandTokenizer("A;\nb;\ncC\n"); + assertEquals("a", cmdTokenizer.getNextCommand()); + assertEquals("b", cmdTokenizer.getNextCommand()); + assertEquals("cc", cmdTokenizer.getNextCommand()); + assertNull(cmdTokenizer.getNextCommand()); + } + + @Test + public void testWhitespaces() + { + final SQLCommandTokenizer cmdTokenizer = new SQLCommandTokenizer(" A ; \n b B;\t c\tC\n "); + assertEquals("a", cmdTokenizer.getNextCommand()); + assertEquals("b b", cmdTokenizer.getNextCommand()); + assertEquals("c c", cmdTokenizer.getNextCommand()); + assertNull(cmdTokenizer.getNextCommand()); + } + + @Test + public void testCommentLine() + { + final SQLCommandTokenizer cmdTokenizer = + new SQLCommandTokenizer(" A ; \n\n -- Some Comment \nb B;\t c\tC\n "); + assertEquals("a", cmdTokenizer.getNextCommand()); + assertEquals("b b", cmdTokenizer.getNextCommand()); + assertEquals("c c", cmdTokenizer.getNextCommand()); + assertNull(cmdTokenizer.getNextCommand()); + } + + @Test + public void testMoreCommentLines() + { + final SQLCommandTokenizer cmdTokenizer = + new SQLCommandTokenizer(" A ; \n\n -- Some Comment \n--'Bla'\n\nb B;\t c\tC\n "); + assertEquals("a", cmdTokenizer.getNextCommand()); + assertEquals("b b", cmdTokenizer.getNextCommand()); + assertEquals("c c", cmdTokenizer.getNextCommand()); + assertNull(cmdTokenizer.getNextCommand()); + } + + @Test + public void testConstants() + { + final SQLCommandTokenizer cmdTokenizer = new SQLCommandTokenizer("A 'A \\'B\tc';\nb;\ncC;"); + assertEquals("a 'A \\'B\tc'", cmdTokenizer.getNextCommand()); + assertEquals("b", cmdTokenizer.getNextCommand()); + assertEquals("cc", cmdTokenizer.getNextCommand()); + assertNull(cmdTokenizer.getNextCommand()); + } + +} -- GitLab