Code drop from //branches/cupcake/...@124589
diff --git a/tests/gpstest/Android.mk b/tests/gpstest/Android.mk
new file mode 100644
index 0000000..6d638b3
--- /dev/null
+++ b/tests/gpstest/Android.mk
@@ -0,0 +1,34 @@
+# Copyright (C) 2008 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+
+LOCAL_SRC_FILES:= gpstest.cpp
+
+LOCAL_CFLAGS:= -fno-short-enums
+
+LOCAL_SHARED_LIBRARIES:= libhardware
+
+LOCAL_C_INCLUDES:= \
+	include/hardware
+
+LOCAL_MODULE:= gpstest
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+
+LOCAL_MODULE_TAGS:= tests development
+
+include $(BUILD_EXECUTABLE)
diff --git a/tests/gpstest/gpstest.cpp b/tests/gpstest/gpstest.cpp
new file mode 100644
index 0000000..79f081d
--- /dev/null
+++ b/tests/gpstest/gpstest.cpp
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+extern "C" size_t  dlmalloc_footprint();
+
+#include "hardware/gps.h"
+
+static const GpsInterface* sGpsInterface = NULL;
+
+static bool sDone = false;
+static int sFixes = 0;
+static int sMaxFixes = 0;
+static int sStatus = GPS_STATUS_ENGINE_OFF;
+
+static void location_callback(GpsLocation* location)
+{
+    printf("Got Fix: latitude: %lf longitude: %lf altitude: %.1lf\n", 
+            location->latitude, location->longitude, location->altitude);
+    sFixes++;
+    if (sMaxFixes > 0 && sFixes >= sMaxFixes) {
+        sDone = true;
+    }
+}
+
+static void status_callback(GpsStatus* status)
+{
+    switch (status->status) {
+        case GPS_STATUS_NONE:
+            printf("status: GPS_STATUS_NONE\n");
+            break;
+        case GPS_STATUS_SESSION_BEGIN:
+            printf("status: GPS_STATUS_SESSION_BEGIN\n");
+            break;
+        case GPS_STATUS_SESSION_END:
+            printf("status: GPS_STATUS_SESSION_END\n");
+            break;
+        case GPS_STATUS_ENGINE_ON:
+            printf("status: GPS_STATUS_ENGINE_ON\n");
+            break;
+        case GPS_STATUS_ENGINE_OFF:
+            printf("status: GPS_STATUS_ENGINE_OFF\n");
+            break;
+        default:
+            printf("unknown status: %d\n", status->status);
+            break;
+    }
+
+    sStatus = status->status;
+}
+
+static void sv_status_callback(GpsSvStatus* sv_status)
+{
+    if (sv_status->num_svs > 0) {
+        for (int i = 0; i < sv_status->num_svs; i++) {
+            printf("SV: %2d SNR: %.1f Elev: %.1f Azim: %.1f %s %s\n", sv_status->sv_list[i].prn, 
+                    sv_status->sv_list[i].snr, sv_status->sv_list[i].elevation, 
+                    sv_status->sv_list[i].azimuth,
+             ((sv_status->ephemeris_mask & (1 << (sv_status->sv_list[i].prn - 1))) ? "E" : " "), 
+             ((sv_status->almanac_mask & (1 << (sv_status->sv_list[i].prn - 1))) ? "A" : " ")
+            );
+        }
+        printf("\n");
+    }
+}
+
+GpsCallbacks sCallbacks = {
+    location_callback,
+    status_callback,
+    sv_status_callback,
+};
+
+int main(int argc, char *argv[])
+{
+    size_t   initial = dlmalloc_footprint();
+    
+    if (argc >= 2) {
+        sMaxFixes = atoi(argv[1]);
+        printf("max fixes: %d\n", sMaxFixes);
+    }
+
+    sGpsInterface = gps_get_interface();
+    if (!sGpsInterface) {
+        fprintf(stderr, "could not get gps interface\n");
+        return -1;
+    }
+
+    int err = sGpsInterface->init(&sCallbacks);
+    if (err) {
+        fprintf(stderr, "gps_init failed %d\n", err);
+        return err;
+    }
+
+    sGpsInterface->start();
+    
+    while (!sDone) {
+        sleep(1);
+    }
+    
+    sGpsInterface->stop();
+    
+    printf("waiting for GPS to shut down\n");
+     while (sStatus != GPS_STATUS_ENGINE_OFF) {
+        sleep(1);
+    }
+   
+    sGpsInterface->cleanup();
+
+    size_t   final = dlmalloc_footprint();
+    fprintf(stderr, "KO: initial == %d, final == %d\n", initial, final );
+
+    return 0;
+}