Add blueprint wiring for mdsal-netconf-yang-library
[netconf.git] / netconf / mdsal-netconf-yang-library / src / test / java / org / opendaylight / netconf / mdsal / yang / library / SchemaServiceToMdsalWriterTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.netconf.mdsal.yang.library;
10
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Matchers.eq;
13 import static org.mockito.Mockito.doNothing;
14 import static org.mockito.Mockito.verify;
15 import static org.mockito.Mockito.when;
16
17 import com.google.common.collect.Lists;
18 import com.google.common.util.concurrent.Futures;
19 import java.io.InputStream;
20 import java.util.List;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.mockito.Mock;
24 import org.mockito.MockitoAnnotations;
25 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
26 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
27 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
28 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
29 import org.opendaylight.controller.sal.core.api.model.SchemaService;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160409.ModulesState;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160409.ModulesStateBuilder;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160409.OptionalRevision;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160409.module.list.Module;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160409.module.list.ModuleBuilder;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160409.module.list.module.SubmodulesBuilder;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160409.module.list.module.submodules.Submodule;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160409.module.list.module.submodules.SubmoduleBuilder;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.YangIdentifier;
40 import org.opendaylight.yangtools.concepts.ListenerRegistration;
41 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
42 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
43 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
44 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
45 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
46 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
47 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
48
49 public class SchemaServiceToMdsalWriterTest {
50
51     private static final InstanceIdentifier<ModulesState> MODULES_STATE_INSTANCE_IDENTIFIER =
52             InstanceIdentifier.create(ModulesState.class);
53
54     @Mock
55     private SchemaService schemaService;
56     @Mock
57     private BindingAwareBroker.ProviderContext context;
58     @Mock
59     private DataBroker dataBroker;
60     @Mock
61     private WriteTransaction writeTransaction;
62
63     private SchemaServiceToMdsalWriter schemaServiceToMdsalWriter;
64
65     @Before
66     public void setUp() {
67         MockitoAnnotations.initMocks(this);
68
69         when(context.getSALService(DataBroker.class)).thenReturn(dataBroker);
70         when(dataBroker.newWriteOnlyTransaction()).thenReturn(writeTransaction);
71         doNothing().when(writeTransaction).put(eq(LogicalDatastoreType.OPERATIONAL), any(), any());
72         when(writeTransaction.submit()).thenReturn(Futures.immediateCheckedFuture(null));
73         when(schemaService.registerSchemaContextListener(any())).thenReturn(new ListenerRegistration<SchemaContextListener>() {
74             @Override
75             public void close() {
76
77             }
78
79             @Override
80             public SchemaContextListener getInstance() {
81                 return null;
82             }
83         });
84         schemaServiceToMdsalWriter = new SchemaServiceToMdsalWriter(schemaService, dataBroker);
85     }
86
87     @Test
88     public void testOnGlobalContextUpdated() {
89         schemaServiceToMdsalWriter.start();
90
91         schemaServiceToMdsalWriter.onGlobalContextUpdated(getSchema());
92         verify(writeTransaction).put(eq(LogicalDatastoreType.OPERATIONAL), eq(MODULES_STATE_INSTANCE_IDENTIFIER), eq(createTestModuleState()));
93     }
94
95     private SchemaContext getSchema() {
96         final List<InputStream> modelsToParse = Lists.newArrayList(
97                 SchemaServiceToMdsalWriterTest.class.getResourceAsStream("/test-module.yang"),
98                 SchemaServiceToMdsalWriterTest.class.getResourceAsStream("/test-submodule.yang")
99         );
100         return parseYangStreams(modelsToParse);
101     }
102
103     private SchemaContext parseYangStreams(final List<InputStream> streams) {
104         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
105                 .newBuild();
106         final SchemaContext schemaContext;
107         try {
108             schemaContext = reactor.buildEffective(streams);
109         } catch (ReactorException e) {
110             throw new RuntimeException("Unable to build schema context from " + streams, e);
111         }
112         return schemaContext;
113     }
114
115     private ModulesState createTestModuleState() {
116         Submodule sub = new SubmoduleBuilder().setName(new YangIdentifier("test-submodule"))
117                 .setRevision(new OptionalRevision("1970-01-01"))
118                 .build();
119
120         Module module = new ModuleBuilder().setName(new YangIdentifier("test-module"))
121                 .setNamespace(new Uri("test:namespace"))
122                 .setRevision(new OptionalRevision("2013-07-22"))
123                 .setSubmodules(new SubmodulesBuilder().setSubmodule(Lists.newArrayList(sub)).build())
124                 .setConformanceType(Module.ConformanceType.Implement)
125                 .build();
126         return  new ModulesStateBuilder().setModuleSetId("0")
127                 .setModule(Lists.newArrayList(module)).build();
128     }
129 }