diff --git a/.azure-pipelines/ci-build.yml b/.azure-pipelines/ci-build.yml
index 50407cd50..8a2e7ef18 100644
--- a/.azure-pipelines/ci-build.yml
+++ b/.azure-pipelines/ci-build.yml
@@ -78,16 +78,18 @@ extends:
projects: '$(Build.SourcesDirectory)\Microsoft.OpenApi.sln'
arguments: '--configuration $(BuildConfiguration) --no-build'
- - task: EsrpCodeSigning@2
- displayName: 'ESRP CodeSigning'
+ - task: EsrpCodeSigning@5
inputs:
- ConnectedServiceName: 'microsoftgraph ESRP CodeSign DLL and NuGet (AKV)'
- FolderPath: src
- signConfigType: inlineSignParams
+ ConnectedServiceName: 'Federated DevX ESRP Managed Identity Connection'
+ AppRegistrationClientId: '65035b7f-7357-4f29-bf25-c5ee5c3949f8'
+ AppRegistrationTenantId: 'cdc5aeea-15c5-4db6-b079-fcadd2505dc2'
+ AuthAKVName: 'akv-prod-eastus'
+ AuthCertName: 'ReferenceLibraryPrivateCert'
+ AuthSignCertName: 'ReferencePackagePublisherCertificate'
+ FolderPath: '$(Build.SourcesDirectory)\src'
+ Pattern: '*.dll'
UseMinimatch: true
- Pattern: |
- **\*.exe
- **\*.dll
+ signConfigType: 'inlineSignParams'
inlineOperation: |
[
{
@@ -126,7 +128,10 @@ extends:
"toolVersion": "1.0"
}
]
- SessionTimeout: 20
+ SessionTimeout: '20'
+ MaxConcurrency: '50'
+ MaxRetryAttempts: '5'
+ PendingAnalysisWaitTimeoutMinutes: '5'
# Pack core lib
- pwsh: dotnet pack $(Build.SourcesDirectory)/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj -o $(Build.ArtifactStagingDirectory) --configuration $(BuildConfiguration) --no-build --include-symbols --include-source /p:SymbolPackageFormat=snupkg
@@ -140,32 +145,38 @@ extends:
- pwsh: dotnet pack $(Build.SourcesDirectory)/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj -o $(Build.ArtifactStagingDirectory) --configuration $(BuildConfiguration) --no-build --include-symbols --include-source /p:SymbolPackageFormat=snupkg
displayName: 'pack Hidi'
- - task: EsrpCodeSigning@2
- displayName: 'ESRP CodeSigning Nuget Packages'
+ - task: EsrpCodeSigning@5
inputs:
- ConnectedServiceName: 'microsoftgraph ESRP CodeSign DLL and NuGet (AKV)'
+ ConnectedServiceName: 'Federated DevX ESRP Managed Identity Connection'
+ AppRegistrationClientId: '65035b7f-7357-4f29-bf25-c5ee5c3949f8'
+ AppRegistrationTenantId: 'cdc5aeea-15c5-4db6-b079-fcadd2505dc2'
+ AuthAKVName: 'akv-prod-eastus'
+ AuthCertName: 'ReferenceLibraryPrivateCert'
+ AuthSignCertName: 'ReferencePackagePublisherCertificate'
FolderPath: '$(Build.ArtifactStagingDirectory)'
Pattern: '*.nupkg'
- signConfigType: inlineSignParams
- UseMinimatch: true
+ signConfigType: 'inlineSignParams'
inlineOperation: |
[
- {
- "keyCode": "CP-401405",
- "operationSetCode": "NuGetSign",
- "parameters": [ ],
- "toolName": "sign",
- "toolVersion": "1.0"
- },
- {
- "keyCode": "CP-401405",
- "operationSetCode": "NuGetVerify",
- "parameters": [ ],
- "toolName": "sign",
- "toolVersion": "1.0"
- }
- ]
- SessionTimeout: 20
+ {
+ "keyCode": "CP-401405",
+ "operationSetCode": "NuGetSign",
+ "parameters": [ ],
+ "toolName": "sign",
+ "toolVersion": "1.0"
+ },
+ {
+ "keyCode": "CP-401405",
+ "operationSetCode": "NuGetVerify",
+ "parameters": [ ],
+ "toolName": "sign",
+ "toolVersion": "1.0"
+ }
+ ]
+ SessionTimeout: '60'
+ MaxConcurrency: '50'
+ MaxRetryAttempts: '5'
+ PendingAnalysisWaitTimeoutMinutes: '5'
- task: PowerShell@2
displayName: "Get Hidi's version-number from .csproj"
diff --git a/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj b/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj
index c8af22cb3..b75e7009c 100644
--- a/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj
+++ b/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj
@@ -3,7 +3,7 @@
netstandard2.0
latest
true
- 1.6.17
+ 1.6.18
OpenAPI.NET Readers for JSON and YAML documents
true
diff --git a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj
index b2f09236f..2a674f542 100644
--- a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj
+++ b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj
@@ -3,7 +3,7 @@
netstandard2.0
Latest
true
- 1.6.17
+ 1.6.18
.NET models with JSON and YAML writers for OpenAPI specification
true
diff --git a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs
index 3816fb14f..1ee1ce176 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs
@@ -77,7 +77,10 @@ public void SerializeAsV3(IOpenApiWriter writer)
writer.WriteOptionalObject(OpenApiConstants.Example, Example, (w, e) => w.WriteAny(e));
// examples
- SerializeExamples(writer, Examples);
+ if (Examples != null && Examples.Any())
+ {
+ SerializeExamples(writer, Examples);
+ }
// encoding
writer.WriteOptionalMap(OpenApiConstants.Encoding, Encoding, (w, e) => e.SerializeAsV3(w));
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs
index 168ec3ade..c9807f5a2 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs
@@ -1,6 +1,7 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
+using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
@@ -1670,27 +1671,6 @@ private static OpenApiDocument ParseInputFile(string filePath)
return openApiDoc;
}
- //[Fact]
- //public void CopyConstructorForAdvancedDocumentWorks()
- //{
- // // Arrange & Act
- // var doc = new OpenApiDocument(AdvancedDocument);
-
- // var docOpId = doc.Paths["/pets"].Operations[OperationType.Get].OperationId = "findAllMyPets";
- // var advancedDocOpId = AdvancedDocument.Paths["/pets"].Operations[OperationType.Get].OperationId;
- // var responseSchemaTypeCopy = doc.Paths["/pets"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema.Type = "object";
- // var advancedDocResponseSchemaType = AdvancedDocument.Paths["/pets"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema.Type;
-
- // // Assert
- // Assert.NotNull(doc.Info);
- // Assert.NotNull(doc.Servers);
- // Assert.NotNull(doc.Paths);
- // Assert.Equal(2, doc.Paths.Count);
- // Assert.NotNull(doc.Components);
- // Assert.NotEqual(docOpId, advancedDocOpId);
- // Assert.NotEqual(responseSchemaTypeCopy, advancedDocResponseSchemaType);
- //}
-
[Fact]
public void SerializeV2DocumentWithNonArraySchemaTypeDoesNotWriteOutCollectionFormat()
{
@@ -1858,5 +1838,38 @@ public void OpenApiDocumentCopyConstructorWithAnnotationsSucceeds()
Assert.NotEqual(baseDocument.Annotations["key1"], actualDocument.Annotations["key1"]);
}
- }
+
+ [Fact]
+ public void SerializeExamplesDoesNotThrowNullReferenceException()
+ {
+ OpenApiDocument doc = new OpenApiDocument
+ {
+ Paths = new OpenApiPaths
+ {
+ ["test"] = new OpenApiPathItem()
+ {
+ Operations = new Dictionary()
+ {
+ [OperationType.Post] = new OpenApiOperation
+ {
+ RequestBody = new OpenApiRequestBody()
+ {
+ Content =
+ {
+ ["application/json"] = new OpenApiMediaType()
+ {
+ Examples = null,
+ },
+ }
+ }
+ },
+ }
+ },
+ }
+ };
+
+ OpenApiJsonWriter apiWriter = new OpenApiJsonWriter(new StringWriter());
+ doc.Invoking(d => d.SerializeAsV3(apiWriter)).Should().NotThrow();
+ }
+ }
}