2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2016-2018 Ericsson. All rights reserved.
4 * Modifications Copyright (C) 2020 Nordix Foundation.
5 * ================================================================================
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.gui.editors.apex.rest;
24 import static org.awaitility.Awaitility.await;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertNotNull;
27 import static org.junit.Assert.assertTrue;
29 import java.io.ByteArrayInputStream;
30 import java.io.IOException;
31 import java.io.InputStream;
32 import java.util.concurrent.TimeUnit;
33 import javax.ws.rs.client.Client;
34 import javax.ws.rs.client.ClientBuilder;
35 import javax.ws.rs.client.Entity;
36 import javax.ws.rs.client.Invocation.Builder;
37 import javax.ws.rs.client.WebTarget;
38 import javax.xml.bind.JAXBException;
39 import org.eclipse.persistence.jpa.jpql.Assert;
40 import org.junit.AfterClass;
41 import org.junit.BeforeClass;
42 import org.junit.Test;
43 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
44 import org.onap.policy.apex.model.basicmodel.handling.ApexModelReader;
45 import org.onap.policy.apex.model.basicmodel.handling.ApexModelStringWriter;
46 import org.onap.policy.apex.model.modelapi.ApexApiResult;
47 import org.onap.policy.apex.model.policymodel.concepts.AxPolicy;
48 import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
49 import org.onap.policy.common.parameters.ParameterService;
50 import org.onap.policy.common.utils.resources.ResourceUtils;
51 import org.onap.policy.gui.editors.apex.rest.ApexEditorMain.EditorState;
54 * The RestInterface Test.
56 public class RestInterfaceTest {
57 // CHECKSTYLE:OFF: MagicNumber
59 private static final String TESTMODELFILE = "models/PolicyModel.json";
60 private static final String TESTPORTNUM = "18989";
61 private static final long MAX_WAIT = 15000; // 15 sec
62 private static final InputStream SYSIN = System.in;
63 private static final String[] EDITOR_MAIN_ARGS = new String[] { "-p", TESTPORTNUM };
65 private static ApexEditorMain editorMain;
66 private static WebTarget target;
68 private static AxPolicyModel localmodel = null;
69 private static String localmodelString = null;
74 * @throws Exception if an error happens
77 public static void setUp() throws Exception {
78 ParameterService.clear();
80 editorMain = new ApexEditorMain(EDITOR_MAIN_ARGS, System.out);
81 // prevent a stray stdin value from killing the editor
82 final ByteArrayInputStream input = new ByteArrayInputStream("".getBytes());
84 // Init the editor in a separate thread
85 final Runnable testThread = new Runnable() {
91 new Thread(testThread).start();
92 // wait until editorMain is in state RUNNING
93 await().atMost(MAX_WAIT, TimeUnit.MILLISECONDS).until(() -> !(editorMain.getState().equals(EditorState.READY)
94 || editorMain.getState().equals(EditorState.INITIALIZING)));
96 if (editorMain.getState().equals(EditorState.STOPPED)) {
97 Assert.fail("Rest endpoint (" + editorMain + ") shut down before it could be used");
101 final Client c = ClientBuilder.newClient();
102 // Create the web target
103 target = c.target(new ApexEditorParameters().getBaseUri());
105 // load a test model locally
106 localmodel = new ApexModelReader<>(AxPolicyModel.class, false)
107 .read(ResourceUtils.getResourceAsStream(TESTMODELFILE));
108 localmodelString = new ApexModelStringWriter<AxPolicyModel>(false).writeJsonString(localmodel,
109 AxPolicyModel.class);
111 // initialize a session ID
118 * @throws IOException Signals that an I/O exception has occurred.
119 * @throws InterruptedException the interrupted exception
122 public static void cleanUpStreams() throws IOException, InterruptedException {
123 editorMain.shutdown();
124 // wait until editorMain is in state STOPPED
125 await().atMost(MAX_WAIT, TimeUnit.MILLISECONDS).until(() -> editorMain.getState().equals(EditorState.STOPPED));
130 * Test to see that the message create Model with model id -1 .
133 public void createSession() {
138 * Creates a new session.
140 * @return the session ID
142 private static int createNewSession() {
143 final ApexApiResult responseMsg = target.path("editor/-1/Session/Create").request().get(ApexApiResult.class);
144 assertEquals(ApexApiResult.Result.SUCCESS, responseMsg.getResult());
145 assertEquals(1, responseMsg.getMessages().size());
146 return Integer.parseInt(responseMsg.getMessages().get(0));
152 * @param sessionId the session ID
153 * @param modelAsJsonString the model as json string
155 private void uploadPolicy(final int sessionId, final String modelAsJsonString) {
156 final Builder requestbuilder = target.path("editor/" + sessionId + "/Model/Load").request();
157 final ApexApiResult responseMsg = requestbuilder.put(Entity.json(modelAsJsonString), ApexApiResult.class);
158 assertTrue(responseMsg.isOk());
162 * Create a new session, Upload a test policy model, then get a policy, parse
163 * it, and compare it to the same policy in the original model.
165 * @throws ApexException if there is an Apex Error
166 * @throws JAXBException if there is a JaxB Error
169 public void testUploadThenGet() throws ApexException, JAXBException {
171 final int sessionId = createNewSession();
173 uploadPolicy(sessionId, localmodelString);
175 final ApexApiResult responseMsg = target.path("editor/" + sessionId + "/Policy/Get")
176 .queryParam("name", "policy").queryParam("version", "0.0.1").request().get(ApexApiResult.class);
177 assertTrue(responseMsg.isOk());
179 // The string in responseMsg.Messages[0] is a JSON representation of a AxPolicy
180 // object. Lets parse it
181 final String returnedPolicyAsString = responseMsg.getMessages().get(0);
182 ApexModelReader<AxPolicy> apexPolicyReader = new ApexModelReader<>(AxPolicy.class, false);
183 final AxPolicy returnedpolicy = apexPolicyReader.read(returnedPolicyAsString);
184 // AxPolicy returnedpolicy =
185 // RestUtils.getConceptFromJSON(returnedPolicyAsString, AxPolicy.class);
187 // Extract the local copy of that policy from the local Apex Policy Model
188 final AxPolicy localpolicy = localmodel.getPolicies().get("policy", "0.0.1");
190 // Write that local copy of the AxPolicy object to a Json String, ten parse it
192 final ApexModelStringWriter<AxPolicy> apexModelWriter = new ApexModelStringWriter<>(false);
193 final String localPolicyString = apexModelWriter.writeJsonString(localpolicy, AxPolicy.class);
194 apexPolicyReader = new ApexModelReader<>(AxPolicy.class, false);
195 final AxPolicy localpolicyReparsed = apexPolicyReader.read(localPolicyString);
196 // AxPolicy localpolicy_reparsed =
197 // RestUtils.getConceptFromJSON(returnedPolicyAsString, AxPolicy.class);
199 assertNotNull(returnedpolicy);
200 assertNotNull(localpolicy);
201 assertNotNull(localpolicyReparsed);
202 assertEquals(localpolicy, localpolicyReparsed);
203 assertEquals(localpolicy, returnedpolicy);
206 // TODO Full unit testing of REST interface