Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
8be0c92
add methods produceReportWithCoverage and getHtmlCoverage
PhilippSalvisberg May 30, 2020
9605a71
add test for produceReportWithCoverage
PhilippSalvisberg May 30, 2020
c18c484
execute setup and teardown per test
PhilippSalvisberg May 30, 2020
758872c
add null checks for parameters
PhilippSalvisberg May 30, 2020
55b8727
add public openInBrowser method
PhilippSalvisberg May 30, 2020
fd0d3df
reuse code coverage test setup with actual coverage result
PhilippSalvisberg May 30, 2020
5284796
add support to run tests with code coverage in one run
PhilippSalvisberg May 30, 2020
b1985e6
add test with code coverage
PhilippSalvisberg May 30, 2020
e280483
run code coverage via realtime reporter if possible
PhilippSalvisberg May 30, 2020
22610ee
no dedicated connection required anymore
PhilippSalvisberg May 30, 2020
e677de7
configure default fetch size of 100 (except for consumeReport)
PhilippSalvisberg May 30, 2020
667b5fc
add resources for code coverage (icon and tooltip text)
PhilippSalvisberg May 30, 2020
c2e7b12
calculate default schemas and provide getter; handle test env.
PhilippSalvisberg May 30, 2020
acfb60e
populate default value for schemas under test
PhilippSalvisberg May 30, 2020
6f5e7cb
test calcuation of default schemas under test
PhilippSalvisberg May 30, 2020
89565a4
add code coverage to toolbar of realtime reporter (all tests)
PhilippSalvisberg May 30, 2020
d589045
use list of schemas instead of top schema as default
PhilippSalvisberg May 30, 2020
84ffaeb
amend test based on new default logic
PhilippSalvisberg May 30, 2020
64cbad0
add code coverage context menu on overview table
PhilippSalvisberg May 30, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add support to run tests with code coverage in one run
  • Loading branch information
PhilippSalvisberg committed May 30, 2020
commit 52847964f7c5edda4ff7f48d0ccc905d4b88e879
89 changes: 70 additions & 19 deletions sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

import javax.swing.JFrame;

import org.utplsql.sqldev.coverage.CodeCoverageReporter;
import org.utplsql.sqldev.dal.RealtimeReporterDao;
import org.utplsql.sqldev.dal.RealtimeReporterEventConsumer;
import org.utplsql.sqldev.model.DatabaseTools;
Expand All @@ -48,26 +49,65 @@
public class UtplsqlRunner implements RealtimeReporterEventConsumer {
private static final Logger logger = Logger.getLogger(UtplsqlRunner.class.getName());

private List<String> pathList;
private final boolean withCodeCoverage;
private final List<String> pathList;
private final List<String> schemaList;
private final List<String> includeObjectList;
private final List<String> excludeObjectList;
private String connectionName;
private Connection producerConn;
private Connection consumerConn;
private final String reporterId = UUID.randomUUID().toString().replace("-", "");
private final String realtimeReporterId = UUID.randomUUID().toString().replace("-", "");
private final String coverageReporterId = UUID.randomUUID().toString().replace("-", "");
private Run run;
private RunnerPanel panel;
private JFrame frame; // for testing purposes only (outside of SQL Developer)
private Thread producerThread;
private Thread consumerThread;

public UtplsqlRunner(final List<String> pathList, final String connectionName) {
this.withCodeCoverage = false;
this.pathList = pathList;
this.schemaList = null;
this.includeObjectList = null;
this.excludeObjectList = null;
setConnection(connectionName);
}

public UtplsqlRunner(final List<String> pathList, final List<String> schemaList,
final List<String> includeObjectList, final List<String> excludeObjectList, final String connectionName) {
this.withCodeCoverage = true;
this.pathList = pathList;
this.schemaList = schemaList;
this.includeObjectList = includeObjectList;
this.excludeObjectList = excludeObjectList;
setConnection(connectionName);
}

/**
* this constructor is intended for tests only
* this constructor is intended for tests only (without code coverage)
*/
public UtplsqlRunner(final List<String> pathList, final Connection producerConn, final Connection consumerConn) {
this.withCodeCoverage = false;
this.pathList = pathList;
this.schemaList = null;
this.includeObjectList = null;
this.excludeObjectList = null;
this.producerConn = producerConn;
this.consumerConn = consumerConn;
}

/**
* this constructor is intended for tests only (with code coverage)
*/
public UtplsqlRunner(final List<String> pathList, final List<String> schemaList,
final List<String> includeObjectList, final List<String> excludeObjectList, final Connection producerConn,
final Connection consumerConn) {
this.withCodeCoverage = true;
this.pathList = pathList;
this.schemaList = schemaList;
this.includeObjectList = includeObjectList;
this.excludeObjectList = excludeObjectList;
this.producerConn = producerConn;
this.consumerConn = consumerConn;
}
Expand All @@ -86,6 +126,9 @@ public void dispose() {
// running in SQL Developer
DatabaseTools.closeConnection(producerConn);
DatabaseTools.closeConnection(consumerConn);
if (frame != null) {
frame.setVisible(false);
}
}

@Override
Expand Down Expand Up @@ -116,7 +159,7 @@ private String getSysdate() {
}

private void initRun() {
run = new Run(reporterId, connectionName, pathList);
run = new Run(realtimeReporterId, connectionName, pathList);
run.setStartTime(getSysdate());
run.getCounter().setDisabled(0);
run.getCounter().setSuccess(0);
Expand All @@ -128,14 +171,14 @@ private void initRun() {
run.setCurrentTestNumber(0);
run.setStatus(UtplsqlResources.getString("RUNNER_INITIALIZING_TEXT"));
panel.setModel(run);
panel.update(reporterId);
panel.update(realtimeReporterId);
}

private void doProcess(final PreRunEvent event) {
run.setTotalNumberOfTests(event.getTotalNumberOfTests());
run.put(event.getItems());
run.setStatus(UtplsqlResources.getString("RUNNER_RUNNING_TEXT"));
panel.update(reporterId);
panel.update(realtimeReporterId);
}

private void doProcess(final PostRunEvent event) {
Expand All @@ -145,7 +188,7 @@ private void doProcess(final PostRunEvent event) {
run.setErrorStack(event.getErrorStack());
run.setServerOutput(event.getServerOutput());
run.setStatus(UtplsqlResources.getString("RUNNER_FINNISHED_TEXT"));
panel.update(reporterId);
panel.update(realtimeReporterId);
}

private void doProcess(final PreSuiteEvent event) {
Expand Down Expand Up @@ -189,7 +232,7 @@ private void doProcess(final PostSuiteEvent event) {
sb.append(event.getServerOutput());
test.setServerOutput(sb.toString());
}
panel.update(reporterId);
panel.update(realtimeReporterId);
}

private void doProcess(final PreTestEvent event) {
Expand All @@ -203,7 +246,7 @@ private void doProcess(final PreTestEvent event) {
run.setStatus(event.getId() + "...");
run.setCurrentTestNumber(event.getTestNumber());
run.setCurrentTest(test);
panel.update(reporterId);
panel.update(realtimeReporterId);
}

private void doProcess(final PostTestEvent event) {
Expand Down Expand Up @@ -234,37 +277,45 @@ private void doProcess(final PostTestEvent event) {
run.getCounter().setSuccess(run.getCounter().getSuccess() + event.getCounter().getSuccess());
run.getCounter().setFailure(run.getCounter().getFailure() + event.getCounter().getFailure());
run.getCounter().setError(run.getCounter().getError() + event.getCounter().getError());
panel.update(reporterId);
panel.update(realtimeReporterId);
}

private void produce() {
try {
logger.fine(() -> "Running utPLSQL tests and producing events via reporter id " + reporterId + "...");
logger.fine(() -> "Running utPLSQL tests and producing events via reporter id " + realtimeReporterId + "...");
final RealtimeReporterDao dao = new RealtimeReporterDao(producerConn);
dao.produceReport(reporterId, pathList);
logger.fine(() -> "All events produced for reporter id " + reporterId + ".");
if (withCodeCoverage) {
dao.produceReportWithCoverage(realtimeReporterId, coverageReporterId, pathList, schemaList, includeObjectList, excludeObjectList);
} else {
dao.produceReport(realtimeReporterId, pathList);
}
logger.fine(() -> "All events produced for reporter id " + realtimeReporterId + ".");
} catch (Exception e) {
logger.severe(() -> "Error while producing events for reporter id " + reporterId + ": "
logger.severe(() -> "Error while producing events for reporter id " + realtimeReporterId + ": "
+ (e != null ? e.getMessage() : "???"));
}
}

private void consume() {
try {
logger.fine(() -> "Consuming events from reporter id " + reporterId + " in realtime...");
logger.fine(() -> "Consuming events from reporter id " + realtimeReporterId + " in realtime...");
final RealtimeReporterDao dao = new RealtimeReporterDao(consumerConn);
dao.consumeReport(reporterId, this);
dao.consumeReport(realtimeReporterId, this);
logger.fine(() -> "All events consumed.");
if (withCodeCoverage) {
String html = dao.getHtmlCoverage(coverageReporterId);
CodeCoverageReporter.openInBrowser(html);
}
} catch (Exception e) {
logger.severe(() -> "Error while consuming events for reporter id " + reporterId + ": "
logger.severe(() -> "Error while consuming events for reporter id " + realtimeReporterId + ": "
+ (e != null ? e.getMessage() : "???"));
}
if (run.getTotalNumberOfTests() < 0) {
run.setStatus(UtplsqlResources.getString("RUNNER_NO_TESTS_FOUND_TEXT"));
run.setExecutionTime(Double.valueOf(System.currentTimeMillis() - Double.valueOf(run.getStart())) / 1000);
run.setEndTime(getSysdate());
run.setTotalNumberOfTests(0);
panel.update(reporterId);
panel.update(realtimeReporterId);
}
if (isRunningInSqlDeveloper()) {
dispose();
Expand All @@ -285,7 +336,7 @@ private boolean initGUI() {
RunnerFactory.showDockable();
panel = dockable.getRunnerPanel();
} else {
final JFrame frame = new JFrame("utPLSQL Runner Panel");
frame = new JFrame("utPLSQL Runner Panel");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new RunnerPanel();
frame.add(panel.getGUI());
Expand Down