Skip to content

Commit 5e43502

Browse files
authored
Fix SymfonyContainer when both Credential and Cache are defined (#1764)
1 parent dc845bd commit 5e43502

File tree

7 files changed

+141
-17
lines changed

7 files changed

+141
-17
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66

77
- Enable compiler optimization for the `sprintf` function.
88

9+
### Fixed
10+
11+
- Fix bundle configuration with both `credential_provider` and `credential_provider_cache`.
12+
913
## 1.12.2
1014

1115
### Changed

src/DependencyInjection/AsyncAwsExtension.php

+19-17
Original file line numberDiff line numberDiff line change
@@ -164,32 +164,34 @@ private function addServiceDefinition(ContainerBuilder $container, string $name,
164164
}
165165
}
166166

167-
// If no credential provider is specified, lets configured a credentials provider with cache.
168-
$hasCacheClasses = class_exists(SymfonyCacheProvider::class) && interface_exists(CacheInterface::class);
169167
$credentialServiceId = $config['credential_provider'];
170-
if (null === $credentialServiceId && null !== $config['credential_provider_cache'] && $hasCacheClasses) {
168+
$credentialProviderCache = class_exists(SymfonyCacheProvider::class) && interface_exists(CacheInterface::class) ? $config['credential_provider_cache'] : null;
169+
170+
if (null === $credentialServiceId) {
171171
$credentialServiceId = 'async_aws.credential';
172172
if (!$container->hasDefinition($credentialServiceId)) {
173173
$container->register($credentialServiceId, CredentialProvider::class)
174174
->setFactory([ChainProvider::class, 'createDefaultChain'])
175175
->setArguments([$httpClient, $logger])
176176
->addTag('monolog.logger', ['channel' => 'async_aws']);
177+
}
178+
}
177179

178-
$container->register('async_aws.credential.cache', SymfonyCacheProvider::class)
179-
->setDecoratedService($credentialServiceId)
180-
->setArguments([
181-
new Reference('async_aws.credential.cache.inner'),
182-
new Reference($config['credential_provider_cache']),
183-
$logger,
184-
])
185-
->addTag('monolog.logger', ['channel' => 'async_aws']);
180+
if (null !== $credentialProviderCache) {
181+
$container->register($credentialServiceId . '.cache', SymfonyCacheProvider::class)
182+
->setDecoratedService($credentialServiceId)
183+
->setArguments([
184+
new Reference($credentialServiceId . '.cache.inner'),
185+
new Reference($credentialProviderCache),
186+
$logger,
187+
])
188+
->addTag('monolog.logger', ['channel' => 'async_aws']);
186189

187-
$container->register('async_aws.credential.memory', CacheProvider::class)
188-
->setDecoratedService($credentialServiceId)
189-
->setArguments([
190-
new Reference('async_aws.credential.memory.inner'),
191-
]);
192-
}
190+
$container->register($credentialServiceId . '.memory', CacheProvider::class)
191+
->setDecoratedService($credentialServiceId)
192+
->setArguments([
193+
new Reference($credentialServiceId . '.memory.inner'),
194+
]);
193195
}
194196

195197
$definition = new Definition($clientClass);

tests/Functional/BundleInitializationTest.php

+94
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44

55
namespace AsyncAws\Symfony\Bundle\Tests\Functional;
66

7+
use AsyncAws\Core\AbstractApi;
8+
use AsyncAws\Core\Credentials\CacheProvider;
9+
use AsyncAws\Core\Credentials\InstanceProvider;
10+
use AsyncAws\Core\Credentials\SymfonyCacheProvider;
711
use AsyncAws\S3\S3Client;
812
use AsyncAws\Ses\SesClient;
913
use AsyncAws\Sns\SnsClient;
@@ -14,6 +18,7 @@
1418
use Nyholm\BundleTest\TestKernel;
1519
use Symfony\Bundle\FrameworkBundle\EventListener\ConsoleProfilerListener;
1620
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
21+
use Symfony\Component\Cache\Adapter\ApcuAdapter;
1722
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
1823
use Symfony\Component\HttpKernel\KernelInterface;
1924

@@ -152,6 +157,95 @@ public function testIssue793()
152157
self::assertSame('./docker/dynamodb/credentials', $x->getConfiguration()->get('sharedCredentialsFile'));
153158
}
154159

160+
public function testIssue1758Empty()
161+
{
162+
$this->bootWithConfig([
163+
'issue-1758/empty.yaml',
164+
]);
165+
166+
self::assertServiceExists('async_aws.client.s3', S3Client::class);
167+
self::assertServiceExists('async_aws.credential', CacheProvider::class);
168+
self::assertServiceExists('async_aws.credential.memory', CacheProvider::class);
169+
self::assertServiceExists('async_aws.credential.cache', SymfonyCacheProvider::class);
170+
}
171+
172+
public function testIssue1758Cache()
173+
{
174+
$this->bootWithConfig([
175+
'issue-1758/cache.yaml',
176+
]);
177+
178+
self::assertServiceExists('async_aws.client.s3', S3Client::class);
179+
self::assertServiceExists('async_aws.credential', CacheProvider::class);
180+
self::assertServiceExists('async_aws.credential.memory', CacheProvider::class);
181+
self::assertServiceExists('async_aws.credential.cache', SymfonyCacheProvider::class);
182+
183+
$container = self::$kernel->getContainer();
184+
$cache = $container->get('async_aws.credential.cache');
185+
186+
$r = new \ReflectionObject($cache);
187+
$p = $r->getProperty('cache');
188+
$p->setAccessible(true);
189+
190+
$adapter = $p->getValue($cache);
191+
self::assertInstanceOf(ApcuAdapter::class, $adapter);
192+
}
193+
194+
public function testIssue1758Provider()
195+
{
196+
$this->bootWithConfig([
197+
'issue-1758/provider.yaml',
198+
]);
199+
200+
self::assertServiceExists('async_aws.client.s3', S3Client::class);
201+
202+
$container = self::$kernel->getContainer();
203+
$client = $container->get(S3Client::class);
204+
205+
$r = new \ReflectionClass(AbstractApi::class);
206+
$p = $r->getProperty('credentialProvider');
207+
$p->setAccessible(true);
208+
209+
$credentialProvider = $p->getValue($client);
210+
self::assertInstanceOf(InstanceProvider::class, $credentialProvider);
211+
}
212+
213+
public function testIssue1758ProviderAndCache()
214+
{
215+
$this->bootWithConfig([
216+
'issue-1758/provider_cache.yaml',
217+
]);
218+
219+
self::assertServiceExists('async_aws.client.s3', S3Client::class);
220+
self::assertServiceExists(InstanceProvider::class . '.memory', CacheProvider::class);
221+
self::assertServiceExists(InstanceProvider::class . '.cache', SymfonyCacheProvider::class);
222+
223+
$container = self::$kernel->getContainer();
224+
$client = $container->get(S3Client::class);
225+
226+
$r = new \ReflectionClass(AbstractApi::class);
227+
$p = $r->getProperty('credentialProvider');
228+
$p->setAccessible(true);
229+
230+
$credentialProvider = $p->getValue($client);
231+
self::assertInstanceOf(CacheProvider::class, $credentialProvider);
232+
233+
$cache = $container->get(InstanceProvider::class . '.cache');
234+
235+
$r = new \ReflectionObject($cache);
236+
$p = $r->getProperty('cache');
237+
$p->setAccessible(true);
238+
239+
$adapter = $p->getValue($cache);
240+
self::assertInstanceOf(ApcuAdapter::class, $adapter);
241+
242+
$p = $r->getProperty('decorated');
243+
$p->setAccessible(true);
244+
245+
$decorated = $p->getValue($cache);
246+
self::assertInstanceOf(InstanceProvider::class, $decorated);
247+
}
248+
155249
protected static function getKernelClass(): string
156250
{
157251
return TestKernel::class;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
framework:
2+
cache:
3+
pools:
4+
test:
5+
adapter: cache.adapter.apcu
6+
7+
async_aws:
8+
credential_provider_cache: test
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
async_aws:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
async_aws:
2+
credential_provider: AsyncAws\Core\Credentials\InstanceProvider
3+
credential_provider_cache: null
4+
services:
5+
AsyncAws\Core\Credentials\InstanceProvider: ~
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
framework:
2+
cache:
3+
pools:
4+
test:
5+
adapter: cache.adapter.apcu
6+
async_aws:
7+
credential_provider: AsyncAws\Core\Credentials\InstanceProvider
8+
credential_provider_cache: test
9+
services:
10+
AsyncAws\Core\Credentials\InstanceProvider: ~

0 commit comments

Comments
 (0)