2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.controller.config.persist.storage.file.xml;
11 import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
12 import static org.hamcrest.CoreMatchers.is;
13 import static org.junit.Assert.assertEquals;
14 import static org.junit.Assert.assertFalse;
15 import static org.junit.Assert.assertThat;
17 import com.google.common.base.Charsets;
19 import java.io.FileNotFoundException;
20 import java.io.IOException;
21 import java.nio.file.Files;
22 import java.util.List;
23 import java.util.SortedSet;
24 import java.util.TreeSet;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.mockito.Mockito;
28 import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
29 import org.opendaylight.controller.config.persist.test.PropertiesProviderTest;
31 public class FileStorageAdapterTest {
35 private static final String NON_EXISTENT_DIRECTORY = "./nonExistentDir/";
36 private static final String NON_EXISTENT_FILE = "nonExistent.txt";
39 public void setUp() throws Exception {
40 file = Files.createTempFile("testFilePersist", ".txt").toFile();
45 com.google.common.io.Files.write("", file, Charsets.UTF_8);
50 public void testNewFile() throws Exception {
51 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
52 PropertiesProviderTest pp = new PropertiesProviderTest();
53 pp.addProperty("fileStorage",NON_EXISTENT_DIRECTORY+NON_EXISTENT_FILE);
54 pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
55 storage.instantiate(pp);
57 final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
59 public String getConfigSnapshot() {
60 return createConfig();
64 public SortedSet<String> getCapabilities() {
68 storage.persistConfig(holder);
70 storage.persistConfig(holder);
72 assertEquals(storage.toString().replace("\\","/"),"XmlFileStorageAdapter [storage="+NON_EXISTENT_DIRECTORY+NON_EXISTENT_FILE+"]");
73 delete(new File(NON_EXISTENT_DIRECTORY));
76 public void testFileAdapter() throws Exception {
77 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
78 PropertiesProviderTest pp = new PropertiesProviderTest();
79 pp.addProperty("fileStorage",file.getPath());
80 pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
81 storage.instantiate(pp);
83 final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
85 public String getConfigSnapshot() {
86 return createConfig();
90 public SortedSet<String> getCapabilities() {
94 storage.persistConfig(holder);
96 storage.persistConfig(holder);
98 assertEquals(27, com.google.common.io.Files.readLines(file, Charsets.UTF_8).size());
99 List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
100 assertEquals(1, lastConf.size());
101 ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
102 assertXMLEqual("<config>2</config>", configSnapshotHolder.getConfigSnapshot());
103 assertEquals(createCaps(), configSnapshotHolder.getCapabilities());
105 storage = new XmlFileStorageAdapter();
106 storage.setFileStorage(file);
107 storage.setNumberOfBackups(Integer.MAX_VALUE);
109 List<ConfigSnapshotHolder> last = storage.loadLastConfigs();
110 assertEquals(createCaps(), last.get(0).getCapabilities());
113 private SortedSet<String> createCaps() {
114 SortedSet<String> caps = new TreeSet<>();
116 caps.add("cap1" + i);
117 caps.add("cap2" + i);
118 caps.add("urn:opendaylight:params:xml:ns:yang:controller:netty?module=netty&revision=2013-11-19" + i);
119 caps.add("capaaaa as dasfasdf s2" + i);
124 public void testFileAdapterOneBackup() throws Exception {
125 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
127 PropertiesProviderTest pp = new PropertiesProviderTest();
128 pp.addProperty("fileStorage",file.getPath());
129 pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
130 storage.instantiate(pp);
132 final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
134 public String getConfigSnapshot() {
135 return createConfig();
139 public SortedSet<String> getCapabilities() {
143 storage.persistConfig(holder);
145 storage.persistConfig(holder);
147 assertEquals(27, com.google.common.io.Files.readLines(file, Charsets.UTF_8).size());
149 List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
150 assertEquals(1, lastConf.size());
151 ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
152 assertXMLEqual("<config>2</config>", configSnapshotHolder.getConfigSnapshot());
156 public void testFileAdapterOnlyTwoBackups() throws Exception {
157 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
158 storage.setFileStorage(file);
159 storage.setNumberOfBackups(2);
160 final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
162 public String getConfigSnapshot() {
163 return createConfig();
167 public SortedSet<String> getCapabilities() {
171 storage.persistConfig(holder);
173 storage.persistConfig(holder);
174 storage.persistConfig(holder);
176 List<String> readLines = com.google.common.io.Files.readLines(file, Charsets.UTF_8);
177 assertEquals(27, readLines.size());
179 List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
180 assertEquals(1, lastConf.size());
181 ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
182 assertXMLEqual("<config>3</config>", configSnapshotHolder.getConfigSnapshot());
183 assertFalse(readLines.contains(holder.getConfigSnapshot()));
187 public void testNoLastConfig() throws Exception {
188 File file = Files.createTempFile("testFilePersist", ".txt").toFile();
190 if (!file.exists()) {
193 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
194 storage.setFileStorage(file);
196 List<ConfigSnapshotHolder> elementOptional = storage.loadLastConfigs();
197 assertThat(elementOptional.size(), is(0));
200 @Test(expected = NullPointerException.class)
201 public void testNoProperties() throws Exception {
202 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
203 storage.loadLastConfigs();
206 @Test(expected = NullPointerException.class)
207 public void testNoProperties2() throws Exception {
208 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
209 storage.persistConfig(new ConfigSnapshotHolder() {
211 public String getConfigSnapshot() {
212 return Mockito.mock(String.class);
216 public SortedSet<String> getCapabilities() {
217 return new TreeSet<>();
222 static String createConfig() {
223 return "<config>" + i++ + "</config>";
226 private void delete(final File f) throws IOException {
227 if (f.isDirectory()) {
228 for (File c : f.listFiles()) {
233 throw new FileNotFoundException("Failed to delete file: " + f);