Add PathUtilsTest.

 - This test invokes JNI calls and included only if gtest_target_type=shared_library.
 - Also set the application context to get these JNI calls working.

BUG=125059
TEST=

Review URL: http://codereview.chromium.org/10161032

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@134144 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/base/android/path_utils.h b/base/android/path_utils.h
index 8015ed93..2e95727 100644
--- a/base/android/path_utils.h
+++ b/base/android/path_utils.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -21,6 +21,9 @@
 // cache dir.
 std::string GetCacheDirectory();
 
+// Returns the path to the public downloads directory.
+std::string GetDownloadsDirectory();
+
 bool RegisterPathUtils(JNIEnv* env);
 
 }  // namespace android
diff --git a/base/android/path_utils_unittest.cc b/base/android/path_utils_unittest.cc
new file mode 100644
index 0000000..e86cd49
--- /dev/null
+++ b/base/android/path_utils_unittest.cc
@@ -0,0 +1,31 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/path_utils.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace android {
+
+typedef testing::Test PathUtilsTest;
+
+TEST_F(PathUtilsTest, TestGetDataDirectory) {
+  // The string comes from the Java side and depends on the APK
+  // we are running in. Assumes that we are packaged in
+  // org.chromium.native_test
+  EXPECT_STREQ("/data/data/org.chromium.native_test/app_chrome",
+               GetDataDirectory().c_str());
+}
+
+TEST_F(PathUtilsTest, TestGetCacheDirectory) {
+  // The string comes from the Java side and depends on the APK
+  // we are running in. Assumes that we are packaged in
+  // org.chromium.native_test
+  EXPECT_STREQ("/data/data/org.chromium.native_test/cache",
+               GetCacheDirectory().c_str());
+}
+
+}  // namespace android
+}  // namespace base
diff --git a/base/base.gyp b/base/base.gyp
index 91269004..e048d097 100644
--- a/base/base.gyp
+++ b/base/base.gyp
@@ -132,6 +132,7 @@
       'sources': [
         # Tests.
         'android/jni_android_unittest.cc',
+        'android/path_utils_unittest.cc',
         'android/scoped_java_ref_unittest.cc',
         'at_exit_unittest.cc',
         'atomicops_unittest.cc',
@@ -301,22 +302,27 @@
         ['OS == "android"', {
           'sources!': [
             # TODO(michaelbai): Removed the below once the fix upstreamed.
+            'debug/stack_trace_unittest.cc',
             'memory/mru_cache_unittest.cc',
             'process_util_unittest.cc',
             'synchronization/cancellation_flag_unittest.cc',
-            # TODO(michaelbai): The below files are excluded because of the
-            # missing JNI and should be added back once JNI is ready.
-            'android/jni_android_unittest.cc',
-            'android/scoped_java_ref_unittest.cc',
-            'debug/stack_trace_unittest.cc',
           ],
           'dependencies': [
             'android/jni_generator/jni_generator.gyp:jni_generator_tests',
           ],
-        }],
-        ['OS=="android" and "<(gtest_target_type)"=="shared_library"', {
-          'dependencies': [
-            '../testing/android/native_test.gyp:native_test_native_code',
+          'conditions': [
+            ['"<(gtest_target_type)"=="shared_library"', {
+              'dependencies': [
+                '../testing/android/native_test.gyp:native_test_native_code',
+              ],
+            }, { # gtest_target_type != shared_library
+              'sources!': [
+                # The below files are excluded because of the missing JNI.
+                'android/jni_android_unittest.cc',
+                'android/path_utils_unittest.cc',
+                'android/scoped_java_ref_unittest.cc',
+              ],
+            }],
           ],
         }],
         ['use_glib==1', {
diff --git a/testing/android/java/src/org/chromium/native_test/ChromeNativeTestActivity.java b/testing/android/java/src/org/chromium/native_test/ChromeNativeTestActivity.java
index b4bb6ad..35e381f 100644
--- a/testing/android/java/src/org/chromium/native_test/ChromeNativeTestActivity.java
+++ b/testing/android/java/src/org/chromium/native_test/ChromeNativeTestActivity.java
@@ -5,6 +5,7 @@
 package org.chromium.native_test;
 
 import android.app.Activity;
+import android.content.Context;
 import android.os.Bundle;
 import android.util.Log;
 
@@ -36,7 +37,7 @@
                 @Override
                 public void run() {
                     Log.d(TAG, ">>nativeRunTests");
-                    nativeRunTests(getFilesDir().getAbsolutePath());
+                    nativeRunTests(getFilesDir().getAbsolutePath(), getApplicationContext());
                     // TODO(jrg): make sure a crash in native code
                     // triggers nativeTestFailed().
                     Log.d(TAG, "<<nativeRunTests");
@@ -62,5 +63,5 @@
         Log.i(TAG, "loaded: " + mLibrary);
     }
 
-    private native void nativeRunTests(String filesDir);
+    private native void nativeRunTests(String filesDir, Context appContext);
 }
diff --git a/testing/android/native_test_launcher.cc b/testing/android/native_test_launcher.cc
index 455d43d..1555fbe 100644
--- a/testing/android/native_test_launcher.cc
+++ b/testing/android/native_test_launcher.cc
@@ -7,6 +7,7 @@
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
 #include "base/android/path_utils.h"
+#include "base/android/scoped_java_ref.h"
 #include "base/at_exit.h"
 #include "base/command_line.h"
 #include "base/file_path.h"
@@ -156,7 +157,10 @@
 
 // This method is called on a separate java thread so that we won't trigger
 // an ANR.
-static void RunTests(JNIEnv* env, jobject obj, jstring jfiles_dir) {
+static void RunTests(JNIEnv* env,
+                     jobject obj,
+                     jstring jfiles_dir,
+                     jobject app_context) {
   FilePath files_dir(base::android::ConvertJavaStringToUTF8(env, jfiles_dir));
   // A few options, such "--gtest_list_tests", will just use printf directly
   // and won't use the "AndroidLogPrinter". Redirect stdout to a known file.
@@ -175,6 +179,11 @@
   AndroidLogPrinter* log = new AndroidLogPrinter();
   log->Init(&argc, &argv[0]);
 
+  // Set the application context in base.
+  base::android::ScopedJavaLocalRef<jobject> scoped_context(
+      env, env->NewLocalRef(app_context));
+  base::android::InitApplicationContext(scoped_context);
+
   main(argc, &argv[0]);
 }