Merge "Bug 2933: BidningDOMDataBrokerAdaper implements DataTreeChangeService"
[controller.git] / opendaylight / md-sal / sal-dom-xsql / src / test / java / org / opendaylight / xsql / test / XSQLTest.java
1 package org.opendaylight.xsql.test;
2
3 import java.io.InputStream;
4 import java.sql.SQLException;
5 import java.util.Collections;
6 import java.util.Set;
7
8 import org.junit.Assert;
9 import org.junit.Before;
10 import org.junit.BeforeClass;
11 import org.junit.Test;
12 import org.opendaylight.controller.md.sal.dom.xsql.XSQLAdapter;
13 import org.opendaylight.controller.md.sal.dom.xsql.XSQLBluePrint;
14 import org.opendaylight.controller.md.sal.dom.xsql.jdbc.JDBCResultSet;
15 import org.opendaylight.controller.md.sal.dom.xsql.jdbc.JDBCServer;
16 import org.opendaylight.yangtools.yang.model.api.Module;
17 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
18 import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
19
20 public class XSQLTest {
21     private static final String DATASTORE_TEST_YANG = "/sal-persisted-dom-test.yang";
22     private XSQLBluePrint bluePrint = null;
23     //private static SchemaContext schemaContext = null;
24     @BeforeClass
25     public static void loadSchemaContext(){
26         //schemaContext = createTestContext();
27     }
28
29     @Before
30     public void before() {
31         try{
32             InputStream in = this.getClass().getClassLoader().getResourceAsStream("BluePrintCache.dat");
33             if(in!=null){
34                 bluePrint = XSQLBluePrint.load(in);
35                 log("Loaded Blue Print!");
36             }else{
37                 log("Can't find Blue Print!");
38             }
39             in.close();
40         }catch(Exception err){
41             err.printStackTrace();
42         }
43     }
44
45     @Test
46     public void testQueryParsingSimpleNoCriteria() {
47         String sql = "select * from nodes/node;";
48         JDBCResultSet rs = new JDBCResultSet(sql);
49         parseTables(sql,bluePrint, rs);
50         parseFields(sql, bluePrint, rs);
51         JDBCServer.parseCriteria(rs, bluePrint);
52         if(rs.getCriteria().isEmpty()){
53             log("Test Criteria parsing of \""+sql+"\" Passed!");
54             Assert.assertEquals(true, true);
55         }else{
56             log("Test Criteria parsing of \""+sql+"\" Failed!");
57             Assert.assertEquals(false, true);
58         }
59     }
60
61     @Test
62     public void testQueryParsingComplexNoCriteria() {
63         String sql = "select nodes/node.id,nodes/node/node-connector.id,nodes/node/node-connector.hardware-address from nodes/node,nodes/node/node-connector;";
64         JDBCResultSet rs = new JDBCResultSet(sql);
65         parseTables(sql,bluePrint, rs);
66         parseFields(sql, bluePrint, rs);
67         JDBCServer.parseCriteria(rs, bluePrint);
68         if(rs.getCriteria().isEmpty()){
69             log("Test Criteria parsing of \""+sql+"\" Passed!");
70             Assert.assertEquals(true, true);
71         }else{
72             log("Test Criteria parsing of \""+sql+"\" Failed!");
73             Assert.assertEquals(false, true);
74         }
75     }
76
77     @Test
78     public void testQueryParsingComplexWithCriteria() {
79         String sql = "select nodes/node.id,nodes/node/node-connector.id,nodes/node/node-connector.hardware-address from nodes/node,nodes/node/node-connector where hardware-address like 'AB';";
80         JDBCResultSet rs = new JDBCResultSet(sql);
81         parseTables(sql,bluePrint, rs);
82         parseFields(sql, bluePrint, rs);
83         JDBCServer.parseCriteria(rs, bluePrint);
84         if(!rs.getCriteria().isEmpty()){
85             log("Test Criteria parsing of \""+sql+"\" Passed!");
86             Assert.assertEquals(true, true);
87         }else{
88             log("Test Criteria parsing of \""+sql+"\" Failed!");
89             Assert.assertEquals(false, true);
90         }
91     }
92
93     @Test
94     public void testQueryParsingSimpleWithCriteria() {
95         String sql = "select * from nodes/node where nodes/node.id like 'something...';";
96         JDBCResultSet rs = new JDBCResultSet(sql);
97         parseTables(sql,bluePrint, rs);
98         parseFields(sql, bluePrint, rs);
99         JDBCServer.parseCriteria(rs, bluePrint);
100         if(!rs.getCriteria().isEmpty()){
101             log("Test Criteria parsing of \""+sql+"\" Passed!");
102             Assert.assertEquals(true, true);
103         }else{
104             log("Test Criteria parsing of \""+sql+"\" Failed!");
105             Assert.assertEquals(false, true);
106         }
107     }
108
109     private static void parseTables(String sql,XSQLBluePrint bp,JDBCResultSet rs){
110         try{
111             JDBCServer.parseTables(rs, bp);
112             log("Test Table parsing of \""+sql+"\" Passed!");
113             Assert.assertEquals(true,true);
114         }catch(SQLException err){
115             log("Test Table parsing of \""+sql+"\" Failed!");
116             err.printStackTrace();
117             Assert.assertEquals(false,true);
118         }
119     }
120
121     @Test
122     public void testQueryParsingComplexWithCriteriaAndGrouping() {
123
124         String sub_sql = "select nodes/node.id,nodes/node/node-connector.id,nodes/node/node-connector.hardware-address from nodes/node,nodes/node/node-connector where hardware-address like 'AB';";
125
126         String sql = "SELECT DISTINCT"
127                 + "\"LOGICAL_TABLE_1\".\"nodes/node.id\" AS \"COL0\"\n"
128                 + ",\"LOGICAL_TABLE_1\".\"nodes/node.address\" AS \"COL1\"\n"
129                 + ",\"LOGICAL_TABLE_1\".\"nodes/node/node-connector.hardware-address\" AS \"COL2\"\n"
130                 + "FROM\n"
131                 + "("+sub_sql+") \"LOGICAL_TABLE_1\"\n";
132
133
134
135         JDBCResultSet rs = new JDBCResultSet(sql);
136         XSQLAdapter.getInstance().loadBluePrint();
137         try{
138             JDBCServer.checkAndBreakSubQueries(rs, XSQLAdapter.getInstance());
139             if(rs.getSubQueries().isEmpty()){
140                 log("Logical table parsing for "+sql+" Failed!");
141             }else{
142                 JDBCServer.parseExternalQuery(rs);
143                 log("Fields="+rs.getFields().size());
144                 Assert.assertEquals(rs.getFields().size(), 3);
145                 Assert.assertEquals(rs.getTables().size(), 1);
146                 Assert.assertEquals(rs.getTables().get(0).getODLTableName(), "LOGICAL_TABLE_1");
147
148                 JDBCResultSet subRS = rs.getSubQueries().values().iterator().next();
149                 parseTables(sql,bluePrint, subRS);
150                 parseFields(sql, bluePrint, subRS);
151                 JDBCServer.parseCriteria(subRS, bluePrint);
152                 if(!subRS.getCriteria().isEmpty()){
153                     log("Test Criteria parsing of \""+sql+"\" Passed!");
154                     Assert.assertEquals(true, true);
155                 }else{
156                     log("Test Criteria parsing of \""+sql+"\" Failed!");
157                     Assert.assertEquals(false, true);
158                 }
159             }
160         }catch(SQLException err){
161             err.printStackTrace();
162         }
163     }
164
165     private static void parseFields(String sql,XSQLBluePrint bp,JDBCResultSet rs){
166         try{
167             JDBCServer.parseFields(rs, bp);
168             log("Test Fields parsing of \""+sql+"\" Passed!");
169             Assert.assertEquals(true,true);
170         }catch(SQLException err){
171             log("Test Fields parsing of \""+sql+"\" Failed!");
172             err.printStackTrace();
173             Assert.assertEquals(false,true);
174         }
175     }
176
177     private static void log(String str) {
178         System.out.print("*** XSQL Tests -");
179         System.out.println(str);
180     }
181
182     public static final InputStream getDatastoreTestInputStream() {
183         return getInputStream(DATASTORE_TEST_YANG);
184     }
185
186     private static InputStream getInputStream(final String resourceName) {
187         return XSQLTest.class.getResourceAsStream(DATASTORE_TEST_YANG);
188     }
189
190     public static SchemaContext createTestContext() {
191         YangParserImpl parser = new YangParserImpl();
192         Set<Module> modules = parser.parseYangModelsFromStreams(Collections.singletonList(getDatastoreTestInputStream()));
193         return parser.resolveSchemaContext(modules);
194     }
195 }