/*
* The MIT License
*
* Copyright (c) 2014 Ericsson
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.sonyericsson.hudson.plugins.gerrit.trigger.playback;
import com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer;
import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl;
import com.sonyericsson.hudson.plugins.gerrit.trigger.config.IGerritHudsonTriggerConfig;
import com.sonyericsson.hudson.plugins.gerrit.trigger.mock.Setup;
import com.sonyericsson.hudson.plugins.gerrit.trigger.utils.GerritPluginChecker;
import com.sonymobile.tools.gerrit.gerritevents.GerritHandler;
import com.sonymobile.tools.gerrit.gerritevents.GerritJsonEventFactory;
import com.sonymobile.tools.gerrit.gerritevents.dto.GerritEvent;
import com.sonymobile.tools.gerrit.gerritevents.dto.events.GerritTriggeredEvent;
import com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated;
import hudson.XmlFile;
import jenkins.model.Jenkins;
import junit.framework.TestCase;
import net.sf.json.JSONObject;
import org.apache.commons.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Random;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.spy;
/**
*
* Missed events load and persist tests.
*
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Jenkins.class, PluginImpl.class, GerritMissedEventsPlaybackManager.class, GerritPluginChecker.class })
@PowerMockIgnore("javax.net.ssl.*")
public class GerritMissedEventsLoadPersistTest {
private static final int MAXRANDOMNUMBER = 100;
private static final int SLEEPTIME = 500;
/**
* Default constructor.
*/
public GerritMissedEventsLoadPersistTest() {
}
/**
* Create mocks.
* @throws IOException if it occurs.
*/
@Before
public void setUp() throws IOException {
Jenkins jenkinsMock = mock(Jenkins.class);
PowerMockito.mockStatic(Jenkins.class);
when(Jenkins.getInstance()).thenReturn(jenkinsMock);
PluginImpl plugin = PowerMockito.mock(PluginImpl.class);
GerritServer server = mock(GerritServer.class);
IGerritHudsonTriggerConfig config = Setup.createConfig();
config = spy(config);
when(plugin.getServer(any(String.class))).thenReturn(server);
GerritHandler handler = mock(GerritHandler.class);
when(plugin.getHandler()).thenReturn(handler);
when(server.getConfig()).thenReturn(config);
PowerMockito.when(PluginImpl.getInstance()).thenReturn(plugin);
PowerMockito.mockStatic(GerritMissedEventsPlaybackManager.class);
File tmpFile = null;
try {
tmpFile = File.createTempFile("gerrit-server-timestamps", ".xml");
} catch (IOException e) {
fail("Failed to create Temp File");
}
tmpFile.deleteOnExit();
PrintWriter out = null;
try {
out = new PrintWriter(tmpFile);
} catch (FileNotFoundException e) {
fail("Failed to write to Temp File");
}
String text = "<?xml version='1.0' encoding='UTF-8'?>\n"
+ "<com.sonyericsson.hudson.plugins.gerrit.trigger.playback.EventTimeSlice "
+ "plugin='gerrit-trigger@2.14.0-SNAPSHOT'>"
+ "<timeSlice>1430244884000</timeSlice>"
+ "<events>"
+ "</events>"
+ "</com.sonyericsson.hudson.plugins.gerrit.trigger.playback.EventTimeSlice>";
out.println(text);
out.close();
XmlFile xmlFile = new XmlFile(tmpFile);
PowerMockito.when(GerritMissedEventsPlaybackManager.getConfigXml(anyString())).thenReturn(xmlFile);
PowerMockito.mockStatic(GerritPluginChecker.class);
PowerMockito.when(GerritPluginChecker.isPluginEnabled((IGerritHudsonTriggerConfig)anyObject()
, anyString())).thenReturn(true);
}
/**
* Test if Gerrit returns a null eventCreated attribute.
* @throws IOException if occurs.
*/
@Test
public void testNullEventCreatedOn() throws IOException {
InputStream stream = getClass().getResourceAsStream("DeserializeEventCreatedOnTest.json");
String json = IOUtils.toString(stream);
JSONObject jsonObject = JSONObject.fromObject(json);
GerritEvent evt = GerritJsonEventFactory.getEvent(jsonObject);
GerritTriggeredEvent gEvt = (GerritTriggeredEvent)evt;
assertNull(gEvt.getEventCreatedOn());
GerritMissedEventsPlaybackManager missingEventsPlaybackManager
= new GerritMissedEventsPlaybackManager("defaultServer");
assertTrue(!missingEventsPlaybackManager.persist(gEvt));
}
/**
* Given a non-existing timestamp file
* When we attempt to load it
* Then we retrieve a null map.
* @throws IOException if it occurs.
*/
@Test
public void testLoadTimeStampFromNonExistentFile() throws IOException {
GerritMissedEventsPlaybackManager.getConfigXml("defaultServer").delete();
GerritMissedEventsPlaybackManager missingEventsPlaybackManager
= new GerritMissedEventsPlaybackManager("defaultServer");
try {
missingEventsPlaybackManager.load();
} catch (IOException e) {
fail(e.getMessage());
}
assertNull(missingEventsPlaybackManager.serverTimestamp);
}
/**
* Given an existing timestamp file
* And it contains at least one entry with a valid timestamp
* When we attempt to load it
* Then we retrieve a non-null map.
*/
@Test
public void testLoadTimeStampFromFile() {
GerritMissedEventsPlaybackManager missingEventsPlaybackManager
= new GerritMissedEventsPlaybackManager("defaultServer");
try {
missingEventsPlaybackManager.load();
} catch (IOException e) {
fail(e.getMessage());
}
assertNotNull(missingEventsPlaybackManager.serverTimestamp);
}
/**
* Given an existing timestamp file
* And it contains at least one entry with a valid timestamp
* When a new event is received for the server connection
* Then the timestamp is persisted.
*/
@Test
public void testPersistTimeStampToFile() {
Random randomGenerator = new Random();
int randomInt = randomGenerator.nextInt(MAXRANDOMNUMBER);
GerritMissedEventsPlaybackManager missingEventsPlaybackManager
= new GerritMissedEventsPlaybackManager(new Integer(randomInt).toString() + "-server");
try {
missingEventsPlaybackManager.load();
} catch (IOException e) {
fail(e.getMessage());
}
PatchsetCreated patchsetCreated = Setup.createPatchsetCreated("someGerritServer", "someProject",
"refs/heads/master");
patchsetCreated.setReceivedOn(System.currentTimeMillis());
missingEventsPlaybackManager.gerritEvent(patchsetCreated);
assertNotNull(missingEventsPlaybackManager.serverTimestamp);
}
/**
* Return a missingEventsPlaybackManager.
* @return missingEventsPlaybackManager.
*/
private GerritMissedEventsPlaybackManager setupManager() {
GerritMissedEventsPlaybackManager missingEventsPlaybackManager
= new GerritMissedEventsPlaybackManager("defaultServer");
try {
missingEventsPlaybackManager.load();
} catch (IOException e) {
fail(e.getMessage());
}
assertNotNull(missingEventsPlaybackManager.serverTimestamp);
assertTrue("should be true", missingEventsPlaybackManager.isSupported());
PatchsetCreated patchsetCreated = Setup.createPatchsetCreated("someGerritServer", "someProject",
"refs/heads/master");
patchsetCreated.setReceivedOn(System.currentTimeMillis());
missingEventsPlaybackManager.gerritEvent(patchsetCreated);
patchsetCreated.setReceivedOn(System.currentTimeMillis());
missingEventsPlaybackManager.gerritEvent(patchsetCreated);
try {
Thread.currentThread().sleep(SLEEPTIME);
} catch (InterruptedException e) {
fail(e.getMessage());
}
missingEventsPlaybackManager.connectionDown();
missingEventsPlaybackManager
= new GerritMissedEventsPlaybackManager("defaultServer");
try {
missingEventsPlaybackManager.load();
} catch (IOException e) {
fail(e.getMessage());
}
return missingEventsPlaybackManager;
}
/**
* Given an existing timestamp file
* When a connection is restarted
* Then the diff between last timestamp and current time
* should be greater than 0.
*/
@Test
public void testGetTimeStampDiff() {
GerritMissedEventsPlaybackManager missingEventsPlaybackManager =
setupManager();
assertNotNull(missingEventsPlaybackManager.serverTimestamp);
TestCase.assertTrue("Diff should be greater than 0",
new Date().getTime() - missingEventsPlaybackManager.getDateFromTimestamp().getTime() > 0);
missingEventsPlaybackManager.shutdown();
}
}