Merge "fix failure during connecting device when channelActive happens later than...
[netconf.git] / netconf / sal-netconf-connector / src / test / java / org / opendaylight / netconf / sal / connect / netconf / util / NetconfSalKeystoreServiceTest.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.sal.connect.netconf.util;
9
10 import static org.mockito.Matchers.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
16 import com.google.common.util.concurrent.Futures;
17 import java.util.ArrayList;
18 import java.util.List;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.mockito.Mock;
22 import org.mockito.MockitoAnnotations;
23 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
24 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
25 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
26 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
27 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
28 import org.opendaylight.netconf.api.xml.XmlUtil;
29 import org.opendaylight.netconf.sal.connect.util.NetconfSalKeystoreService;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddPrivateKeyInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddPrivateKeyInputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddTrustedCertificateInput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.AddTrustedCertificateInputBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017._private.keys.PrivateKey;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017._private.keys.PrivateKeyBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017._private.keys.PrivateKeyKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.trusted.certificates.TrustedCertificate;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.trusted.certificates.TrustedCertificateBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.trusted.certificates.TrustedCertificateKey;
40 import org.opendaylight.yangtools.yang.binding.DataObject;
41 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
42 import org.w3c.dom.Document;
43 import org.w3c.dom.Element;
44 import org.w3c.dom.Node;
45 import org.w3c.dom.NodeList;
46
47 public class NetconfSalKeystoreServiceTest {
48     private static final String XML_ELEMENT_PRIVATE_KEY = "private-key";
49     private static final String XML_ELEMENT_NAME = "name";
50     private static final String XML_ELEMENT_DATA = "data";
51     private static final String XML_ELEMENT_CERT_CHAIN = "certificate-chain";
52     private static final String XML_ELEMENT_TRUSTED_CERT = "trusted-certificate";
53     private static final String XML_ELEMENT_CERT = "certificate";
54
55     @Mock
56     private WriteTransaction writeTx;
57     @Mock
58     private DataBroker dataBroker;
59     @Mock
60     private AAAEncryptionService encryptionService;
61
62     @Before
63     public void setUp() {
64         MockitoAnnotations.initMocks(this);
65         doReturn(writeTx).when(dataBroker).newWriteOnlyTransaction();
66         doNothing().when(writeTx)
67             .merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(DataObject.class));
68     }
69
70     @Test
71     public void testAddPrivateKey() throws Exception {
72         doReturn(Futures.<Void, TransactionCommitFailedException>immediateCheckedFuture(null)).when(writeTx).submit();
73         NetconfSalKeystoreService keystoreService = new NetconfSalKeystoreService(dataBroker, encryptionService);
74
75         final AddPrivateKeyInput input = getPrivateKeyInput();
76         keystoreService.addPrivateKey(input);
77
78         verify(writeTx, times(input.getPrivateKey().size() + 1))
79             .merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(DataObject.class));
80     }
81
82     @Test
83     public void testAddTrustedCertificate() throws Exception {
84         doReturn(Futures.<Void, TransactionCommitFailedException>immediateCheckedFuture(null)).when(writeTx).submit();
85         NetconfSalKeystoreService keystoreService = new NetconfSalKeystoreService(dataBroker, encryptionService);
86
87         final AddTrustedCertificateInput input = getTrustedCertificateInput();
88         keystoreService.addTrustedCertificate(input);
89
90         verify(writeTx, times(input.getTrustedCertificate().size() + 1))
91             .merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(DataObject.class));
92     }
93
94     private AddPrivateKeyInput getPrivateKeyInput() throws Exception {
95         final List<PrivateKey> privateKeys = new ArrayList<>();
96         final Document document = readKeystoreXML();
97         final NodeList nodeList = document.getElementsByTagName(XML_ELEMENT_PRIVATE_KEY);
98         for (int i = 0; i < nodeList.getLength(); i++) {
99             final Node node = nodeList.item(i);
100             if (node.getNodeType() != Node.ELEMENT_NODE) {
101                 continue;
102             }
103             final Element element = (Element)node;
104             final String keyName = element.getElementsByTagName(XML_ELEMENT_NAME).item(0).getTextContent();
105             final String keyData = element.getElementsByTagName(XML_ELEMENT_DATA).item(0).getTextContent();
106             final NodeList certNodes = element.getElementsByTagName(XML_ELEMENT_CERT_CHAIN);
107             final List<String> certChain = new ArrayList<>();
108             for (int j = 0; j < certNodes.getLength(); j++) {
109                 final Node certNode = certNodes.item(j);
110                 if (certNode.getNodeType() != Node.ELEMENT_NODE) {
111                     continue;
112                 }
113                 certChain.add(certNode.getTextContent());
114             }
115
116             final PrivateKey privateKey = new PrivateKeyBuilder()
117                     .setKey(new PrivateKeyKey(keyName))
118                     .setName(keyName)
119                     .setData(keyData)
120                     .setCertificateChain(certChain)
121                     .build();
122             privateKeys.add(privateKey);
123         }
124
125         return new AddPrivateKeyInputBuilder().setPrivateKey(privateKeys).build();
126     }
127
128     private AddTrustedCertificateInput getTrustedCertificateInput() throws Exception {
129         final List<TrustedCertificate> trustedCertificates = new ArrayList<>();
130         final Document document = readKeystoreXML();
131         final NodeList nodeList = document.getElementsByTagName(XML_ELEMENT_TRUSTED_CERT);
132         for (int i = 0; i < nodeList.getLength(); i++) {
133             final Node node = nodeList.item(i);
134             if (node.getNodeType() != Node.ELEMENT_NODE) {
135                 continue;
136             }
137             final Element element = (Element)node;
138             final String certName = element.getElementsByTagName(XML_ELEMENT_NAME).item(0).getTextContent();
139             final String certData = element.getElementsByTagName(XML_ELEMENT_CERT).item(0).getTextContent();
140
141             final TrustedCertificate certificate = new TrustedCertificateBuilder()
142                     .setKey(new TrustedCertificateKey(certName))
143                     .setName(certName)
144                     .setCertificate(certData)
145                     .build();
146             trustedCertificates.add(certificate);
147         }
148
149         return new AddTrustedCertificateInputBuilder().setTrustedCertificate(trustedCertificates).build();
150     }
151
152     private Document readKeystoreXML() throws Exception {
153         return XmlUtil.readXmlToDocument(getClass().getResourceAsStream("/netconf-keystore.xml"));
154     }
155 }