2a5460252c90a71946af4da8bb2750707aa19d6f
[netconf.git] / plugins / netconf-client-mdsal / src / test / java / org / opendaylight / netconf / client / mdsal / impl / NetconfSalKeystoreRpcsTest.java
1 /*
2  * Copyright (c) 2018 ZTE Corporation. 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 package org.opendaylight.netconf.client.mdsal.impl;
9
10 import static org.mockito.ArgumentMatchers.any;
11 import static org.mockito.Mockito.doNothing;
12 import static org.mockito.Mockito.doReturn;
13 import static org.mockito.Mockito.times;
14 import static org.mockito.Mockito.verify;
15 import static org.opendaylight.mdsal.common.api.CommitInfo.emptyFluentFuture;
16
17 import java.util.ArrayList;
18 import java.util.HashMap;
19 import java.util.List;
20 import java.util.Map;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.mockito.Mock;
25 import org.mockito.junit.MockitoJUnitRunner;
26 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
27 import org.opendaylight.mdsal.binding.api.DataBroker;
28 import org.opendaylight.mdsal.binding.api.RpcProviderService;
29 import org.opendaylight.mdsal.binding.api.WriteTransaction;
30 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
31 import org.opendaylight.netconf.api.xml.XmlUtil;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddPrivateKey;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddPrivateKeyInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddPrivateKeyInputBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddTrustedCertificate;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddTrustedCertificateInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddTrustedCertificateInputBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017._private.keys.PrivateKey;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017._private.keys.PrivateKeyBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017._private.keys.PrivateKeyKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.trusted.certificates.TrustedCertificate;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.trusted.certificates.TrustedCertificateBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.trusted.certificates.TrustedCertificateKey;
44 import org.opendaylight.yangtools.concepts.ObjectRegistration;
45 import org.opendaylight.yangtools.yang.binding.DataObject;
46 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
47 import org.w3c.dom.Document;
48 import org.w3c.dom.Element;
49 import org.w3c.dom.Node;
50 import org.w3c.dom.NodeList;
51
52 @RunWith(MockitoJUnitRunner.StrictStubs.class)
53 public class NetconfSalKeystoreRpcsTest {
54     private static final String XML_ELEMENT_PRIVATE_KEY = "private-key";
55     private static final String XML_ELEMENT_NAME = "name";
56     private static final String XML_ELEMENT_DATA = "data";
57     private static final String XML_ELEMENT_CERT_CHAIN = "certificate-chain";
58     private static final String XML_ELEMENT_TRUSTED_CERT = "trusted-certificate";
59     private static final String XML_ELEMENT_CERT = "certificate";
60
61     @Mock
62     private WriteTransaction writeTx;
63     @Mock
64     private DataBroker dataBroker;
65     @Mock
66     private AAAEncryptionService encryptionService;
67     @Mock
68     private RpcProviderService rpcProvider;
69     @Mock
70     private ObjectRegistration<?> rpcReg;
71
72     @Before
73     public void setUp() {
74         doReturn(writeTx).when(dataBroker).newWriteOnlyTransaction();
75         doNothing().when(writeTx)
76             .merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(DataObject.class));
77         doReturn(rpcReg).when(rpcProvider).registerRpcImplementations(any());
78         doNothing().when(rpcReg).close();
79     }
80
81     @Test
82     public void testAddPrivateKey() throws Exception {
83         doReturn(emptyFluentFuture()).when(writeTx).commit();
84         try (var keystoreService = new NetconfSalKeystoreRpcs(dataBroker, encryptionService, rpcProvider)) {
85             final AddPrivateKeyInput input = getPrivateKeyInput();
86             keystoreService.getRpcClassToInstanceMap().getInstance(AddPrivateKey.class).invoke(input).get();
87
88             verify(writeTx, times(input.nonnullPrivateKey().size()))
89                 .merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(DataObject.class));
90         }
91     }
92
93     @Test
94     public void testAddTrustedCertificate() throws Exception {
95         doReturn(emptyFluentFuture()).when(writeTx).commit();
96         try (var keystoreService = new NetconfSalKeystoreRpcs(dataBroker, encryptionService, rpcProvider)) {
97             final var input = getTrustedCertificateInput();
98             keystoreService.getRpcClassToInstanceMap().getInstance(AddTrustedCertificate.class).invoke(input).get();
99
100             verify(writeTx, times(input.nonnullTrustedCertificate().size()))
101                 .merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(DataObject.class));
102         }
103     }
104
105     private AddPrivateKeyInput getPrivateKeyInput() throws Exception {
106         final Map<PrivateKeyKey, PrivateKey> privateKeys = new HashMap<>();
107         final Document document = readKeystoreXML();
108         final NodeList nodeList = document.getElementsByTagName(XML_ELEMENT_PRIVATE_KEY);
109         for (int i = 0; i < nodeList.getLength(); i++) {
110             final Node node = nodeList.item(i);
111             if (node.getNodeType() != Node.ELEMENT_NODE) {
112                 continue;
113             }
114             final Element element = (Element)node;
115             final String keyName = element.getElementsByTagName(XML_ELEMENT_NAME).item(0).getTextContent();
116             final String keyData = element.getElementsByTagName(XML_ELEMENT_DATA).item(0).getTextContent();
117             final NodeList certNodes = element.getElementsByTagName(XML_ELEMENT_CERT_CHAIN);
118             final List<String> certChain = new ArrayList<>();
119             for (int j = 0; j < certNodes.getLength(); j++) {
120                 final Node certNode = certNodes.item(j);
121                 if (certNode.getNodeType() != Node.ELEMENT_NODE) {
122                     continue;
123                 }
124                 certChain.add(certNode.getTextContent());
125             }
126
127             final PrivateKeyKey key = new PrivateKeyKey(keyName);
128             privateKeys.put(key, new PrivateKeyBuilder()
129                 .withKey(key)
130                 .setData(keyData)
131                 .setCertificateChain(certChain)
132                 .build());
133         }
134
135         return new AddPrivateKeyInputBuilder().setPrivateKey(privateKeys).build();
136     }
137
138     private AddTrustedCertificateInput getTrustedCertificateInput() throws Exception {
139         final Map<TrustedCertificateKey, TrustedCertificate> trustedCertificates = new HashMap<>();
140         final Document document = readKeystoreXML();
141         final NodeList nodeList = document.getElementsByTagName(XML_ELEMENT_TRUSTED_CERT);
142         for (int i = 0; i < nodeList.getLength(); i++) {
143             final Node node = nodeList.item(i);
144             if (node.getNodeType() != Node.ELEMENT_NODE) {
145                 continue;
146             }
147             final Element element = (Element)node;
148             final String certName = element.getElementsByTagName(XML_ELEMENT_NAME).item(0).getTextContent();
149             final String certData = element.getElementsByTagName(XML_ELEMENT_CERT).item(0).getTextContent();
150
151             final TrustedCertificateKey key = new TrustedCertificateKey(certName);
152             trustedCertificates.put(key, new TrustedCertificateBuilder()
153                 .withKey(key)
154                 .setName(certName)
155                 .setCertificate(certData)
156                 .build());
157         }
158
159         return new AddTrustedCertificateInputBuilder().setTrustedCertificate(trustedCertificates).build();
160     }
161
162     private Document readKeystoreXML() throws Exception {
163         return XmlUtil.readXmlToDocument(getClass().getResourceAsStream("/netconf-keystore.xml"));
164     }
165 }