package hudson.plugins.ec2;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.CreateTagsResult;
import com.amazonaws.services.ec2.model.InstanceType;
import com.amazonaws.services.ec2.model.Tag;
import hudson.model.Node;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.powermock.reflect.Whitebox;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class SlaveTemplateUnitTest {
Logger logger;
TestHandler handler;
@Before
public void setUp() throws Exception {
AmazonEC2Cloud.testMode = true;
handler = new TestHandler();
logger = Logger.getLogger(SlaveTemplate.class.getName());
logger.addHandler(handler);
}
@After
public void tearDown() throws Exception {
AmazonEC2Cloud.testMode = false;
}
@Test
public void testUpdateRemoteTags() throws Exception {
AmazonEC2 ec2 = new AmazonEC2Client() {
@Override
public CreateTagsResult createTags(com.amazonaws.services.ec2.model.CreateTagsRequest createTagsRequest) {
return null;
}
};
String ami = "ami1";
String description = "foo ami";
EC2Tag tag1 = new EC2Tag("name1", "value1");
EC2Tag tag2 = new EC2Tag("name2", "value2");
List<EC2Tag> tags = new ArrayList<EC2Tag>();
tags.add(tag1);
tags.add(tag2);
String instanceId = "123";
SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, "") {
@Override
protected Object readResolve() {
return null;
}
};
ArrayList<Tag> awsTags = new ArrayList<Tag>();
awsTags.add(new Tag(EC2Tag.TAG_NAME_JENKINS_SLAVE_TYPE, "value1"));
awsTags.add(new Tag(EC2Tag.TAG_NAME_JENKINS_SLAVE_TYPE, "value2"));
final Object params[] = { ec2, awsTags, "InvalidInstanceRequestID.NotFound", instanceId };
Whitebox.invokeMethod(orig, "updateRemoteTags", params);
assertEquals(0, handler.getRecords().size());
}
@Test
public void testUpdateRemoteTagsInstanceNotFound() throws Exception {
AmazonEC2 ec2 = new AmazonEC2Client() {
@Override
public CreateTagsResult createTags(com.amazonaws.services.ec2.model.CreateTagsRequest createTagsRequest) {
AmazonServiceException e = new AmazonServiceException("Instance not found - InvalidInstanceRequestID.NotFound");
e.setErrorCode("InvalidInstanceRequestID.NotFound");
throw e;
}
};
String ami = "ami1";
String description = "foo ami";
EC2Tag tag1 = new EC2Tag("name1", "value1");
EC2Tag tag2 = new EC2Tag("name2", "value2");
List<EC2Tag> tags = new ArrayList<EC2Tag>();
tags.add(tag1);
tags.add(tag2);
String instanceId = "123";
SlaveTemplate orig = new SlaveTemplate(ami, EC2AbstractSlave.TEST_ZONE, null, "default", "foo", InstanceType.M1Large, false, "ttt", Node.Mode.NORMAL, description, "bar", "bbb", "aaa", "10", "fff", null, "-Xmx1g", false, "subnet 456", tags, null, false, null, "", true, false, "", false, "") {
@Override
protected Object readResolve() {
return null;
}
};
ArrayList<Tag> awsTags = new ArrayList<Tag>();
awsTags.add(new Tag(EC2Tag.TAG_NAME_JENKINS_SLAVE_TYPE, "value1"));
awsTags.add(new Tag(EC2Tag.TAG_NAME_JENKINS_SLAVE_TYPE, "value2"));
final Object params[] = { ec2, awsTags, "InvalidSpotInstanceRequestID.NotFound", instanceId };
Whitebox.invokeMethod(orig, "updateRemoteTags", params);
assertEquals(5, handler.getRecords().size());
Iterator<LogRecord> logs = handler.getRecords().iterator();
while (logs.hasNext()) {
String log = logs.next().getMessage();
assertTrue(log.contains("Instance not found - InvalidInstanceRequestID.NotFound"));
}
}
}
class TestHandler extends Handler {
private final List<LogRecord> records = new LinkedList<LogRecord>();
@Override
public void close() throws SecurityException {
}
@Override
public void flush() {
}
@Override
public void publish(LogRecord record) {
records.add(record);
}
public List<LogRecord> getRecords() {
return records;
}
}