1
1
using System ;
2
- using System . Linq ;
3
2
using System . Net . Http ;
4
3
using System . Threading . Tasks ;
5
- using Docker . DotNet ;
6
- using Docker . DotNet . Models ;
7
4
using DotNet . Testcontainers . Builders ;
8
5
using DotNet . Testcontainers . Containers ;
9
6
using ManagedCode . Database . Core ;
10
7
using ManagedCode . Database . Cosmos ;
11
8
using ManagedCode . Database . Tests . Common ;
12
9
using Microsoft . Azure . Cosmos ;
13
- using Xunit ;
14
10
15
11
namespace ManagedCode . Database . Tests . TestContainers ;
16
12
17
- [ CollectionDefinition ( nameof ( CosmosTestContainer ) ) ]
18
- public class CosmosTestContainer : ITestContainer < string , TestCosmosItem > ,
19
- ICollectionFixture < CosmosTestContainer > , IDisposable
13
+ public class CosmosTestContainer : ITestContainer < string , TestCosmosItem >
20
14
{
21
- private readonly TestcontainersContainer _cosmosTestContainer ;
22
15
private CosmosDatabase _database ;
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 ;
16
+ private readonly TestcontainersContainer _cosmosContainer ;
28
17
29
18
public CosmosTestContainer ( )
30
19
{
31
- _cosmosTestContainer = new TestcontainersBuilder < TestcontainersContainer > ( )
20
+ // Docker container for cosmos db is not working at all, to test database use local windows emulator
21
+ _cosmosContainer = new TestcontainersBuilder < TestcontainersContainer > ( )
32
22
. WithImage ( "mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator" )
33
- . WithName ( containerName )
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)
34
31
. WithExposedPort ( 8081 )
35
- . WithExposedPort ( 10251 )
36
- . WithExposedPort ( 10252 )
37
- . WithExposedPort ( 10253 )
38
- . WithExposedPort ( 10254 )
39
- . WithExposedPort ( 10255 )
40
32
. WithPortBinding ( 8081 , 8081 )
33
+ . WithPortBinding ( 10250 , 10250 )
41
34
. WithPortBinding ( 10251 , 10251 )
42
35
. WithPortBinding ( 10252 , 10252 )
43
36
. WithPortBinding ( 10253 , 10253 )
44
37
. WithPortBinding ( 10254 , 10254 )
45
- . WithPortBinding ( 8081 , 8081 )
38
+ . WithPortBinding ( 10255 , 10255 )
46
39
. WithEnvironment ( "AZURE_COSMOS_EMULATOR_PARTITION_COUNT" , "1" )
47
40
. WithEnvironment ( "AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE" , "127.0.0.1" )
48
41
. WithEnvironment ( "AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE" , "false" )
49
- . WithCleanUp ( false )
42
+ // .WithCleanUp(true )
50
43
. WithWaitStrategy ( Wait . ForUnixContainer ( )
51
- . UntilPortIsAvailable ( privatePort ) )
44
+ . UntilPortIsAvailable ( 8081 ) )
52
45
. Build ( ) ;
53
-
54
- _dockerClient = new DockerClientConfiguration ( ) . CreateClient ( ) ;
55
46
}
56
47
57
48
public IDatabaseCollection < string , TestCosmosItem > Collection =>
@@ -64,56 +55,27 @@ public string GenerateId()
64
55
65
56
public async Task InitializeAsync ( )
66
57
{
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
-
58
+ await _cosmosContainer . StartAsync ( ) ;
59
+ Console . WriteLine ( $ "Cosmos container State:{ _cosmosContainer . State } ") ;
105
60
_database = new CosmosDatabase ( new CosmosOptions
106
61
{
107
62
ConnectionString =
108
- $ "AccountEndpoint=https://localhost:{ publicPort } /;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",
63
+ $ "AccountEndpoint=https://localhost:{ _cosmosContainer . GetMappedPublicPort ( 8081 ) } /;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",
109
64
DatabaseName = "database" ,
110
- CollectionName = $ "testContainer",
65
+ CollectionName = "testContainer" ,
111
66
AllowTableCreation = true ,
112
67
CosmosClientOptions = new CosmosClientOptions ( )
113
68
{
114
- HttpClientFactory = ( ) => new HttpClient ( httpMessageHandler ) ,
115
- ConnectionMode = ConnectionMode . Gateway ,
116
- //RequestTimeout = TimeSpan.FromMinutes(3)
69
+ HttpClientFactory = ( ) =>
70
+ {
71
+ HttpMessageHandler httpMessageHandler = new HttpClientHandler ( )
72
+ {
73
+ ServerCertificateCustomValidationCallback = ( _ , _ , _ , _ ) => true
74
+ } ;
75
+
76
+ return new HttpClient ( httpMessageHandler ) ;
77
+ } ,
78
+ ConnectionMode = ConnectionMode . Gateway
117
79
} ,
118
80
} ) ;
119
81
@@ -123,20 +85,9 @@ public async Task InitializeAsync()
123
85
124
86
public async Task DisposeAsync ( )
125
87
{
126
- // await _database.DeleteAsync();
127
88
await _database . DisposeAsync ( ) ;
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
- } ) ;
89
+ await _cosmosContainer . StopAsync ( ) ;
90
+ await _cosmosContainer . CleanUpAsync ( ) ;
91
+ Console . WriteLine ( $ "Cosmos container State:{ _cosmosContainer . State } ") ;
141
92
}
142
- }
93
+ }
0 commit comments