steveloughran commented on code in PR #5024: URL: https://github.com/apache/hadoop/pull/5024#discussion_r1007960200
########## hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AAWSCredentialsProvider.java: ########## @@ -480,4 +488,151 @@ public void refresh() { } } + private static final AWSCredentials EXPECTED_CREDENTIALS = new AWSCredentials() { + @Override + public String getAWSAccessKeyId() { + return "expectedAccessKey"; + } + + @Override + public String getAWSSecretKey() { + return "expectedSecret"; + } + }; + + /** + * Credential provider that takes a long time. + */ + protected static class SlowProvider extends AbstractSessionCredentialsProvider { + + public SlowProvider(@Nullable URI uri, Configuration conf) { + super(uri, conf); + } + + @Override + protected AWSCredentials createCredentials(Configuration config) throws IOException { + // yield to other callers to induce race condition + Thread.yield(); + return EXPECTED_CREDENTIALS; + } + } + + private static final int CONCURRENT_THREADS = 10; + + @Test + public void testConcurrentAuthentication() throws Throwable { + Configuration conf = createProviderConfiguration(SlowProvider.class.getName()); + Path testFile = getCSVTestPath(conf); + + AWSCredentialProviderList list = createAWSCredentialProviderSet(testFile.toUri(), conf); + + SlowProvider provider = (SlowProvider) list.getProviders().get(0); + + ExecutorService pool = Executors.newFixedThreadPool(CONCURRENT_THREADS); + + List<Future<AWSCredentials>> results = new ArrayList<>(); + + try { + assertFalse( + "Provider not initialized. isInitialized should be false", + provider.isInitialized()); + assertFalse( + "Provider not initialized. hasCredentials should be false", + provider.hasCredentials()); + if (provider.getInitializationException() != null) { + throw new AssertionError( + "Provider not initialized. getInitializationException should return null", + provider.getInitializationException()); + } + + for (int i = 0; i < CONCURRENT_THREADS; i++) { + results.add(pool.submit(() -> list.getCredentials())); + } + + for (Future<AWSCredentials> result : results) { + AWSCredentials credentials = (AWSCredentials) result.get(); + assertEquals(credentials.getAWSAccessKeyId(), "expectedAccessKey"); Review Comment: aah one final thing. junit wants the expected string first, otherwise the error message it generates "expected X got Y" is the wrong way round. sorry, should have noticed that. one of those things. and one of the reasons we are moving towards (but not mandating) assertj in new test suites -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: common-issues-unsubscr...@hadoop.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: common-issues-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-issues-h...@hadoop.apache.org