1 package org.opendaylight.controller.yang.model.parser.impl;
3 import static org.hamcrest.core.Is.*;
4 import static org.junit.Assert.*;
5 import static org.junit.matchers.JUnitMatchers.*;
6 import static org.mockito.Mockito.*;
10 import org.antlr.v4.runtime.tree.ParseTree;
11 import org.junit.Before;
12 import org.junit.Test;
13 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Import_stmtContext;
14 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Include_stmtContext;
15 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Module_header_stmtsContext;
16 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Module_stmtContext;
17 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Namespace_stmtContext;
18 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Prefix_stmtContext;
19 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Revision_date_stmtContext;
20 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Revision_stmtContext;
21 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Revision_stmtsContext;
22 import org.opendaylight.controller.antlrv4.code.gen.YangParser.StringContext;
23 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Yang_version_stmtContext;
25 public class YangModelValidationListenerTest_Module {
27 private YangModelValidationListener valid;
28 private Module_stmtContext ctx;
32 valid = new YangModelValidationListener();
35 @Test(expected = YangValidationException.class)
36 public void testRevisionInvalidDateFormat() {
37 Revision_stmtContext mockedRev = mockModuleWithRevision(2, "badFormat");
40 valid.enterRevision_stmt(mockedRev);
41 } catch (YangValidationException e) {
44 containsString("Invalid date format for revision:badFormat in (sub)module:module1, expected date format is:"));
49 private Revision_stmtContext mockModuleWithRevision(int moduleChildren,
51 Revision_stmtContext mockedRev = mock(Revision_stmtContext.class);
52 doReturn(1).when(mockedRev).getChildCount();
53 mockName(mockedRev, date);
55 Revision_stmtsContext revs = mockRevisionsParent(2, mockedRev);
57 mockModuleParent(moduleChildren, revs, "module1");
62 public void testRevisionValidDateFormat() {
63 Revision_stmtContext mockedRev = mockModuleWithRevision(2,
66 valid.enterRevision_stmt(mockedRev);
69 private String getFormattedDate() {
70 return YangModelParserListenerImpl.simpleDateFormat.format(new Date());
73 @Test(expected = YangValidationException.class)
74 public void testNoRevision() {
76 Module_stmtContext ctx = mock(Module_stmtContext.class);
77 doReturn(1).when(ctx).getChildCount();
78 mockName(ctx, "module1");
81 valid.enterModule_stmt(ctx);
82 } catch (YangValidationException e) {
85 containsString("Missing revision statements in module:module1"));
90 @Test(expected = YangValidationException.class)
91 public void testNoHeaderStmts() {
92 mockModuleWithRevision(2, "1999-4-5");
95 valid.enterModule_stmt(ctx);
96 } catch (YangValidationException e) {
99 containsString("Missing header statements in module:module1"));
104 @Test(expected = YangValidationException.class)
105 public void testNoNamespace() {
106 Module_header_stmtsContext header = mock(Module_header_stmtsContext.class);
107 mockModuleParent(2, header, "module1");
110 valid.enterModule_header_stmts(header);
111 } catch (YangValidationException e) {
114 containsString("Missing namespace statement in module:module1"));
120 public void testPrefixes() {
121 Prefix_stmtContext pref = mock(Prefix_stmtContext.class);
122 doReturn(1).when(pref).getChildCount();
123 mockName(pref, "unique1");
124 mockModuleParent(2, pref, "module1");
125 valid.enterPrefix_stmt(pref);
127 pref = mock(Prefix_stmtContext.class);
128 doReturn(1).when(pref).getChildCount();
129 mockName(pref, "unique1");
130 mockModuleParent(2, pref, "module1");
133 valid.enterPrefix_stmt(pref);
134 } catch (Exception e) {
138 fail("Validation Exception should have occured");
142 public void testNamespace() {
143 Namespace_stmtContext namespace = mock(Namespace_stmtContext.class);
144 doReturn(1).when(namespace).getChildCount();
145 mockName(namespace, "http://test.parsing.uri.com");
146 mockModuleParent(2, namespace, "module1");
147 valid.enterNamespace_stmt(namespace);
149 namespace = mock(Namespace_stmtContext.class);
150 doReturn(1).when(namespace).getChildCount();
151 mockName(namespace, "invalid uri");
152 mockModuleParent(2, namespace, "module1");
154 valid.enterNamespace_stmt(namespace);
155 } catch (YangValidationException e) {
158 containsString("Namespace:invalid uri in module:module1 cannot be parsed as URI"));
162 fail("Validation Exception should have occured");
166 public void testImports() {
167 Import_stmtContext impor = mockImport("unique1", "p1");
168 mockModuleParent(2, impor, "module1");
169 valid.enterImport_stmt(impor);
171 impor = mockImport("unique1", "p2");
172 mockModuleParent(2, impor, "module1");
173 mockName(impor, "unique1");
176 valid.enterImport_stmt(impor);
177 } catch (YangValidationException e) {
180 containsString("Module:unique1 imported twice in (sub)module:module1"));
184 fail("Validation Exception should have occured");
188 public void testIncludes() {
189 Include_stmtContext impor = mockInclude("unique1");
190 mockModuleParent(2, impor, "module1");
191 valid.enterInclude_stmt(impor);
193 impor = mockInclude("unique1");
194 mockModuleParent(2, impor, "module1");
195 mockName(impor, "unique1");
198 valid.enterInclude_stmt(impor);
199 } catch (YangValidationException e) {
202 containsString("Submodule:unique1 included twice in (sub)module:module1"));
206 fail("Validation Exception should have occured");
209 private Import_stmtContext mockImport(String name, String prefixName) {
210 Import_stmtContext impor = mock(Import_stmtContext.class);
211 doReturn(3).when(impor).getChildCount();
212 Prefix_stmtContext prefix = mock(Prefix_stmtContext.class);
213 mockName(prefix, prefixName);
214 doReturn(prefix).when(impor).getChild(1);
215 Revision_date_stmtContext revDate = mock(Revision_date_stmtContext.class);
216 mockName(revDate, getFormattedDate());
217 doReturn(revDate).when(impor).getChild(2);
218 mockName(impor, name);
222 private Include_stmtContext mockInclude(String name) {
223 Include_stmtContext impor = mock(Include_stmtContext.class);
224 doReturn(2).when(impor).getChildCount();
225 Revision_date_stmtContext revDate = mock(Revision_date_stmtContext.class);
226 mockName(revDate, getFormattedDate());
227 doReturn(revDate).when(impor).getChild(1);
228 mockName(impor, name);
232 @Test(expected = YangValidationException.class)
233 public void testInvalidYangVersion() {
235 Yang_version_stmtContext yangVersion = mock(Yang_version_stmtContext.class);
236 doReturn(1).when(yangVersion).getChildCount();
237 mockName(yangVersion, "55Unsup");
239 mockModuleParent(2, yangVersion, "module1");
242 valid.enterYang_version_stmt(yangVersion);
243 } catch (YangValidationException e) {
246 containsString("Unsupported yang version:55Unsup, in (sub)module:module1, supported version:"
247 + YangModelValidationListener.SUPPORTED_YANG_VERSION));
252 private void mockModuleParent(int moduleChildren, ParseTree child,
254 ctx = mock(Module_stmtContext.class);
255 doReturn(moduleChildren).when(ctx).getChildCount();
256 mockName(ctx, moduleName);
257 doReturn(child).when(ctx).getChild(1);
258 doReturn(ctx).when(child).getParent();
261 static Revision_stmtsContext mockRevisionsParent(int moduleChildren,
262 Revision_stmtContext mockedRev) {
263 Revision_stmtsContext revs = mock(Revision_stmtsContext.class);
264 doReturn(moduleChildren).when(revs).getChildCount();
265 doReturn(mockedRev).when(revs).getChild(1);
266 doReturn(revs).when(mockedRev).getParent();
271 public void testValidYangVersion() {
273 Yang_version_stmtContext ctx = mock(Yang_version_stmtContext.class);
274 doReturn(1).when(ctx).getChildCount();
277 valid.enterYang_version_stmt(ctx);
281 public void testIdentifierMatching() {
282 YangModelValidationListener.checkIdentifier("_ok98-.87.-.8...88-asdAD",
284 YangModelValidationListener.checkIdentifier("AA.bcd", null);
285 YangModelValidationListener.checkIdentifier("a", null);
290 YangModelValidationListener.checkIdentifier("9aa", null);
291 } catch (YangValidationException e) {
295 YangModelValidationListener.checkIdentifier("-", null);
296 } catch (YangValidationException e) {
300 YangModelValidationListener.checkIdentifier(".", null);
301 } catch (YangValidationException e) {
305 assertThat(thrown, is(3));
308 static void mockName(ParseTree mockedRev, String name) {
309 StringContext nameCtx = mock(StringContext.class);
310 ParseTree internalName = mock(ParseTree.class);
311 doReturn(name).when(internalName).getText();
312 doReturn(internalName).when(nameCtx).getChild(0);
313 doReturn(nameCtx).when(mockedRev).getChild(0);