Merge "Bug 2415: Fixed intermittent RpcRegistry unit test failures"
[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         file.deleteOnExit();
42         if (!file.exists()) {
43             return;
44         }
45         com.google.common.io.Files.write("", file, Charsets.UTF_8);
46         i = 1;
47     }
48
49     @Test
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);
56
57         final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
58             @Override
59             public String getConfigSnapshot() {
60                 return createConfig();
61             }
62
63             @Override
64             public SortedSet<String> getCapabilities() {
65                 return createCaps();
66             }
67         };
68         storage.persistConfig(holder);
69
70         storage.persistConfig(holder);
71
72         assertEquals(storage.toString().replace("\\","/"),"XmlFileStorageAdapter [storage="+NON_EXISTENT_DIRECTORY+NON_EXISTENT_FILE+"]");
73         delete(new File(NON_EXISTENT_DIRECTORY));
74     }
75     @Test
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);
82
83         final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
84             @Override
85             public String getConfigSnapshot() {
86                 return createConfig();
87             }
88
89             @Override
90             public SortedSet<String> getCapabilities() {
91                 return createCaps();
92             }
93         };
94         storage.persistConfig(holder);
95
96         storage.persistConfig(holder);
97
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());
104
105         storage = new XmlFileStorageAdapter();
106         storage.setFileStorage(file);
107         storage.setNumberOfBackups(Integer.MAX_VALUE);
108
109         List<ConfigSnapshotHolder> last = storage.loadLastConfigs();
110         assertEquals(createCaps(), last.get(0).getCapabilities());
111     }
112
113     private SortedSet<String> createCaps() {
114         SortedSet<String> caps = new TreeSet<>();
115
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);
120         return caps;
121     }
122
123     @Test
124     public void testFileAdapterOneBackup() throws Exception {
125         XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
126
127         PropertiesProviderTest pp = new PropertiesProviderTest();
128         pp.addProperty("fileStorage",file.getPath());
129         pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
130         storage.instantiate(pp);
131
132         final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
133             @Override
134             public String getConfigSnapshot() {
135                 return createConfig();
136             }
137
138             @Override
139             public SortedSet<String> getCapabilities() {
140                 return createCaps();
141             }
142         };
143         storage.persistConfig(holder);
144
145         storage.persistConfig(holder);
146
147         assertEquals(27, com.google.common.io.Files.readLines(file, Charsets.UTF_8).size());
148
149         List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
150         assertEquals(1, lastConf.size());
151         ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
152         assertXMLEqual("<config>2</config>", configSnapshotHolder.getConfigSnapshot());
153     }
154
155     @Test
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() {
161             @Override
162             public String getConfigSnapshot() {
163                 return createConfig();
164             }
165
166             @Override
167             public SortedSet<String> getCapabilities() {
168                 return createCaps();
169             }
170         };
171         storage.persistConfig(holder);
172
173         storage.persistConfig(holder);
174         storage.persistConfig(holder);
175
176         List<String> readLines = com.google.common.io.Files.readLines(file, Charsets.UTF_8);
177         assertEquals(27, readLines.size());
178
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()));
184     }
185
186     @Test
187     public void testNoLastConfig() throws Exception {
188         File file = Files.createTempFile("testFilePersist", ".txt").toFile();
189         file.deleteOnExit();
190         if (!file.exists()) {
191             return;
192         }
193         XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
194         storage.setFileStorage(file);
195
196         List<ConfigSnapshotHolder> elementOptional = storage.loadLastConfigs();
197         assertThat(elementOptional.size(), is(0));
198     }
199
200     @Test(expected = NullPointerException.class)
201     public void testNoProperties() throws Exception {
202         XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
203         storage.loadLastConfigs();
204     }
205
206     @Test(expected = NullPointerException.class)
207     public void testNoProperties2() throws Exception {
208         XmlFileStorageAdapter storage = new XmlFileStorageAdapter();
209         storage.persistConfig(new ConfigSnapshotHolder() {
210             @Override
211             public String getConfigSnapshot() {
212                 return Mockito.mock(String.class);
213             }
214
215             @Override
216             public SortedSet<String> getCapabilities() {
217                 return new TreeSet<>();
218             }
219         } );
220     }
221
222     static String createConfig() {
223         return "<config>" + i++ + "</config>";
224     }
225
226     private void delete(final File f) throws IOException {
227         if (f.isDirectory()) {
228             for (File c : f.listFiles()) {
229                 delete(c);
230             }
231         }
232         if (!f.delete()) {
233             throw new FileNotFoundException("Failed to delete file: " + f);
234         }
235     }
236 }