#*************************************************************************** # _ _ ____ _ # Project ___| | | | _ \| | # / __| | | | |_) | | # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # # Copyright (C) Daniel Stenberg, , et al. # Copyright (C) Marc Hoersken, # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms # are also available at https://curl.se/docs/copyright.html. # # You may opt to use, copy, modify, merge, publish, distribute and/or sell # copies of the Software, and permit persons to whom the Software is # furnished to do so, under the terms of the COPYING file. # # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY # KIND, either express or implied. # # SPDX-License-Identifier: curl # ########################################################################### package azure; use strict; use warnings; BEGIN { use base qw(Exporter); our @EXPORT = qw( azure_check_environment azure_create_test_run azure_create_test_result azure_update_test_result azure_update_test_run ); } use POSIX qw(strftime); sub azure_check_environment { if(defined $ENV{'AZURE_ACCESS_TOKEN'} && $ENV{'AZURE_ACCESS_TOKEN'} && defined $ENV{'AGENT_JOBNAME'} && $ENV{'BUILD_BUILDID'} && defined $ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'} && defined $ENV{'SYSTEM_TEAMPROJECTID'}) { return 1; } return 0; } sub azure_create_test_run { my ($curl)=@_; my $azure_baseurl="$ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'}$ENV{'SYSTEM_TEAMPROJECTID'}"; my $azure_run=`$curl --silent --noproxy "*" \\ --header "Authorization: Bearer $ENV{'AZURE_ACCESS_TOKEN'}" \\ --header "Content-Type: application/json" \\ --data " { 'name': '$ENV{'AGENT_JOBNAME'}', 'automated': true, 'build': {'id': '$ENV{'BUILD_BUILDID'}'} } " \\ "$azure_baseurl/_apis/test/runs?api-version=5.1"`; if($azure_run =~ /"id":(\d+)/) { return $1; } return ""; } sub azure_create_test_result { my ($curl, $azure_run_id, $testnum, $testname)=@_; $testname =~ s/\\/\\\\/g; $testname =~ s/\"/\\\"/g; $testname =~ s/\'/'"'"'/g; my $title_testnum=sprintf("%04d", $testnum); my $azure_baseurl="$ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'}$ENV{'SYSTEM_TEAMPROJECTID'}"; my $azure_result=`$curl --silent --noproxy '*' \\ --header "Authorization: Bearer $ENV{'AZURE_ACCESS_TOKEN'}" \\ --header 'Content-Type: application/json' \\ --data ' [ { "build": {"id": "$ENV{'BUILD_BUILDID'}"}, "testCase": {"id": $testnum}, "testCaseTitle": "$title_testnum: $testname", "testCaseRevision": 2, "automatedTestName": "curl.tests.$testnum", "outcome": "InProgress" } ] ' \\ '$azure_baseurl/_apis/test/runs/$azure_run_id/results?api-version=5.1'`; if($azure_result =~ /\[\{"id":(\d+)/) { return $1; } return ""; } sub azure_update_test_result { my ($curl, $azure_run_id, $azure_result_id, $testnum, $error, $start, $stop)=@_; if(!defined $stop) { $stop = $start; } my $azure_start = strftime "%Y-%m-%dT%H:%M:%SZ", gmtime $start; my $azure_complete = strftime "%Y-%m-%dT%H:%M:%SZ", gmtime $stop; my $azure_duration = sprintf("%.0f", ($stop-$start)*1000); my $azure_outcome; if($error == 2) { $azure_outcome = 'NotApplicable'; } elsif($error < 0) { $azure_outcome = 'NotExecuted'; } elsif(!$error) { $azure_outcome = 'Passed'; } else { $azure_outcome = 'Failed'; } my $azure_baseurl="$ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'}$ENV{'SYSTEM_TEAMPROJECTID'}"; my $azure_result=`$curl --silent --noproxy '*' --request PATCH \\ --header "Authorization: Bearer $ENV{'AZURE_ACCESS_TOKEN'}" \\ --header "Content-Type: application/json" \\ --data ' [ { "id": $azure_result_id, "outcome": "$azure_outcome", "startedDate": "$azure_start", "completedDate": "$azure_complete", "durationInMs": $azure_duration } ] ' \\ '$azure_baseurl/_apis/test/runs/$azure_run_id/results?api-version=5.1'`; if($azure_result =~ /\[\{"id":(\d+)/) { return $1; } return ""; } sub azure_update_test_run { my ($curl, $azure_run_id)=@_; my $azure_baseurl="$ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'}$ENV{'SYSTEM_TEAMPROJECTID'}"; my $azure_run=`$curl --silent --noproxy '*' --request PATCH \\ --header "Authorization: Bearer $ENV{'AZURE_ACCESS_TOKEN'}" \\ --header 'Content-Type: application/json' \\ --data ' { "state": "Completed" } ' \\ '$azure_baseurl/_apis/test/runs/$azure_run_id?api-version=5.1'`; if($azure_run =~ /"id":(\d+)/) { return $1; } return ""; } 1;