Initial OpenECOMP policy/engine commit
[policy/engine.git] / ECOMP-PDP / src / test / java / org / openecomp / policy / pdp / test / conformance / ConformanceTestSet.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ECOMP-PDP
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.policy.pdp.test.conformance;
22
23 import java.io.File;
24 import java.io.IOException;
25 import java.nio.file.FileVisitResult;
26 import java.nio.file.FileVisitor;
27 import java.nio.file.Files;
28 import java.nio.file.Path;
29 import java.nio.file.attribute.BasicFileAttributes;
30 import java.util.ArrayList;
31 import java.util.Collections;
32 import java.util.HashMap;
33 import java.util.Iterator;
34 import java.util.List;
35 import java.util.Map;
36
37 import org.apache.commons.logging.Log;
38 import org.apache.commons.logging.LogFactory;
39 import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
40 import org.openecomp.policy.common.logging.flexlogger.Logger; 
41
42 /**
43  * ConformanceTestSet represents a collection of <code>ConformanceTest</code>s ordered by the test name.  It has methods for
44  * scanning a directory to generate an ordered set.
45  * 
46  * @version $Revision: 1.1 $
47  */
48 public class ConformanceTestSet {
49         private static final Logger logger                                              = FlexLogger.getLogger(ConformanceTestSet.class);
50         private List<ConformanceTest> listConformanceTests      = new ArrayList<ConformanceTest>();
51         
52         protected List<ConformanceTest> getListConformanceTests() {
53                 return this.listConformanceTests;
54         }
55         
56         protected ConformanceTestSet() {
57                 
58         }
59         
60         private static String getTestName(String fileName, int itemPos) {
61                 return (itemPos == 0 ? "NULL" : fileName.substring(0, itemPos));
62         }
63         
64         private static String getTestName(File file) {
65                 String fileName = file.getName();
66                 int itemPos             = fileName.indexOf("Policy");
67                 if (itemPos >= 0) {
68                         return getTestName(fileName, itemPos);
69                 } else if ((itemPos = fileName.indexOf("Request")) >= 0) {
70                         return getTestName(fileName, itemPos);
71                 } else if ((itemPos = fileName.indexOf("Response")) >= 0) {
72                         return getTestName(fileName, itemPos);
73                 } else if ((itemPos = fileName.indexOf("Repository")) >= 0) {
74                         return getTestName(fileName, itemPos);
75                 } else {
76                         return null;
77                 }
78         }
79         
80         public static ConformanceTestSet loadDirectory(File fileDir) throws IOException {
81                 final Map<String,ConformanceTest> mapConformanceTests   = new HashMap<String,ConformanceTest>();
82                 
83                 Files.walkFileTree(fileDir.toPath(), new FileVisitor<Path>() {
84                         @Override
85                         public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
86                                 logger.info("Scanning directory " + dir.getFileName());
87                                 return FileVisitResult.CONTINUE;
88                         }
89
90                         @Override
91                         public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
92                                 File fileVisited        = file.toFile();
93                                 String fileName         = fileVisited.getName();
94                                 if (fileName.endsWith(".xml") || fileName.endsWith(".properties")) {
95                                         String testName = getTestName(fileVisited);
96                                         if (testName != null) {
97                                                 ConformanceTest conformanceTest = mapConformanceTests.get(testName);
98                                                 if (conformanceTest == null) {
99                                                         logger.info("Added test " + testName);
100                                                         conformanceTest = new ConformanceTest(testName);
101                                                         mapConformanceTests.put(testName, conformanceTest);
102                                                 }
103                                                 if (fileName.endsWith("Policy.xml")) {
104                                                         conformanceTest.getRepository().addRootPolicy(fileVisited);
105                                                 } else if (fileName.endsWith("Repository.properties")) {
106                                                         conformanceTest.getRepository().load(fileVisited);
107                                                 } else if (fileName.endsWith("Request.xml")) {
108                                                         conformanceTest.setRequest(fileVisited);
109                                                 } else if (fileName.endsWith("Response.xml")) {
110                                                         conformanceTest.setResponse(fileVisited);
111                                                 }
112                                         }
113                                 }
114                                 return FileVisitResult.CONTINUE;
115                         }
116
117                         @Override
118                         public FileVisitResult visitFileFailed(Path file, IOException exc)      throws IOException {
119                                 logger.warn("Skipped " + file.getFileName());
120                                 return FileVisitResult.CONTINUE;
121                         }
122
123                         @Override
124                         public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
125                                 return FileVisitResult.CONTINUE;
126                         }
127                 });
128                 
129                 /*
130                  * Sort the keyset and pull out the tests that have the required components
131                  */
132                 List<String> listTestNames      = new ArrayList<String>();
133                 listTestNames.addAll(mapConformanceTests.keySet());
134                 Collections.sort(listTestNames);
135                 
136                 ConformanceTestSet conformanceTestSet   = new ConformanceTestSet();
137                 Iterator<String> iterTestNames  = listTestNames.iterator();
138                 while (iterTestNames.hasNext()) {
139                         ConformanceTest conformanceTest = mapConformanceTests.get(iterTestNames.next());
140                         if (conformanceTest.isComplete()) {
141                                 conformanceTestSet.addConformanceTest(conformanceTest);
142                                 logger.debug("Added conformance test " + conformanceTest.getTestName());
143                         } else {
144                                 logger.warn("Incomplete conformance test " + conformanceTest.getTestName());
145                         }
146                 }
147                 
148                 return conformanceTestSet;
149                 
150         }
151
152         public Iterator<ConformanceTest> getConformanceTests() {
153                 return this.listConformanceTests.iterator();
154         }
155         
156         public void addConformanceTest(ConformanceTest conformanceTest) {
157                 this.listConformanceTests.add(conformanceTest);
158         }
159         
160         public void addConformanceTestSet(ConformanceTestSet conformanceTestSet) {
161                 this.listConformanceTests.addAll(conformanceTestSet.getListConformanceTests());
162         }
163         
164         public static void main(String[] args) {
165                 for (String dir : args) {
166                         try {
167                                 ConformanceTestSet conformanceTestSet                   = ConformanceTestSet.loadDirectory(new File(dir));
168                                 Iterator<ConformanceTest> iterConformanceTests  = conformanceTestSet.getConformanceTests();
169                                 if (iterConformanceTests == null) {
170                                         System.out.println("No tests found in " + dir);
171                                 } else {
172                                         System.out.println("Tests found in " + dir);
173                                         while (iterConformanceTests.hasNext()) {
174                                                 System.out.println(iterConformanceTests.next().toString());
175                                         }
176                                 }
177                         } catch (Exception ex) {
178                                 ex.printStackTrace(System.err);
179                         }
180                 }
181         }
182 }