[gjs] coverage: Get the list of covered files from coverage.js



commit 58abf3bd48e3ee590176574f35e2e5f201be28cd
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Mon Feb 3 14:11:52 2014 -0500

    coverage: Get the list of covered files from coverage.js

 gjs/coverage.cpp                   |   59 ++++++++++++++++++++++++++++++++----
 installed-tests/js/testCoverage.js |    6 ++-
 modules/coverage.js                |    8 +++++
 test/gjs-test-coverage.cpp         |   10 ++----
 4 files changed, 68 insertions(+), 15 deletions(-)
---
diff --git a/gjs/coverage.cpp b/gjs/coverage.cpp
index f3c0980..893f17b 100644
--- a/gjs/coverage.cpp
+++ b/gjs/coverage.cpp
@@ -828,8 +828,6 @@ print_statistics_for_file(GjsCoverage   *coverage,
                                                   NULL);
 
     JSContext *context = (JSContext *) gjs_context_get_native_context(priv->context);
-    JSAutoCompartment compartment(context, priv->coverage_statistics);
-    JSAutoRequest ar(context);
 
     JSString *filename_jsstr = JS_NewStringCopyZ(context, filename);
     jsval    filename_jsval = STRING_TO_JSVAL(filename_jsstr);
@@ -889,6 +887,50 @@ print_statistics_for_file(GjsCoverage   *coverage,
     g_free(absolute_output_directory);
 }
 
+static char **
+get_covered_files(GjsCoverage *coverage)
+{
+    GjsCoveragePrivate *priv = (GjsCoveragePrivate *) gjs_coverage_get_instance_private(coverage);
+    JSContext *context = (JSContext *) gjs_context_get_native_context(priv->context);
+    jsval rval;
+    JSObject *files_obj;
+
+    char **files = NULL;
+    uint32_t n_files;
+
+    if (!JS_CallFunctionName(context, priv->coverage_statistics, "getCoveredFiles", 0, NULL, &rval)) {
+        gjs_log_exception(context);
+        goto error;
+    }
+
+    if (!rval.isObject())
+        goto error;
+
+    files_obj = &rval.toObject();
+    if (!JS_GetArrayLength(context, files_obj, &n_files))
+        goto error;
+
+    files = g_new0 (char *, n_files + 1);
+    for (uint32_t i = 0; i < n_files; i++) {
+        jsval element;
+        char *file;
+        if (!JS_GetElement(context, files_obj, i, &element))
+            goto error;
+
+        if (!gjs_string_to_utf8(context, element, &file))
+            goto error;
+
+        files[i] = file;
+    }
+
+    files[n_files] = NULL;
+    return files;
+
+ error:
+    g_strfreev(files);
+    return NULL;
+}
+
 void
 gjs_coverage_write_statistics(GjsCoverage *coverage,
                               const char  *output_directory)
@@ -896,6 +938,10 @@ gjs_coverage_write_statistics(GjsCoverage *coverage,
     GjsCoveragePrivate *priv = (GjsCoveragePrivate *) gjs_coverage_get_instance_private(coverage);
     GError *error = NULL;
 
+    JSContext *context = (JSContext *) gjs_context_get_native_context(priv->context);
+    JSAutoCompartment compartment(context, priv->coverage_statistics);
+    JSAutoRequest ar(context);
+
     /* Create output_directory if it doesn't exist */
     g_mkdir_with_parents(output_directory, 0755);
 
@@ -911,10 +957,11 @@ gjs_coverage_write_statistics(GjsCoverage *coverage,
                                          NULL,
                                          &error));
 
-    char **file_iter = priv->covered_paths;
-    while (*file_iter) {
-        print_statistics_for_file(coverage, *file_iter, output_directory, ostream);
-        ++file_iter;
+    char **files = get_covered_files(coverage);
+    if (files) {
+        for (char **file_iter = files; *file_iter; file_iter++)
+            print_statistics_for_file(coverage, *file_iter, output_directory, ostream);
+        g_strfreev(files);
     }
 
     g_object_unref(ostream);
diff --git a/installed-tests/js/testCoverage.js b/installed-tests/js/testCoverage.js
index 1b92a86..eed37dc 100644
--- a/installed-tests/js/testCoverage.js
+++ b/installed-tests/js/testCoverage.js
@@ -810,9 +810,12 @@ Coverage.getFileContents = function(filename) {
 
 function testCoverageStatisticsContainerFetchesValidStatisticsForFile() {
     let container = new Coverage.CoverageStatisticsContainer(MockFilenames);
-    let statistics = container.fetchStatistics('filename');
 
+    let statistics = container.fetchStatistics('filename');
     JSUnit.assertNotEquals(undefined, statistics);
+
+    let files = container.getCoveredFiles();
+    assertArrayEquals(files, ['filename'], JSUnit.assertEquals);
 }
 
 function testCoverageStatisticsContainerThrowsForNonExistingFile() {
@@ -821,7 +824,6 @@ function testCoverageStatisticsContainerThrowsForNonExistingFile() {
     JSUnit.assertRaises(function() {
         container.fetchStatistics('nonexistent');
     });
-
 }
 
 JSUnit.gjstestRun(this, JSUnit.setUp, JSUnit.tearDown);
diff --git a/modules/coverage.js b/modules/coverage.js
index 13fa4e3..cc5f72b 100644
--- a/modules/coverage.js
+++ b/modules/coverage.js
@@ -640,6 +640,10 @@ function CoverageStatisticsContainer(files) {
         return coveredFiles[filename];
     }
 
+    this.getCoveredFiles = function() {
+        return Object.keys(coveredFiles);
+    };
+
     this.fetchStatistics = function(filename) {
         let statistics = ensureStatisticsFor(filename);
         if (statistics === undefined)
@@ -661,6 +665,10 @@ function CoverageStatistics(files) {
      * a separate compartment inside of coverage.cpp */
     this.dbg = new Debugger(debuggee);
 
+    this.getCoveredFiles = function() {
+        return this.container.getCoveredFiles();
+    };
+
     this.getNumberOfLinesFor = function(filename) {
         return fetchStatistics(filename).nLines;
     };
diff --git a/test/gjs-test-coverage.cpp b/test/gjs-test-coverage.cpp
index c38b0e7..462c001 100644
--- a/test/gjs-test-coverage.cpp
+++ b/test/gjs-test-coverage.cpp
@@ -1138,13 +1138,9 @@ test_no_hits_to_coverage_data_for_unexecuted(gpointer      fixture_data,
                                                fixture->output_file_directory,
                                                NULL);
 
-    /* More than one assert per test is bad, but we are testing interlinked concepts */
-    g_assert(coverage_data_contains_value_for_key(coverage_data_contents,
-                                                  "LF:",
-                                                  "1"));
-    g_assert(coverage_data_contains_value_for_key(coverage_data_contents,
-                                                  "LH:",
-                                                  "0"));
+    /* No files were executed, so the coverage data is empty. */
+    g_assert_cmpstr(coverage_data_contents, ==, "");
+
     g_free(coverage_data_contents);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]