Initial code drop of yang model driven configuration system
[controller.git] / opendaylight / config / yang-jmx-generator / src / test / java / org / opendaylight / controller / config / yangjmxgenerator / ModuleMXBeanEntryNameConflictTest.java
diff --git a/opendaylight/config/yang-jmx-generator/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/ModuleMXBeanEntryNameConflictTest.java b/opendaylight/config/yang-jmx-generator/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/ModuleMXBeanEntryNameConflictTest.java
new file mode 100644 (file)
index 0000000..deef08a
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.config.yangjmxgenerator;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Test;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.NameConflictException;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.YangModelSearchUtils;
+import org.opendaylight.yangtools.sal.binding.yang.types.TypeProviderImpl;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Preconditions;
+
+public class ModuleMXBeanEntryNameConflictTest extends AbstractYangTest {
+
+    private static final Logger logger = LoggerFactory
+            .getLogger(ModuleMXBeanEntryNameConflictTest.class);
+
+    public static final String PACKAGE_NAME = "pack2";
+    Map<File, String> testedFilesToYangModules = new HashMap<>();
+    Map<String, String> testedYangModulesToExpectedConflictingName = new HashMap<>();
+
+    @Test
+    public void testNameConflicts() throws Exception {
+        prepareSamples();
+        prepareExceptionAssertions();
+
+        for (Map.Entry<File, String> currentTestEntry : testedFilesToYangModules
+                .entrySet()) {
+            final String moduleName = currentTestEntry.getValue();
+            final File yangFile = currentTestEntry.getKey();
+            Module testedModule = loadYangs(yangFile, moduleName);
+
+            try {
+                logger.debug("Testing {}", yangFile);
+                ModuleMXBeanEntry.create(testedModule,
+                        new HashMap<QName, ServiceInterfaceEntry>(), context,
+                        new TypeProviderWrapper(new TypeProviderImpl(context)),
+                        PACKAGE_NAME);
+                fail(yangFile.toString()
+                        + " did not cause a name conflict and should");
+            } catch (NameConflictException e) {
+                assertEquals(
+                        testedYangModulesToExpectedConflictingName
+                                .get(moduleName),
+                        e.getConflictingName());
+            }
+        }
+    }
+
+    private void prepareSamples() {
+        File first = new File(getClass().getResource(
+                "/duplicates/config-test-duplicate-attribute-in-list.yang")
+                .getFile());
+        File dir = first.getParentFile();
+
+        for (File testYang : dir.listFiles()) {
+            String moduleName = getYangModuleName(testYang.getName());
+            testedFilesToYangModules.put(testYang, moduleName);
+        }
+    }
+
+    private void prepareExceptionAssertions() {
+        testedYangModulesToExpectedConflictingName.put(
+                "config-test-duplicate-attribute", "DtoA");
+        testedYangModulesToExpectedConflictingName.put(
+                "config-test-duplicate-attribute-in-list", "DtoA");
+        testedYangModulesToExpectedConflictingName.put(
+                "config-test-duplicate-attribute-runtime-bean", "DtoA");
+        testedYangModulesToExpectedConflictingName.put(
+                "config-test-generated-attributes-name-conflict", "StateB");
+        testedYangModulesToExpectedConflictingName.put(
+                "config-test-runtime-bean-list-name-conflict",
+                "StateARuntimeMXBean");
+        testedYangModulesToExpectedConflictingName.put(
+                "config-test-runtime-bean-list-name-conflict2",
+                "StateARuntimeMXBean");
+        testedYangModulesToExpectedConflictingName
+                .put("config-test-runtime-bean-name-conflict", "StateARuntimeMXBean");
+        testedYangModulesToExpectedConflictingName.put(
+                "config-test-runtime-bean-name-conflict2",
+                "StateARuntimeMXBean");
+    }
+
+    private String getYangModuleName(String name) {
+        int startIndex = 0;
+        int endIndex = name.indexOf(".yang");
+        return name.substring(startIndex, endIndex);
+    }
+
+    private Module loadYangs(File testedModule, String moduleName)
+            throws Exception {
+        List<InputStream> yangISs = new ArrayList<>();
+        yangISs.addAll(getStreams("/ietf-inet-types.yang"));
+
+        yangISs.add(new FileInputStream(testedModule));
+
+        yangISs.addAll(getConfigApiYangInputStreams());
+
+        YangParserImpl parser = new YangParserImpl();
+        Set<Module> modulesToBuild = parser.parseYangModelsFromStreams(yangISs);
+        // close ISs
+        for (InputStream is : yangISs) {
+            is.close();
+        }
+        context = parser.resolveSchemaContext(modulesToBuild);
+        namesToModules = YangModelSearchUtils.mapModulesByNames(context
+                .getModules());
+        configModule = namesToModules.get(ConfigConstants.CONFIG_MODULE);
+        final Module module = namesToModules.get(moduleName);
+        Preconditions.checkNotNull(module, "Cannot get module %s from %s",
+                moduleName, namesToModules.keySet());
+        return module;
+    }
+
+}