/*
* Copyright 2012 Nodeable Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.streamreduce.agent;
import com.streamreduce.AbstractInContainerTestCase;
import com.streamreduce.Constants;
import com.streamreduce.connections.CloudProvider;
import com.streamreduce.core.dao.SobaMessageDAO;
import com.streamreduce.core.model.Connection;
import com.streamreduce.core.model.InventoryItem;
import com.streamreduce.core.model.User;
import com.streamreduce.core.service.ConnectionService;
import com.streamreduce.core.service.InventoryService;
import com.streamreduce.core.service.UserService;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.List;
import static org.junit.Assert.assertEquals;
public class AgentITCase extends AbstractInContainerTestCase {
private static String AGENT_URL = "http://localhost:6099/agent/metrics";
private static String AGENT_TEST_MESSAGE = "com/nodeable/agent/agent-test-message.json";
private static String AGENT_TEST_MESSAGE_NODATA = "com/nodeable/agent/agent-nodata-test-message.json";
private static String AGENT_TEST_MESSAGE_NOINVENTORYID = "com/nodeable/agent/agent-noinventoryid-test-message.json";
private static String AGENT_TEST_MESSAGE_INVALIDINVENTORYID = "com/nodeable/agent/agent-invalidinventoryid-test-message.json";
@Autowired
private UserService userService;
@Autowired
private InventoryService inventoryService;
@Autowired
private ConnectionService connectionService;
@Autowired
private SobaMessageDAO sobaMessageDAO;
private InventoryItem inventoryItem;
@Before
public void setUp() throws Exception {
super.setUp();
// we know this user has inventory items right now...
// just grab the first one we find.
User user = userService.getUser(Constants.NODEABLE_SUPER_USERNAME);
Connection cloud = connectionService.getConnections(CloudProvider.TYPE, user).get(0);
List<InventoryItem> inventoryItems = inventoryService.getInventoryItems(cloud);
int retry = 0;
while (inventoryItems.size() == 0 && retry < 3) {
Thread.sleep(30000);
inventoryItems = inventoryService.getInventoryItems(cloud);
retry++;
}
if (inventoryItems.size() == 0) {
throw new Exception("Unable to prepare for the test so tests are unable to run.");
}
inventoryItem = inventoryItems.get(0);
}
@After
public void tearDown() throws Exception {
super.tearDown();
}
@Test
@Ignore
public void testAgentMessage() throws HttpException, IOException {
sendAgentMessage(AGENT_TEST_MESSAGE, 201);
// Assert that 1 SobaMessages of type AGENT are inserted into "messages"
// collection.
//Commented out until we have a better way to test other than using an AdvancedDataStore reference
// assertEquals(1,
// messageDatastore.find(MessageUtils.getInboxPath(inventoryItem.getConnection().getUser()),
// SobaMessage.class).filter("type", MessageType.AGENT).countAll());
}
@Test
@Ignore
public void testAgentMessageInvalidInventoryId() throws HttpException, IOException {
sendAgentMessage(AGENT_TEST_MESSAGE_INVALIDINVENTORYID, 400);
// Assert that 0 SobaMessages of type AGENT are inserted into "messages"
// collection.
//Commented out until we have a better way to test other than using an AdvancedDataStore reference
// assertEquals(0,
// messageDatastore.find(MessageUtils.getInboxPath(inventoryItem.getConnection().getUser()),
// SobaMessage.class).filter("type", MessageType.AGENT).countAll());
}
@Test
@Ignore
public void testAgentMessageNoData() throws HttpException, IOException {
sendAgentMessage(AGENT_TEST_MESSAGE_NODATA, 400);
// Assert that 0 SobaMessages of type AGENT are inserted into "messages"
// collection.
//Commented out until we have a better way to test other than using an AdvancedDataStore reference
// assertEquals(0,
// messageDatastore.find(MessageUtils.getInboxPath(inventoryItem.getConnection().getUser()),
// SobaMessage.class).filter("type", MessageType.AGENT).countAll());
}
@Test
@Ignore
public void testAgentMessageNoInventoryId() throws HttpException, IOException {
sendAgentMessage(AGENT_TEST_MESSAGE_NOINVENTORYID, 400);
// Assert that 0 SobaMessages of type AGENT are inserted into "messages"
// collection.
//Commented out until we have a better way to test other than using an AdvancedDataStore reference
// assertEquals(0,
// messageDatastore.find(MessageUtils.getInboxPath(inventoryItem.getConnection().getUser()),
// SobaMessage.class).filter("type", MessageType.AGENT).countAll());
}
protected void sendAgentMessage(String agentMessage, int expectedStatusCode) throws IOException {
// Post test agent message to agent url
HttpClient client = new DefaultHttpClient();
HttpPost postMethod = new HttpPost(AGENT_URL);
InputStream stream = AgentITCase.class.getResourceAsStream(agentMessage);
StringWriter writer = new StringWriter();
IOUtils.copy(stream, writer, "UTF-8");
String payload = injectValidNodeId(writer.toString());
postMethod.setEntity(new StringEntity(payload, MediaType.APPLICATION_JSON));
HttpResponse response = client.execute(postMethod);
int status = response.getStatusLine().getStatusCode();
System.out.println(response.getEntity().getContent());
// Assert that correct status is returned
assertEquals(expectedStatusCode, status);
}
protected String injectValidNodeId(String agentMessage) {
return agentMessage.replace("NODE_ID_PLACEHOLDER", inventoryItem.getExternalId());
}
}