Skip to content
This repository has been archived by the owner on Nov 4, 2024. It is now read-only.

Implement loadArtifacts method and stop fetchRun from loading run artifacts by default #273

Merged
merged 2 commits into from
Sep 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ private CouchdbRasFileSystemProvider createFileSystemProvider() {
return new CouchdbRasFileSystemProvider(fileStore, store, logFactory);
}

private Path getRunArtifactPath(TestStructureCouchdb ts) throws CouchdbRasException {
public Path getRunArtifactPath(TestStructureCouchdb ts) throws CouchdbRasException {
CouchdbRasFileSystemProvider runProvider = createFileSystemProvider();
if (ts.getArtifactRecordIds() == null || ts.getArtifactRecordIds().isEmpty()) {
return runProvider.getRoot();
Expand Down Expand Up @@ -184,17 +184,7 @@ private Path getRunArtifactPath(TestStructureCouchdb ts) throws CouchdbRasExcept
}

private CouchdbRunResult fetchRun(String id) throws ParseException, IOException, ResultArchiveStoreException {
CouchdbRunResult runResult = fetchRunWithoutArtifacts(id);
TestStructureCouchdb testStructure = (TestStructureCouchdb) runResult.getTestStructure();

// Populate the run's artifacts filesystem
Path runArtifactPath = getRunArtifactPath(testStructure);

runResult = new CouchdbRunResult(store, testStructure, runArtifactPath);
return runResult;
}

private CouchdbRunResult fetchRunWithoutArtifacts(String id) throws ParseException, IOException, CouchdbRasException {
CouchdbRunResult runResult = null;
HttpGet httpGet = requestFactory.getHttpGetRequest(store.getCouchdbUri() + "/" + CouchdbRasStore.RUNS_DB + "/" + id);

try (CloseableHttpResponse response = store.getHttpClient().execute(httpGet)) {
Expand All @@ -207,10 +197,9 @@ private CouchdbRunResult fetchRunWithoutArtifacts(String id) throws ParseExcepti
String responseEntity = EntityUtils.toString(entity);
TestStructureCouchdb ts = store.getGson().fromJson(responseEntity, TestStructureCouchdb.class);

// *** Add this run to the results
CouchdbRunResult cdbrr = new CouchdbRunResult(store, ts, createFileSystemProvider().getRoot());
return cdbrr;
runResult = new CouchdbRunResult(store, ts, logFactory);
}
return runResult;
}

@Override
Expand Down Expand Up @@ -375,11 +364,10 @@ private RasRunResultPage getRunsPageFromCouchdb(HttpPost httpPost, Find query) t

for (TestStructureCouchdb ts : found.docs) {
if (ts.isValid()) {
// Don't load the artifacts for the found runs, just set a root location for artifacts
CouchdbRasFileSystemProvider runProvider = createFileSystemProvider();

// Add this run to the results
runs.add(new CouchdbRunResult(store, ts, runProvider.getRoot()));
// Don't load the artifacts for the found runs, just set a root location for artifacts
// and add this run to the results
runs.add(new CouchdbRunResult(store, ts, logFactory));
}
}

Expand Down Expand Up @@ -442,21 +430,14 @@ private JsonArray buildQuerySortJson(@NotNull RasSortField primarySort) {
return runs;
}

public void discardRun(String id) throws ResultArchiveStoreException {
public void discardRun(@NotNull TestStructureCouchdb runTestStructure) throws ResultArchiveStoreException {
try {
CouchdbRunResult run = fetchRunWithoutArtifacts(id);
if (run == null) {
logger.info("Run with ID " + id + " does not exist or has already been discarded");
} else {
TestStructureCouchdb testStructure = (TestStructureCouchdb) run.getTestStructure();

discardRunLogs(testStructure.getLogRecordIds());
discardRunArtifacts(testStructure.getArtifactRecordIds());

discardRecord(CouchdbRasStore.RUNS_DB, id, testStructure._rev);
}
} catch (CouchdbRasException | ParseException | IOException e) {
throw new ResultArchiveStoreException("Failed to discard run: " + id, e);
discardRunLogs(runTestStructure.getLogRecordIds());
discardRunArtifacts(runTestStructure.getArtifactRecordIds());

discardRecord(CouchdbRasStore.RUNS_DB, runTestStructure._id, runTestStructure._rev);
} catch (CouchdbRasException | ParseException e) {
throw new ResultArchiveStoreException("Failed to discard run: " + runTestStructure._id, e);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,32 @@

import java.nio.file.Path;

import dev.galasa.extensions.common.api.LogFactory;
import dev.galasa.framework.spi.IRunResult;
import dev.galasa.framework.spi.ResultArchiveStoreException;
import dev.galasa.framework.spi.ras.ResultArchiveStoreFileStore;
import dev.galasa.framework.spi.teststructure.TestStructure;
import dev.galasa.ras.couchdb.internal.pojos.TestStructureCouchdb;

public class CouchdbRunResult implements IRunResult {

private final TestStructureCouchdb testStructure;
private final Path path;
private final CouchdbRasStore store;
private final CouchdbDirectoryService storeService;
private Path path;

public CouchdbRunResult(CouchdbRasStore store, TestStructureCouchdb testStructure, Path path) {
public CouchdbRunResult(CouchdbRasStore store, TestStructureCouchdb testStructure, LogFactory logFactory) {
this.store = store;
this.storeService = (CouchdbDirectoryService) store.getDirectoryServices().get(0);
eamansour marked this conversation as resolved.
Show resolved Hide resolved
if (testStructure == null) {
this.testStructure = new TestStructureCouchdb();
} else {
this.testStructure = testStructure;
}
this.path = path;

// Create an empty artifact filesystem and set the artifacts path to the root of this filesystem
ResultArchiveStoreFileStore fileStore = new ResultArchiveStoreFileStore();
this.path = new CouchdbRasFileSystemProvider(fileStore, store, logFactory).getRoot();
}

@Override
Expand All @@ -45,13 +52,17 @@ public String getLog() throws ResultArchiveStoreException {

@Override
public void discard() throws ResultArchiveStoreException {
CouchdbDirectoryService storeService = (CouchdbDirectoryService) store.getDirectoryServices().get(0);
storeService.discardRun(this.testStructure._id);
storeService.discardRun(this.testStructure);
}

@Override
public String getRunId() {
return "cdb-" + this.testStructure._id;
}

@Override
public void loadArtifacts() throws ResultArchiveStoreException {
this.path = storeService.getRunArtifactPath(this.testStructure);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,7 @@ public void testGetRunsPageWithNilBookmarkReturnsPageWithNoNextCursor() throws E
public void testDiscardRunDeletesRunOk() throws Exception {
// Given...
String runId = "ABC123";
TestStructureCouchdb mockRun1 = createRunTestStructure("run1");
TestStructureCouchdb mockRun1 = createRunTestStructure(runId);

IdRev mockIdRev = new IdRev();
String revision = "this-is-a-revision";
Expand All @@ -584,10 +584,7 @@ public void testDiscardRunDeletesRunOk() throws Exception {
String runDbUri = baseUri + "/" + CouchdbRasStore.RUNS_DB + "/" + runId;
String artifactsDbUri = baseUri + "/" + CouchdbRasStore.ARTIFACTS_DB;
String logsDbUri = baseUri + "/" + CouchdbRasStore.LOG_DB;
List<HttpInteraction> interactions = List.of(
// Fetch the run to be deleted
new GetRunByIdFromCouchdbInteraction(runDbUri, HttpStatus.SC_OK, mockRun1),

List<HttpInteraction> interactions = List.of(
// Start discarding the run's log records
new GetDocumentByIdFromCouchdbInteraction(logsDbUri + "/" + logId1, HttpStatus.SC_OK, mockIdRev),
new DeleteDocumentFromCouchdbInteraction(logsDbUri + "/" + logId1 + "?rev=" + revision, HttpStatus.SC_OK),
Expand All @@ -609,7 +606,7 @@ public void testDiscardRunDeletesRunOk() throws Exception {
CouchdbDirectoryService directoryService = new CouchdbDirectoryService(mockRasStore, mockLogFactory, new HttpRequestFactoryImpl());

// When...
directoryService.discardRun(runId);
directoryService.discardRun(mockRun1);

// Then...
// The assertions in the interactions should not have failed
Expand All @@ -619,7 +616,7 @@ public void testDiscardRunDeletesRunOk() throws Exception {
public void testDiscardRunWithNoArtifactsDeletesRunOk() throws Exception {
// Given...
String runId = "ABC123";
TestStructureCouchdb mockRun1 = createRunTestStructure("run1");
TestStructureCouchdb mockRun1 = createRunTestStructure(runId);

IdRev mockIdRev = new IdRev();
String revision = "this-is-a-revision";
Expand All @@ -636,9 +633,6 @@ public void testDiscardRunWithNoArtifactsDeletesRunOk() throws Exception {
String runDbUri = baseUri + "/" + CouchdbRasStore.RUNS_DB + "/" + runId;
String logsDbUri = baseUri + "/" + CouchdbRasStore.LOG_DB;
List<HttpInteraction> interactions = List.of(
// Fetch the run to be deleted
new GetRunByIdFromCouchdbInteraction(runDbUri, HttpStatus.SC_OK, mockRun1),

// Start discarding the run's log records
new GetDocumentByIdFromCouchdbInteraction(logsDbUri + "/" + logId1, HttpStatus.SC_OK, mockIdRev),
new DeleteDocumentFromCouchdbInteraction(logsDbUri + "/" + logId1 + "?rev=" + revision, HttpStatus.SC_OK),
Expand All @@ -654,7 +648,7 @@ public void testDiscardRunWithNoArtifactsDeletesRunOk() throws Exception {
CouchdbDirectoryService directoryService = new CouchdbDirectoryService(mockRasStore, mockLogFactory, new HttpRequestFactoryImpl());

// When...
directoryService.discardRun(runId);
directoryService.discardRun(mockRun1);

// Then...
// The assertions in the interactions should not have failed
Expand All @@ -664,14 +658,11 @@ public void testDiscardRunWithNoArtifactsDeletesRunOk() throws Exception {
public void testDiscardRunWithNoArtifactsAndLogsDeletesRunOk() throws Exception {
// Given...
String runId = "ABC123";
TestStructureCouchdb mockRun1 = createRunTestStructure("run1");
TestStructureCouchdb mockRun1 = createRunTestStructure(runId);

String baseUri = "http://my.uri";
String runDbUri = baseUri + "/" + CouchdbRasStore.RUNS_DB + "/" + runId;
List<HttpInteraction> interactions = List.of(
// Fetch the run to be deleted
new GetRunByIdFromCouchdbInteraction(runDbUri, HttpStatus.SC_OK, mockRun1),

// Delete the record of the run
new DeleteDocumentFromCouchdbInteraction(runDbUri + "?rev=" + mockRun1._rev, HttpStatus.SC_OK)
);
Expand All @@ -681,7 +672,7 @@ public void testDiscardRunWithNoArtifactsAndLogsDeletesRunOk() throws Exception
CouchdbDirectoryService directoryService = new CouchdbDirectoryService(mockRasStore, mockLogFactory, new HttpRequestFactoryImpl());

// When...
directoryService.discardRun(runId);
directoryService.discardRun(mockRun1);

// Then...
// The assertions in the interactions should not have failed
Expand All @@ -691,14 +682,11 @@ public void testDiscardRunWithNoArtifactsAndLogsDeletesRunOk() throws Exception
public void testDiscardRunWithCouchdbServerErrorThrowsCorrectError() throws Exception {
// Given...
String runId = "ABC123";
TestStructureCouchdb mockRun1 = createRunTestStructure("run1");
TestStructureCouchdb mockRun1 = createRunTestStructure(runId);

String baseUri = "http://my.uri";
String runDbUri = baseUri + "/" + CouchdbRasStore.RUNS_DB + "/" + runId;
List<HttpInteraction> interactions = List.of(
// Fetch the run to be deleted
new GetRunByIdFromCouchdbInteraction(runDbUri, HttpStatus.SC_OK, mockRun1),

// Delete the record of the run
new DeleteDocumentFromCouchdbInteraction(runDbUri + "?rev=" + mockRun1._rev, HttpStatus.SC_INTERNAL_SERVER_ERROR)
);
Expand All @@ -709,36 +697,12 @@ public void testDiscardRunWithCouchdbServerErrorThrowsCorrectError() throws Exce

// When...
ResultArchiveStoreException thrown = catchThrowableOfType(() -> {
directoryService.discardRun(runId);
directoryService.discardRun(mockRun1);
}, ResultArchiveStoreException.class);

// Then...
// The assertions in the interactions should not have failed
assertThat(thrown).isNotNull();
assertThat(thrown.getMessage()).contains("Unable to delete run", runId);
}

@Test
public void testDiscardRunWithNonExistantRunDoesNotThrowError() throws Exception {
// Given...
String runId = "ABC123";
TestStructureCouchdb mockRun1 = createRunTestStructure("run1");

String baseUri = "http://my.uri";
String runDbUri = baseUri + "/" + CouchdbRasStore.RUNS_DB + "/" + runId;
List<HttpInteraction> interactions = List.of(
new GetRunByIdFromCouchdbInteraction(runDbUri, HttpStatus.SC_INTERNAL_SERVER_ERROR, mockRun1)
);

MockLogFactory mockLogFactory = new MockLogFactory();
CouchdbRasStore mockRasStore = fixtures.createCouchdbRasStore(interactions, mockLogFactory);
CouchdbDirectoryService directoryService = new CouchdbDirectoryService(mockRasStore, mockLogFactory, new HttpRequestFactoryImpl());

// When...
directoryService.discardRun(runId);

// Then...
// The assertions in the interactions should not have failed
assertThat(mockLogFactory.toString()).contains(runId, "does not exist or has already been discarded");
}
}