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 junit.framework.Assert.assertTrue;
12 import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
13 import static org.hamcrest.CoreMatchers.is;
14 import static org.junit.Assert.assertEquals;
15 import static org.junit.Assert.assertFalse;
16 import static org.junit.Assert.assertThat;
17 import static org.mockito.Mockito.doReturn;
18 import static org.mockito.Mockito.mock;
20 import com.google.common.base.Charsets;
21 import com.google.common.collect.Sets;
23 import java.io.FileNotFoundException;
24 import java.io.IOException;
25 import java.nio.file.Files;
26 import java.util.List;
27 import java.util.SortedSet;
28 import java.util.TreeSet;
29 import org.junit.After;
30 import org.junit.Before;
31 import org.junit.Test;
32 import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
33 import org.opendaylight.controller.config.persist.test.PropertiesProviderTest;
35 public class FileStorageAdapterTest {
39 private static final String NON_EXISTENT_DIRECTORY = "./nonExistentDir/";
40 private static final String NON_EXISTENT_FILE = "nonExistent.txt";
41 private XmlFileStorageAdapter storage;
44 public void setUp() throws Exception {
45 file = Files.createTempFile("testFilePersist", ".txt").toFile();
50 com.google.common.io.Files.write("", file, Charsets.UTF_8);
52 storage = new XmlFileStorageAdapter();
56 public void tearDown() throws Exception {
61 public void testNewFile() throws Exception {
62 PropertiesProviderTest pp = new PropertiesProviderTest();
63 pp.addProperty("fileStorage",NON_EXISTENT_DIRECTORY+NON_EXISTENT_FILE);
64 pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
65 storage.instantiate(pp);
67 final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
69 public String getConfigSnapshot() {
70 return createConfig();
74 public SortedSet<String> getCapabilities() {
78 storage.persistConfig(holder);
80 storage.persistConfig(holder);
82 assertEquals(storage.toString().replace("\\","/"),"XmlFileStorageAdapter [storage="+NON_EXISTENT_DIRECTORY+NON_EXISTENT_FILE+"]");
83 delete(new File(NON_EXISTENT_DIRECTORY));
87 public void testFileAdapter() throws Exception {
88 PropertiesProviderTest pp = new PropertiesProviderTest();
89 pp.addProperty("fileStorage",file.getPath());
90 pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
91 storage.instantiate(pp);
93 final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
95 public String getConfigSnapshot() {
96 return createConfig();
100 public SortedSet<String> getCapabilities() {
104 storage.persistConfig(holder);
106 storage.persistConfig(holder);
108 assertEquals(29, com.google.common.io.Files.readLines(file, Charsets.UTF_8).size());
109 List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
110 assertEquals(1, lastConf.size());
111 ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
112 assertXMLEqual("<config>2</config>", configSnapshotHolder.getConfigSnapshot());
113 assertEquals(createCaps(), configSnapshotHolder.getCapabilities());
115 storage = new XmlFileStorageAdapter();
116 storage.setFileStorage(file);
117 storage.setNumberOfBackups(Integer.MAX_VALUE);
119 List<ConfigSnapshotHolder> last = storage.loadLastConfigs();
120 assertEquals(createCaps(), last.get(0).getCapabilities());
123 private SortedSet<String> createCaps() {
124 SortedSet<String> caps = new TreeSet<>();
126 caps.add("cap1" + i);
127 caps.add("cap2" + i);
128 caps.add("urn:opendaylight:params:xml:ns:yang:controller:netty?module=netty&revision=2013-11-19" + i);
129 caps.add("capaaaa as dasfasdf s2" + i);
134 public void testFileAdapterOneBackup() throws Exception {
135 PropertiesProviderTest pp = new PropertiesProviderTest();
136 pp.addProperty("fileStorage",file.getPath());
137 pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
138 storage.instantiate(pp);
140 final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
142 public String getConfigSnapshot() {
143 return createConfig();
147 public SortedSet<String> getCapabilities() {
151 storage.persistConfig(holder);
153 storage.persistConfig(holder);
155 assertEquals(29, com.google.common.io.Files.readLines(file, Charsets.UTF_8).size());
157 List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
158 assertEquals(1, lastConf.size());
159 ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
160 assertXMLEqual("<config>2</config>", configSnapshotHolder.getConfigSnapshot());
164 public void testWithFeatures() throws Exception {
165 PropertiesProviderTest pp = new PropertiesProviderTest();
166 pp.addProperty("fileStorage",file.getPath());
167 pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
168 storage.instantiate(pp);
170 final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
172 public String getConfigSnapshot() {
173 return createConfig();
177 public SortedSet<String> getCapabilities() {
181 final FeatureListProvider mock = mock(FeatureListProvider.class);
183 doReturn(Sets.newHashSet("f1-11", "f2-22")).when(mock).listFeatures();
184 storage.setFeaturesService(mock);
185 storage.persistConfig(holder);
187 assertEquals(20, com.google.common.io.Files.readLines(file, Charsets.UTF_8).size());
189 List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
190 assertEquals(1, lastConf.size());
191 ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
192 assertXMLEqual("<config>1</config>", configSnapshotHolder.getConfigSnapshot());
193 assertEquals(Sets.newHashSet("f1-11", "f2-22"), storage.getPersistedFeatures());
197 public void testNoFeaturesStored() throws Exception {
198 PropertiesProviderTest pp = new PropertiesProviderTest();
199 pp.addProperty("fileStorage",file.getPath());
200 pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
201 storage.instantiate(pp);
203 com.google.common.io.Files.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
204 "<persisted-snapshots>\n" +
207 " <required-capabilities>\n" +
208 " <capability>cap12</capability>\n" +
209 " </required-capabilities>\n" +
210 " <configuration>\n" +
211 " <config>1</config>\n" +
212 " </configuration>\n" +
215 "</persisted-snapshots>", file, Charsets.UTF_8);
217 List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
218 assertEquals(1, lastConf.size());
219 ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
220 assertXMLEqual("<config>1</config>", configSnapshotHolder.getConfigSnapshot());
221 assertTrue(storage.getPersistedFeatures().isEmpty());
225 public void testFileAdapterOnlyTwoBackups() throws Exception {
226 storage.setFileStorage(file);
227 storage.setNumberOfBackups(2);
228 final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
230 public String getConfigSnapshot() {
231 return createConfig();
235 public SortedSet<String> getCapabilities() {
239 storage.persistConfig(holder);
241 storage.persistConfig(holder);
242 storage.persistConfig(holder);
244 List<String> readLines = com.google.common.io.Files.readLines(file, Charsets.UTF_8);
245 assertEquals(29, readLines.size());
247 List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
248 assertEquals(1, lastConf.size());
249 ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
250 assertXMLEqual("<config>3</config>", configSnapshotHolder.getConfigSnapshot());
251 assertFalse(readLines.contains(holder.getConfigSnapshot()));
252 assertTrue(storage.getPersistedFeatures().isEmpty());
256 public void testNoLastConfig() throws Exception {
257 File file = Files.createTempFile("testFilePersist", ".txt").toFile();
259 if (!file.exists()) {
262 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
263 storage.setFileStorage(file);
265 List<ConfigSnapshotHolder> elementOptional = storage.loadLastConfigs();
266 assertThat(elementOptional.size(), is(0));
269 @Test(expected = NullPointerException.class)
270 public void testNoProperties() throws Exception {
271 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
272 storage.loadLastConfigs();
275 @Test(expected = NullPointerException.class)
276 public void testNoProperties2() throws Exception {
277 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
278 storage.persistConfig(new ConfigSnapshotHolder() {
280 public String getConfigSnapshot() {
281 return mock(String.class);
285 public SortedSet<String> getCapabilities() {
286 return new TreeSet<>();
291 static String createConfig() {
292 return "<config>" + i++ + "</config>";
295 private void delete(final File f) throws IOException {
296 if (f.isDirectory()) {
297 for (File c : f.listFiles()) {
302 throw new FileNotFoundException("Failed to delete file: " + f);