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();
44 com.google.common.io.Files.write("", file, Charsets.UTF_8);
49 public void testNewFile() throws Exception {
50 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
51 PropertiesProviderTest pp = new PropertiesProviderTest();
52 pp.addProperty("fileStorage",NON_EXISTENT_DIRECTORY+NON_EXISTENT_FILE);
53 pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
54 storage.instantiate(pp);
56 final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
58 public String getConfigSnapshot() {
59 return createConfig();
63 public SortedSet<String> getCapabilities() {
67 storage.persistConfig(holder);
69 storage.persistConfig(holder);
71 assertEquals(storage.toString().replace("\\","/"),"XmlFileStorageAdapter [storage="+NON_EXISTENT_DIRECTORY+NON_EXISTENT_FILE+"]");
72 delete(new File(NON_EXISTENT_DIRECTORY));
75 public void testFileAdapter() throws Exception {
76 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
77 PropertiesProviderTest pp = new PropertiesProviderTest();
78 pp.addProperty("fileStorage",file.getPath());
79 pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
80 storage.instantiate(pp);
82 final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
84 public String getConfigSnapshot() {
85 return createConfig();
89 public SortedSet<String> getCapabilities() {
93 storage.persistConfig(holder);
95 storage.persistConfig(holder);
97 assertEquals(27, com.google.common.io.Files.readLines(file, Charsets.UTF_8).size());
98 List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
99 assertEquals(1, lastConf.size());
100 ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
101 assertXMLEqual("<config>2</config>", configSnapshotHolder.getConfigSnapshot());
102 assertEquals(createCaps(), configSnapshotHolder.getCapabilities());
104 storage = new XmlFileStorageAdapter();
105 storage.setFileStorage(file);
106 storage.setNumberOfBackups(Integer.MAX_VALUE);
108 List<ConfigSnapshotHolder> last = storage.loadLastConfigs();
109 assertEquals(createCaps(), last.get(0).getCapabilities());
112 private SortedSet<String> createCaps() {
113 SortedSet<String> caps = new TreeSet<>();
115 caps.add("cap1" + i);
116 caps.add("cap2" + i);
117 caps.add("urn:opendaylight:params:xml:ns:yang:controller:netty?module=netty&revision=2013-11-19" + i);
118 caps.add("capaaaa as dasfasdf s2" + i);
123 public void testFileAdapterOneBackup() throws Exception {
124 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
126 PropertiesProviderTest pp = new PropertiesProviderTest();
127 pp.addProperty("fileStorage",file.getPath());
128 pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
129 storage.instantiate(pp);
131 final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
133 public String getConfigSnapshot() {
134 return createConfig();
138 public SortedSet<String> getCapabilities() {
142 storage.persistConfig(holder);
144 storage.persistConfig(holder);
146 assertEquals(27, com.google.common.io.Files.readLines(file, Charsets.UTF_8).size());
148 List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
149 assertEquals(1, lastConf.size());
150 ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
151 assertXMLEqual("<config>2</config>", configSnapshotHolder.getConfigSnapshot());
155 public void testFileAdapterOnlyTwoBackups() throws Exception {
156 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
157 storage.setFileStorage(file);
158 storage.setNumberOfBackups(2);
159 final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
161 public String getConfigSnapshot() {
162 return createConfig();
166 public SortedSet<String> getCapabilities() {
170 storage.persistConfig(holder);
172 storage.persistConfig(holder);
173 storage.persistConfig(holder);
175 List<String> readLines = com.google.common.io.Files.readLines(file, Charsets.UTF_8);
176 assertEquals(27, readLines.size());
178 List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
179 assertEquals(1, lastConf.size());
180 ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
181 assertXMLEqual("<config>3</config>", configSnapshotHolder.getConfigSnapshot());
182 assertFalse(readLines.contains(holder.getConfigSnapshot()));
186 public void testNoLastConfig() throws Exception {
187 File file = Files.createTempFile("testFilePersist", ".txt").toFile();
188 if (!file.exists()) {
191 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
192 storage.setFileStorage(file);
194 List<ConfigSnapshotHolder> elementOptional = storage.loadLastConfigs();
195 assertThat(elementOptional.size(), is(0));
198 @Test(expected = NullPointerException.class)
199 public void testNoProperties() throws Exception {
200 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
201 storage.loadLastConfigs();
204 @Test(expected = NullPointerException.class)
205 public void testNoProperties2() throws Exception {
206 XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
207 storage.persistConfig(new ConfigSnapshotHolder() {
209 public String getConfigSnapshot() {
210 return Mockito.mock(String.class);
214 public SortedSet<String> getCapabilities() {
215 return new TreeSet<>();
220 static String createConfig() {
221 return "<config>" + i++ + "</config>";
224 private void delete(final File f) throws IOException {
225 if (f.isDirectory()) {
226 for (File c : f.listFiles()) {
231 throw new FileNotFoundException("Failed to delete file: " + f);