1
1
using System ;
2
+ using System . Linq ;
2
3
using System . Net . Http ;
3
4
using System . Threading . Tasks ;
5
+ using Docker . DotNet ;
6
+ using Docker . DotNet . Models ;
4
7
using DotNet . Testcontainers . Builders ;
5
8
using DotNet . Testcontainers . Containers ;
6
9
using ManagedCode . Database . Core ;
7
10
using ManagedCode . Database . Cosmos ;
8
11
using ManagedCode . Database . Tests . Common ;
9
12
using Microsoft . Azure . Cosmos ;
13
+ using Xunit ;
10
14
11
15
namespace ManagedCode . Database . Tests . TestContainers ;
12
16
13
- public class CosmosTestContainer : ITestContainer < string , TestCosmosItem >
17
+ [ CollectionDefinition ( nameof ( CosmosTestContainer ) ) ]
18
+ public class CosmosTestContainer : ITestContainer < string , TestCosmosItem > ,
19
+ ICollectionFixture < CosmosTestContainer > , IDisposable
14
20
{
21
+ private readonly TestcontainersContainer _cosmosTestContainer ;
15
22
private CosmosDatabase _database ;
16
- private readonly TestcontainersContainer _cosmosContainer ;
23
+ private DockerClient _dockerClient ;
24
+ private const string containerName = "cosmosContainer" ;
25
+ private const ushort privatePort = 8081 ;
26
+ private bool containerExsist = false ;
27
+ private string containerId ;
17
28
18
29
public CosmosTestContainer ( )
19
30
{
20
- // Docker container for cosmos db is not working at all, to test database use local windows emulator
21
- _cosmosContainer = new TestcontainersBuilder < TestcontainersContainer > ( )
31
+ _cosmosTestContainer = new TestcontainersBuilder < TestcontainersContainer > ( )
22
32
. WithImage ( "mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator" )
23
- . WithName ( $ "azure-cosmos-emulator{ Guid . NewGuid ( ) . ToString ( "N" ) } ")
24
- // .WithExposedPort(8081)
25
- // .WithExposedPort(10250)
26
- // .WithExposedPort(10251)
27
- // .WithExposedPort(10252)
28
- // .WithExposedPort(10253)
29
- // .WithExposedPort(10254)
30
- // .WithExposedPort(10255)
33
+ . WithName ( containerName )
31
34
. WithExposedPort ( 8081 )
35
+ . WithExposedPort ( 10251 )
36
+ . WithExposedPort ( 10252 )
37
+ . WithExposedPort ( 10253 )
38
+ . WithExposedPort ( 10254 )
39
+ . WithExposedPort ( 10255 )
32
40
. WithPortBinding ( 8081 , 8081 )
33
- . WithPortBinding ( 10250 , 10250 )
34
41
. WithPortBinding ( 10251 , 10251 )
35
42
. WithPortBinding ( 10252 , 10252 )
36
43
. WithPortBinding ( 10253 , 10253 )
37
44
. WithPortBinding ( 10254 , 10254 )
38
- . WithPortBinding ( 10255 , 10255 )
45
+ . WithPortBinding ( 8081 , 8081 )
39
46
. WithEnvironment ( "AZURE_COSMOS_EMULATOR_PARTITION_COUNT" , "1" )
40
47
. WithEnvironment ( "AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE" , "127.0.0.1" )
41
48
. WithEnvironment ( "AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE" , "false" )
42
- // .WithCleanUp(true )
49
+ . WithCleanUp ( false )
43
50
. WithWaitStrategy ( Wait . ForUnixContainer ( )
44
- . UntilPortIsAvailable ( 8081 ) )
51
+ . UntilPortIsAvailable ( privatePort ) )
45
52
. Build ( ) ;
53
+
54
+ _dockerClient = new DockerClientConfiguration ( ) . CreateClient ( ) ;
46
55
}
47
56
48
57
public IDatabaseCollection < string , TestCosmosItem > Collection =>
@@ -55,28 +64,56 @@ public string GenerateId()
55
64
56
65
public async Task InitializeAsync ( )
57
66
{
58
- await _cosmosContainer . StartAsync ( ) ;
59
- Console . WriteLine ( $ "Cosmos container State:{ _cosmosContainer . State } ") ;
67
+ ushort publicPort = privatePort ;
68
+
69
+ try
70
+ {
71
+ await _cosmosTestContainer . StartAsync ( ) ;
72
+
73
+ containerExsist = false ;
74
+ }
75
+ catch ( Exception ex ) //TODO catch name already using exception
76
+ {
77
+ containerExsist = true ;
78
+ }
79
+
80
+ if ( ! containerExsist )
81
+ {
82
+ publicPort = _cosmosTestContainer . GetMappedPublicPort ( privatePort ) ;
83
+ containerId = _cosmosTestContainer . Id ;
84
+ }
85
+ else
86
+ {
87
+ var listContainers = await _dockerClient . Containers . ListContainersAsync ( new ContainersListParameters ( ) ) ;
88
+
89
+ ContainerListResponse containerListResponse = listContainers . FirstOrDefault ( container => container . Names . Contains ( $ "/{ containerName } ") ) ;
90
+
91
+ if ( containerListResponse != null )
92
+ {
93
+ publicPort = containerListResponse . Ports . Single ( port => port . PrivatePort == privatePort ) . PublicPort ;
94
+
95
+ containerId = containerListResponse . ID ;
96
+ }
97
+ }
98
+
99
+ var httpMessageHandler = new HttpClientHandler ( )
100
+ {
101
+ ServerCertificateCustomValidationCallback = HttpClientHandler . DangerousAcceptAnyServerCertificateValidator
102
+ } ;
103
+
104
+
60
105
_database = new CosmosDatabase ( new CosmosOptions
61
106
{
62
107
ConnectionString =
63
- $ "AccountEndpoint=https://localhost:{ _cosmosContainer . GetMappedPublicPort ( 8081 ) } /;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",
108
+ $ "AccountEndpoint=https://localhost:{ publicPort } /;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",
64
109
DatabaseName = "database" ,
65
- CollectionName = "testContainer" ,
110
+ CollectionName = $ "testContainer",
66
111
AllowTableCreation = true ,
67
112
CosmosClientOptions = new CosmosClientOptions ( )
68
113
{
69
- HttpClientFactory = ( ) =>
70
- {
71
- HttpMessageHandler httpMessageHandler = new HttpClientHandler ( )
72
- {
73
- ServerCertificateCustomValidationCallback = ( _ , _ , _ , _ ) => true
74
- } ;
75
-
76
- return new HttpClient ( httpMessageHandler ) ;
77
- } ,
114
+ HttpClientFactory = ( ) => new HttpClient ( httpMessageHandler ) ,
78
115
ConnectionMode = ConnectionMode . Gateway ,
79
- RequestTimeout = TimeSpan . FromMinutes ( 3 )
116
+ // RequestTimeout = TimeSpan.FromMinutes(3)
80
117
} ,
81
118
} ) ;
82
119
@@ -86,9 +123,20 @@ public async Task InitializeAsync()
86
123
87
124
public async Task DisposeAsync ( )
88
125
{
126
+ // await _database.DeleteAsync();
89
127
await _database . DisposeAsync ( ) ;
90
- await _cosmosContainer . StopAsync ( ) ;
91
- await _cosmosContainer . CleanUpAsync ( ) ;
92
- Console . WriteLine ( $ "Cosmos container State:{ _cosmosContainer . State } ") ;
128
+
129
+ /* _testOutputHelper.WriteLine($"Cosmos container State:{_cosmosContainer.State}");
130
+ _testOutputHelper.WriteLine("=STOP=");*/
131
+ }
132
+
133
+ public async void Dispose ( )
134
+ {
135
+
136
+ await _dockerClient . Containers . RemoveContainerAsync ( containerId ,
137
+ new ContainerRemoveParameters
138
+ {
139
+ Force = true
140
+ } ) ;
93
141
}
94
- }
142
+ }
0 commit comments