Skip to content

Commit

Permalink
(feature) Adding ability to specify attachment in Node script command…
Browse files Browse the repository at this point in the history
… line and starting on Gradle plugin attachment publishing
  • Loading branch information
craigatk committed Feb 28, 2020
1 parent a3785d2 commit 7a7f2c4
Show file tree
Hide file tree
Showing 57 changed files with 437 additions and 3,898 deletions.
6 changes: 0 additions & 6 deletions .github/workflows/node-script-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,6 @@ jobs:
yarn test
yarn projektor-publish
- name: node-script CLI project test
run: |
cd publishers/node-script/test-projects/node-script-cli
yarn install
yarn test
node-script-functional-test:
runs-on: ubuntu-18.04
services:
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.2.1-bin.zip
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class ProjectTestResultsCollector {
List<String> additionalResultsDirs,
Logger logger
) {
Collection<Test> allTestTasks = allTasks.findAll { it instanceof Test }
Collection<Test> allTestTasks = allTasks.findAll { it instanceof Test } as Collection<Test>
Collection<TestTaskGroup> testGroups = allTestTasks.collect { TestTaskGroup.fromTask(it) }
Collection<TestDirectoryGroup> additionalTestGroups = TestDirectoryGroup.listFromDirPaths(
projectDir,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,35 @@
package projektor.plugin

import okhttp3.OkHttpClient
import org.gradle.BuildListener
import org.gradle.BuildResult
import org.gradle.api.initialization.Settings
import org.gradle.api.invocation.Gradle
import org.gradle.api.logging.Logger
import projektor.plugin.results.ProjektorResultsClient
import projektor.plugin.results.ResultsClientConfig
import projektor.plugin.results.ResultsClient
import projektor.plugin.client.ClientConfig
import projektor.plugin.results.ResultsLogger
import projektor.plugin.results.grouped.GroupedResults

class ProjektorBuildFinishedListener implements BuildListener {

private final ResultsClientConfig resultsClientConfig
private final ClientConfig clientConfig
private final Logger logger
private final boolean publishOnFailureOnly
private final File projectDir
private final List<String> additionalResultsDirs
private final ProjektorTaskFinishedListener projektorTaskFinishedListener
private final OkHttpClient okHttpClient = new OkHttpClient()

ProjektorBuildFinishedListener(
ResultsClientConfig resultsClientConfig,
ClientConfig clientConfig,
Logger logger,
boolean publishOnFailureOnly,
File projectDir,
List<String> additionalResultsDirs,
ProjektorTaskFinishedListener projektorTaskFinishedListener
) {
this.resultsClientConfig = resultsClientConfig
this.clientConfig = clientConfig
this.logger = logger
this.publishOnFailureOnly = publishOnFailureOnly
this.projectDir = projectDir
Expand Down Expand Up @@ -58,7 +60,7 @@ class ProjektorBuildFinishedListener implements BuildListener {
"${projectTestResultsCollector.testGroupsCount()} test tasks")
GroupedResults groupedResults = projectTestResultsCollector.createGroupedResults()

ProjektorResultsClient resultsClient = new ProjektorResultsClient(resultsClientConfig, logger)
ResultsClient resultsClient = new ResultsClient(okHttpClient, clientConfig, logger)
PublishResult publishResult = resultsClient.sendResultsToServer(groupedResults)

new ResultsLogger(logger).logReportResults(publishResult)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package projektor.plugin

import okhttp3.OkHttpClient
import org.gradle.api.internal.AbstractTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.TaskAction
import projektor.plugin.results.ProjektorResultsClient
import projektor.plugin.results.ResultsClientConfig
import projektor.plugin.results.ResultsClient
import projektor.plugin.client.ClientConfig
import projektor.plugin.results.ResultsLogger
import projektor.plugin.results.grouped.GroupedResults

Expand All @@ -24,18 +25,20 @@ class ProjektorManualPublishTask extends AbstractTask {

@TaskAction
void publish() {
File projectDir = project.projectDir
ProjectTestResultsCollector projectTestTaskResultsCollector = ProjectTestResultsCollector.fromAllTasks(
project.getAllTasks(false).get(project),
project.projectDir,
projectDir,
additionalResultsDirs,
logger
)

if (projectTestTaskResultsCollector.hasTestGroups()) {
GroupedResults groupedResults = projectTestTaskResultsCollector.createGroupedResults()

ProjektorResultsClient resultsClient = new ProjektorResultsClient(
new ResultsClientConfig(serverUrl, java.util.Optional.ofNullable(publishToken)),
ResultsClient resultsClient = new ResultsClient(
new OkHttpClient(),
new ClientConfig(serverUrl, java.util.Optional.ofNullable(publishToken)),
logger
)
PublishResult publishResult = resultsClient.sendResultsToServer(groupedResults)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package projektor.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.logging.Logger
import projektor.plugin.results.ResultsClientConfig
import projektor.plugin.client.ClientConfig

class ProjektorPublishPlugin implements Plugin<Project> {
private static final String LISTENER_APPLIED_PROPERTY_NAME = "projektorListenerApplied"
Expand Down Expand Up @@ -49,7 +49,7 @@ class ProjektorPublishPlugin implements Plugin<Project> {
project.gradle.taskGraph.addTaskExecutionListener(projektorTaskFinishedListener)

ProjektorBuildFinishedListener projektorBuildFinishedListener = new ProjektorBuildFinishedListener(
new ResultsClientConfig(extension.serverUrl, Optional.ofNullable(extension.publishToken)),
new ClientConfig(extension.serverUrl, Optional.ofNullable(extension.publishToken)),
logger,
extension.autoPublishOnFailureOnly,
project.projectDir,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package projektor.plugin

class PublishResult {
String reportUrl
String publicId

boolean isSuccessful() {
reportUrl != null
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package projektor.plugin.attachments

import okhttp3.MediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody
import okhttp3.Response
import org.gradle.api.logging.Logger
import projektor.plugin.client.ClientConfig

import static projektor.plugin.client.ClientToken.conditionallyAddPublishTokenToRequest

class AttachmentsClient {
private final OkHttpClient client
private final ClientConfig config
private final Logger logger

AttachmentsClient(OkHttpClient client, ClientConfig clientConfig, Logger logger) {
this.client = client
this.config = clientConfig
this.logger = logger
}

void sendAttachmentToServer(String publicId, File attachment) {
MediaType mediaType = MediaType.get("octet/stream")

RequestBody body = RequestBody.create(mediaType, attachment.bytes)

String attachmentUrl = "${config.serverUrl}/run/${publicId}/attachments/${attachment.name}"
Request.Builder requestBuilder = new Request.Builder()
.url(attachmentUrl)
.post(body)
conditionallyAddPublishTokenToRequest(requestBuilder, config)
Request request = requestBuilder.build()

Response response = null

try {
response = client.newCall(request).execute()
} catch (Exception e) {
logger.error("Error uploading attachment to Projektor ${attachmentUrl}", e)
}

if (!response?.successful) {
String responseCode = response ? "- response code ${response.code()}" : ""
logger.warn("Failed to upload attachment to Projektor report ${attachmentUrl} ${responseCode}")
}
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package projektor.plugin.results
package projektor.plugin.client

class ResultsClientConfig {
class ClientConfig {
final String serverUrl
final Optional<String> maybePublishToken

ResultsClientConfig(String serverUrl, Optional<String> maybePublishToken) {
ClientConfig(String serverUrl, Optional<String> maybePublishToken) {
this.serverUrl = serverUrl
this.maybePublishToken = maybePublishToken
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package projektor.plugin.client

import okhttp3.Request

class ClientToken {
static final String PUBLISH_TOKEN_NAME = "X-PROJEKTOR-TOKEN"

static void conditionallyAddPublishTokenToRequest(Request.Builder requestBuilder, ClientConfig config) {
config.maybePublishToken.ifPresent( { publishToken -> requestBuilder.header(PUBLISH_TOKEN_NAME, publishToken)})
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,21 @@ import okhttp3.RequestBody
import okhttp3.Response
import org.gradle.api.logging.Logger
import projektor.plugin.PublishResult
import projektor.plugin.client.ClientConfig
import projektor.plugin.results.grouped.GroupedResults
import projektor.plugin.results.grouped.GroupedResultsSerializer

class ProjektorResultsClient {
static final String PUBLISH_TOKEN_NAME = "X-PROJEKTOR-TOKEN"
import static projektor.plugin.client.ClientToken.conditionallyAddPublishTokenToRequest

private final ResultsClientConfig config
class ResultsClient {
private final ClientConfig config
private final Logger logger
private final GroupedResultsSerializer groupedResultsSerializer = new GroupedResultsSerializer()
private final OkHttpClient client

ProjektorResultsClient(ResultsClientConfig resultsClientConfig, Logger logger) {
this.config = resultsClientConfig
ResultsClient(OkHttpClient client, ClientConfig clientConfig, Logger logger) {
this.client = client
this.config = clientConfig
this.logger = logger
}

Expand All @@ -30,15 +33,14 @@ class ProjektorResultsClient {

String groupedResultsJson = groupedResultsSerializer.serializeGroupedResults(groupedResults)

OkHttpClient client = new OkHttpClient()

RequestBody body = RequestBody.create(mediaType, groupedResultsJson)

String resultsUrl = "${config.serverUrl}/groupedResults"
Request.Builder requestBuilder = new Request.Builder()
.url("${config.serverUrl}/groupedResults")
.url(resultsUrl)
.post(body)

config.maybePublishToken.ifPresent( { publishToken -> requestBuilder.header(PUBLISH_TOKEN_NAME, publishToken)})
conditionallyAddPublishTokenToRequest(requestBuilder, config)

Request request = requestBuilder.build()

Expand All @@ -47,17 +49,19 @@ class ProjektorResultsClient {
try {
response = client.newCall(request).execute()
} catch (Exception e) {
logger.error("Error publishing results to Projektor server ${config.serverUrl}", e)
logger.error("Error publishing results to Projektor server ${resultsUrl}", e)
}

if (response?.successful) {
String testRunUri = new JsonSlurper().parseText(response.body().string()).uri
def parsedResponseJson = new JsonSlurper().parseText(response.body().string())
String testRunUri = parsedResponseJson.uri
String reportUrl = "${config.serverUrl}${testRunUri}"

publishResult.publicId= parsedResponseJson.id
publishResult.reportUrl = reportUrl
} else {
String responseCode = response ? "- response code ${response.code()}" : ""
logger.warn("Failed to upload Projektor report to ${config.serverUrl} ${responseCode}")
logger.warn("Failed to upload Projektor report to ${resultsUrl} ${responseCode}")
}

return publishResult
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package projektor.plugin

import com.github.tomakehurst.wiremock.WireMockServer
import com.github.tomakehurst.wiremock.verification.LoggedRequest

import static com.github.tomakehurst.wiremock.client.WireMock.aResponse
import static com.github.tomakehurst.wiremock.client.WireMock.post
import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo
import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching

class AttachmentsWireMockStubber extends WireMockStubber {
AttachmentsWireMockStubber(WireMockServer wireMockServer) {
super(wireMockServer)
}

void stubAttachmentPostSuccess(String publicId, String attachmentName) {
wireMockServer.stubFor(post(urlEqualTo("/run/${publicId}/attachments/${attachmentName}")).willReturn(aResponse()
.withStatus(200)))
}

List<LoggedRequest> findAttachmentsRequests(String publicId) {
wireMockServer.findRequestsMatching(
postRequestedFor(urlMatching("/run/${publicId}/attachments/.*")).build()
).requests
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package projektor.plugin

import com.github.tomakehurst.wiremock.WireMockServer
import com.github.tomakehurst.wiremock.http.Fault
import com.github.tomakehurst.wiremock.verification.LoggedRequest

import static com.github.tomakehurst.wiremock.client.WireMock.aResponse
import static com.github.tomakehurst.wiremock.client.WireMock.post
import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo

class ResultsWireMockStubber extends WireMockStubber {
ResultsWireMockStubber(WireMockServer wireMockServer) {
super(wireMockServer)
}

void stubResultsPostSuccess(String resultsId) {
wireMockServer.stubFor(post(urlEqualTo("/groupedResults")).willReturn(aResponse()
.withStatus(200)
.withBody("""{"id": "${resultsId}", "uri": "/tests/${resultsId}"}""")))
}

void stubResultsPostFailure(int statusCode) {
wireMockServer.stubFor(post(urlEqualTo("/groupedResults")).willReturn(aResponse()
.withStatus(statusCode)))
}

void stubResultsNetworkingError() {
wireMockServer.stubFor(post(urlEqualTo("/groupedResults")).willReturn(aResponse()
.withFault(Fault.CONNECTION_RESET_BY_PEER)
))
}

List<LoggedRequest> findResultsRequests() {
wireMockServer.findRequestsMatching(
postRequestedFor(urlEqualTo("/groupedResults")).build()
).requests
}
}
Loading

0 comments on commit 7a7f2c4

Please sign in to comment.