Description
When running org.apache.hadoop.fs.s3a.s3guard.ITestDynamoDBMetadataStore integration test, I got the following stack trace:
[ERROR] org.apache.hadoop.fs.s3a.s3guard.ITestDynamoDBMetadataStore Time elapsed: 0.333 s <<< ERROR! java.lang.NullPointerException at org.apache.hadoop.fs.s3a.s3guard.ITestDynamoDBMetadataStore.beforeClassSetup(ITestDynamoDBMetadataStore.java:164) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:365) at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:273) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:159) at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:384) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:345) at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:126) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418)
The NPE happened here:
assertTrue("Test DynamoDB table name: '" + S3GUARD_DDB_TEST_TABLE_NAME_KEY + "' and production table name: '" + S3GUARD_DDB_TABLE_NAME_KEY + "' can not be the same.", !conf.get(S3GUARD_DDB_TABLE_NAME_KEY).equals(testDynamoDBTableName));
The problem is that though we check previously whether the variable testDynamoDBTableName (fs.s3a.s3guard.ddb.test.table config) is not null, but we don't do the same for fs.s3a.s3guard.ddb.table (S3GUARD_DDB_TABLE_NAME_KEY) before calling the .equals(), thus causing an NPE.
Since we don't need the fs.s3a.s3guard.ddb.table config for the test, we should check first whether that config is given or not, and only comparing the two configs if they both exist.