Merge "Bug 2267: Reuse leaf and leaf set entry builders in NormalizedNodeInputStreamR...
[controller.git] / opendaylight / config / config-persister-file-xml-adapter / src / test / java / org / opendaylight / controller / config / persist / storage / file / xml / FileStorageAdapterTest.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. 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
9 package org.opendaylight.controller.config.persist.storage.file.xml;
10
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;
16
17 import com.google.common.base.Charsets;
18 import java.io.File;
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;
30
31 public class FileStorageAdapterTest {
32
33     private static int i;
34     private File file;
35     private static final String NON_EXISTENT_DIRECTORY = "./nonExistentDir/";
36     private static final String NON_EXISTENT_FILE = "nonExistent.txt";
37
38     @Before
39     public void setUp() throws Exception {
40         file = Files.createTempFile("testFilePersist", ".txt").toFile();
41         if (!file.exists()) {
42             return;
43         }
44         com.google.common.io.Files.write("", file, Charsets.UTF_8);
45         i = 1;
46     }
47
48     @Test
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);
55
56         final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
57             @Override
58             public String getConfigSnapshot() {
59                 return createConfig();
60             }
61
62             @Override
63             public SortedSet<String> getCapabilities() {
64                 return createCaps();
65             }
66         };
67         storage.persistConfig(holder);
68
69         storage.persistConfig(holder);
70
71         assertEquals(storage.toString().replace("\\","/"),"XmlFileStorageAdapter [storage="+NON_EXISTENT_DIRECTORY+NON_EXISTENT_FILE+"]");
72         delete(new File(NON_EXISTENT_DIRECTORY));
73     }
74     @Test
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);
81
82         final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
83             @Override
84             public String getConfigSnapshot() {
85                 return createConfig();
86             }
87
88             @Override
89             public SortedSet<String> getCapabilities() {
90                 return createCaps();
91             }
92         };
93         storage.persistConfig(holder);
94
95         storage.persistConfig(holder);
96
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());
103
104         storage = new XmlFileStorageAdapter();
105         storage.setFileStorage(file);
106         storage.setNumberOfBackups(Integer.MAX_VALUE);
107
108         List<ConfigSnapshotHolder> last = storage.loadLastConfigs();
109         assertEquals(createCaps(), last.get(0).getCapabilities());
110     }
111
112     private SortedSet<String> createCaps() {
113         SortedSet<String> caps = new TreeSet<>();
114
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);
119         return caps;
120     }
121
122     @Test
123     public void testFileAdapterOneBackup() throws Exception {
124         XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
125
126         PropertiesProviderTest pp = new PropertiesProviderTest();
127         pp.addProperty("fileStorage",file.getPath());
128         pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
129         storage.instantiate(pp);
130
131         final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
132             @Override
133             public String getConfigSnapshot() {
134                 return createConfig();
135             }
136
137             @Override
138             public SortedSet<String> getCapabilities() {
139                 return createCaps();
140             }
141         };
142         storage.persistConfig(holder);
143
144         storage.persistConfig(holder);
145
146         assertEquals(27, com.google.common.io.Files.readLines(file, Charsets.UTF_8).size());
147
148         List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
149         assertEquals(1, lastConf.size());
150         ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
151         assertXMLEqual("<config>2</config>", configSnapshotHolder.getConfigSnapshot());
152     }
153
154     @Test
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() {
160             @Override
161             public String getConfigSnapshot() {
162                 return createConfig();
163             }
164
165             @Override
166             public SortedSet<String> getCapabilities() {
167                 return createCaps();
168             }
169         };
170         storage.persistConfig(holder);
171
172         storage.persistConfig(holder);
173         storage.persistConfig(holder);
174
175         List<String> readLines = com.google.common.io.Files.readLines(file, Charsets.UTF_8);
176         assertEquals(27, readLines.size());
177
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()));
183     }
184
185     @Test
186     public void testNoLastConfig() throws Exception {
187         File file = Files.createTempFile("testFilePersist", ".txt").toFile();
188         if (!file.exists()) {
189             return;
190         }
191         XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
192         storage.setFileStorage(file);
193
194         List<ConfigSnapshotHolder> elementOptional = storage.loadLastConfigs();
195         assertThat(elementOptional.size(), is(0));
196     }
197
198     @Test(expected = NullPointerException.class)
199     public void testNoProperties() throws Exception {
200         XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
201         storage.loadLastConfigs();
202     }
203
204     @Test(expected = NullPointerException.class)
205     public void testNoProperties2() throws Exception {
206         XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
207         storage.persistConfig(new ConfigSnapshotHolder() {
208             @Override
209             public String getConfigSnapshot() {
210                 return Mockito.mock(String.class);
211             }
212
213             @Override
214             public SortedSet<String> getCapabilities() {
215                 return new TreeSet<>();
216             }
217         } );
218     }
219
220     static String createConfig() {
221         return "<config>" + i++ + "</config>";
222     }
223
224     private void delete(final File f) throws IOException {
225         if (f.isDirectory()) {
226             for (File c : f.listFiles()) {
227                 delete(c);
228             }
229         }
230         if (!f.delete()) {
231             throw new FileNotFoundException("Failed to delete file: " + f);
232         }
233     }
234 }