/*
* Sakuli - Testing and Monitoring-Tool for Websites and common UIs.
*
* Copyright 2013 - 2015 the original author or authors.
*
* 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 org.sakuli.services.forwarder.database.dao.impl;
import org.sakuli.datamodel.TestCase;
import org.sakuli.datamodel.TestCaseStep;
import org.sakuli.exceptions.SakuliException;
import org.sakuli.services.forwarder.database.ProfileJdbcDb;
import org.sakuli.services.forwarder.database.dao.DaoTestCase;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.jdbc.core.support.SqlLobValue;
import org.springframework.stereotype.Component;
import javax.imageio.ImageIO;
import javax.sql.DataSource;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.sql.Types;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author tschneck
* Date: 17.06.13
*/
@ProfileJdbcDb
@Component
public class DaoTestCaseImpl extends Dao implements DaoTestCase {
@Autowired
public DaoTestCaseImpl(DataSource dataSource) throws SakuliException {
super(dataSource);
}
@Override
public void saveTestCaseResult(final TestCase testCase) {
LOGGER.info("Save results for test case \"" + testCase.getId() + "\"");
//create a map for the sql parameters
MapSqlParameterSource tcParameters = new MapSqlParameterSource();
tcParameters.addValue("sakuli_suites_id", testSuite.getDbPrimaryKey());
tcParameters.addValue("caseID", testCase.getId());
tcParameters.addValue("result", testCase.getState().getErrorCode());
tcParameters.addValue("result_desc", testCase.getState());
tcParameters.addValue("name", testCase.getName());
tcParameters.addValue("guid", testSuite.getGuid());
tcParameters.addValue("start", testCase.getStartDateAsUnixTimestamp());
tcParameters.addValue("stop", testCase.getStopDateAsUnixTimestamp());
int warningTime = testCase.getWarningTime();
tcParameters.addValue("warning", (warningTime != 0) ? warningTime : null);
int criticalTime = testCase.getCriticalTime();
tcParameters.addValue("critical", (criticalTime != 0) ? criticalTime : null);
tcParameters.addValue("browser", testSuite.getBrowserInfo());
tcParameters.addValue("lastpage", testCase.getLastURL());
//try to save the screenshot
tcParameters.addValue("screenshot", getScreenshotAsSqlLobValue(testCase), Types.BLOB);
tcParameters.addValue("duration", testCase.getDuration());
tcParameters.addValue("msg", testCase.getExceptionMessages(true));
//generate the sql-statement
SimpleJdbcInsert insertTCResults = new SimpleJdbcInsert(getDataSource())
.withTableName("sakuli_cases")
.usingGeneratedKeyColumns("id");
LOGGER.debug("write the following values to 'sakuli_cases': "
+ tcParameters.getValues()
+ " => now execute ....");
int dbPrimaryKey = insertTCResults.executeAndReturnKey(tcParameters).intValue();
LOGGER.info("test case '" + testCase.getId()
+ "' has been written to 'sahi_cases' with primaryKey=" + dbPrimaryKey);
testCase.setDbPrimaryKey(dbPrimaryKey);
}
/**
* Determine the first available screenshot inside of the testcase and respectively in the assigned steps.
* For Details of the transformation, see {@link org.springframework.jdbc.support.lob.LobHandler}.
*
* @return a {@link SqlLobValue}
*/
protected SqlLobValue getScreenshotAsSqlLobValue(TestCase testCase) {
try {
Path screenShotPath = testCase.getScreenShotPath();
if (screenShotPath == null) {
//get first step exception
for (TestCaseStep step : testCase.getStepsAsSortedSet()) {
if (step.getScreenShotPath() != null) {
screenShotPath = step.getScreenShotPath();
break;
}
}
}
if (screenShotPath != null) {
final InputStream blobIs = Files.newInputStream(screenShotPath);
final int length = (int) screenShotPath.toFile().length();
return new SqlLobValue(blobIs, length, lobHandler);
}
return null;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public int getCountOfSahiCases() {
return this.getJdbcTemplate().queryForObject("select count(*) from sakuli_cases", Integer.class);
}
@Deprecated
@Override
public File getScreenShotFromDB(int dbPrimaryKey) {
try {
List l = getJdbcTemplate().query("select id, screenshot from sakuli_cases where id=" + dbPrimaryKey,
(rs, i) -> {
Map results = new HashMap();
InputStream blobBytes = lobHandler.getBlobAsBinaryStream(rs, "screenshot");
results.put("BLOB", blobBytes);
return results;
}
);
HashMap<String, InputStream> map = (HashMap<String, InputStream>) l.get(0);
//ByteArrayInputStream in = new ByteArrayInputStream(map.get("BLOB"));
BufferedImage picBuffer = ImageIO.read(map.get("BLOB"));
File png = new File(testSuite.getAbsolutePathOfTestSuiteFile().substring(0, testSuite.getAbsolutePathOfTestSuiteFile().lastIndexOf(File.separator)) + File.separator + "temp_junit_test.png");
png.createNewFile();
ImageIO.write(picBuffer, "png", png);
png.deleteOnExit();
return png;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}