Merge "BUG-509: make sure datastore commits are visible"
[controller.git] / opendaylight / config / config-persister-file-adapter / src / test / java / org / opendaylight / controller / config / persist / storage / file / 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;
10
11 import com.google.common.base.Charsets;
12 import com.google.common.base.Predicate;
13 import com.google.common.collect.Collections2;
14 import java.io.File;
15 import java.nio.file.Files;
16 import java.util.Collection;
17 import java.util.List;
18 import java.util.SortedSet;
19 import java.util.TreeSet;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.mockito.Mockito;
23 import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
24 import org.opendaylight.controller.config.persist.api.Persister;
25 import org.opendaylight.controller.config.persist.test.PropertiesProviderTest;
26 import static junit.framework.Assert.assertFalse;
27 import static org.hamcrest.CoreMatchers.is;
28 import static org.junit.Assert.assertEquals;
29 import static org.junit.Assert.assertThat;
30
31 public class FileStorageAdapterTest {
32
33     private static int i;
34     private File file;
35
36     @Before
37     public void setUp() throws Exception {
38         file = Files.createTempFile("testFilePersist", ".txt").toFile();
39         if (!file.exists())
40             return;
41         com.google.common.io.Files.write("", file, Charsets.UTF_8);
42         i = 1;
43     }
44
45
46     @Test
47     public void testFileAdapterAsPersister() throws Exception {
48         FileStorageAdapter storage = new FileStorageAdapter();
49         PropertiesProviderTest pp = new PropertiesProviderTest();
50         pp.addProperty("fileStorage",file.getPath());
51         pp.addProperty("numberOfBackups",Integer.toString(Integer.MAX_VALUE));
52
53         Persister configPersister = storage.instantiate(pp);
54         final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
55             @Override
56             public String getConfigSnapshot() {
57                 return createConfig();
58             }
59
60             @Override
61             public SortedSet<String> getCapabilities() {
62                 return createCaps();
63             }
64         };
65         configPersister.persistConfig(holder);
66
67         configPersister.persistConfig(holder);
68
69         Collection<String> readLines = Collections2.filter(com.google.common.io.Files.readLines(file, Charsets.UTF_8),
70                 new Predicate<String>() {
71
72                     @Override
73                     public boolean apply(String input) {
74                         if (input.equals(""))
75                             return false;
76                         return true;
77                     }
78                 });
79         assertEquals(14, readLines.size());
80
81         List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
82         assertEquals(1, lastConf.size());
83         ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
84         assertEquals("<config>2</config>",
85                 configSnapshotHolder.getConfigSnapshot().replaceAll("\\s", ""));
86         assertEquals(createCaps(), configSnapshotHolder.getCapabilities());
87     }
88     @Test
89     public void testFileAdapter() throws Exception {
90         FileStorageAdapter storage = new FileStorageAdapter();
91         storage.setFileStorage(file);
92         storage.setNumberOfBackups(Integer.MAX_VALUE);
93         final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
94             @Override
95             public String getConfigSnapshot() {
96                 return createConfig();
97             }
98
99             @Override
100             public SortedSet<String> getCapabilities() {
101                 return createCaps();
102             }
103         };
104         storage.persistConfig(holder);
105
106         storage.persistConfig(holder);
107
108         Collection<String> readLines = Collections2.filter(com.google.common.io.Files.readLines(file, Charsets.UTF_8),
109                 new Predicate<String>() {
110
111                     @Override
112                     public boolean apply(String input) {
113                         if (input.equals(""))
114                             return false;
115                         return true;
116                     }
117                 });
118         assertEquals(14, readLines.size());
119
120         List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
121         assertEquals(1, lastConf.size());
122         ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
123         assertEquals("<config>2</config>",
124                 configSnapshotHolder.getConfigSnapshot().replaceAll("\\s", ""));
125         assertEquals(createCaps(), configSnapshotHolder.getCapabilities());
126     }
127
128     private SortedSet<String> createCaps() {
129         SortedSet<String> caps = new TreeSet<>();
130
131         caps.add("cap1");
132         caps.add("cap2");
133         caps.add("capaaaa as dasfasdf s2");
134         return caps;
135     }
136
137     @Test
138     public void testFileAdapterOneBackup() throws Exception {
139         FileStorageAdapter storage = new FileStorageAdapter();
140         storage.setFileStorage(file);
141         storage.setNumberOfBackups(1);
142         final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
143             @Override
144             public String getConfigSnapshot() {
145                 return createConfig();
146             }
147
148             @Override
149             public SortedSet<String> getCapabilities() {
150                 return createCaps();
151             }
152         };
153         storage.persistConfig(holder);
154
155         storage.persistConfig(holder);
156
157         Collection<String> readLines = Collections2.filter(com.google.common.io.Files.readLines(file, Charsets.UTF_8),
158                 new Predicate<String>() {
159
160                     @Override
161                     public boolean apply(String input) {
162                         if (input.equals(""))
163                             return false;
164                         return true;
165                     }
166                 });
167         assertEquals(7, readLines.size());
168
169         List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
170         assertEquals(1, lastConf.size());
171         ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
172         assertEquals("<config>2</config>",
173                 configSnapshotHolder.getConfigSnapshot().replaceAll("\\s", ""));
174     }
175
176     @Test
177     public void testFileAdapterOnlyTwoBackups() throws Exception {
178         FileStorageAdapter storage = new FileStorageAdapter();
179         storage.setFileStorage(file);
180         storage.setNumberOfBackups(2);
181         final ConfigSnapshotHolder holder = new ConfigSnapshotHolder() {
182             @Override
183             public String getConfigSnapshot() {
184                 return createConfig();
185             }
186
187             @Override
188             public SortedSet<String> getCapabilities() {
189                 return createCaps();
190             }
191         };
192         storage.persistConfig(holder);
193
194         storage.persistConfig(holder);
195         storage.persistConfig(holder);
196
197         Collection<String> readLines = Collections2.filter(com.google.common.io.Files.readLines(file, Charsets.UTF_8),
198                 new Predicate<String>() {
199
200                     @Override
201                     public boolean apply(String input) {
202                         if (input.equals(""))
203                             return false;
204                         return true;
205                     }
206                 });
207
208         assertEquals(14, readLines.size());
209
210         List<ConfigSnapshotHolder> lastConf = storage.loadLastConfigs();
211         assertEquals(1, lastConf.size());
212         ConfigSnapshotHolder configSnapshotHolder = lastConf.get(0);
213         assertEquals("<config>3</config>",
214                 configSnapshotHolder.getConfigSnapshot().replaceAll("\\s", ""));
215         assertFalse(readLines.contains(holder.getConfigSnapshot()));
216     }
217
218     @Test
219     public void testNoLastConfig() throws Exception {
220         File file = Files.createTempFile("testFilePersist", ".txt").toFile();
221         if (!file.exists())
222             return;
223         FileStorageAdapter storage = new FileStorageAdapter();
224         storage.setFileStorage(file);
225
226         List<ConfigSnapshotHolder> elementOptional = storage.loadLastConfigs();
227         assertThat(elementOptional.size(), is(0));
228     }
229
230     @Test(expected = NullPointerException.class)
231     public void testNoProperties() throws Exception {
232         FileStorageAdapter storage = new FileStorageAdapter();
233         storage.loadLastConfigs();
234     }
235
236     @Test(expected = NullPointerException.class)
237     public void testNoProperties2() throws Exception {
238         FileStorageAdapter storage = new FileStorageAdapter();
239         storage.persistConfig(new ConfigSnapshotHolder() {
240             @Override
241             public String getConfigSnapshot() {
242                 return Mockito.mock(String.class);
243             }
244
245             @Override
246             public SortedSet<String> getCapabilities() {
247                 return new TreeSet<>();
248             }
249         } );
250     }
251
252     static String createConfig() {
253         return "<config>" + i++ + "</config>";
254     }
255
256 }