You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ra...@apache.org on 2019/11/01 21:25:50 UTC

[cordova-cli] branch master updated: Fix blocked telemetry calls (#473)

This is an automated email from the ASF dual-hosted git repository.

raphinesse pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cordova-cli.git


The following commit(s) were added to refs/heads/master by this push:
     new 3d4528e  Fix blocked telemetry calls (#473)
3d4528e is described below

commit 3d4528e852423835400f6f0f5166eb2589ffd51e
Author: Raphael von der GrĂ¼n <ra...@gmail.com>
AuthorDate: Fri Nov 1 22:25:40 2019 +0100

    Fix blocked telemetry calls (#473)
    
    * Check that we're actually sending telemetry data
    
    This uncovers three cases where we don't
    
    * fix: unmute certain telemetry.track calls
---
 spec/cli.spec.js       | 37 ++++++++++++++++++++++++++++---------
 spec/telemetry.spec.js | 20 ++++++++++++++------
 src/telemetry.js       | 17 ++++++++++++++---
 3 files changed, 56 insertions(+), 18 deletions(-)

diff --git a/spec/cli.spec.js b/spec/cli.spec.js
index 2ee1167..51bbb09 100644
--- a/spec/cli.spec.js
+++ b/spec/cli.spec.js
@@ -243,15 +243,28 @@ describe('cordova cli', () => {
     });
 
     describe('telemetry', () => {
+        const Insight = require('insight');
+        let isOptedOut;
+
         beforeEach(() => {
+            // Allow testing if we _really_ would send tracking requests
+            telemetry.track.and.callThrough();
+            telemetry.turnOn.and.callThrough();
+            telemetry.turnOff.and.callThrough();
+            spyOn(Insight.prototype, 'track').and.callThrough();
+            spyOn(Insight.prototype, '_save');
+            spyOnProperty(Insight.prototype, 'optOut', 'get')
+                .and.callFake(() => isOptedOut);
+            spyOnProperty(Insight.prototype, 'optOut', 'set')
+                .and.callFake(x => { isOptedOut = x; });
+
             // Set a normal opted-in user as default
             spyOn(telemetry, 'isCI').and.returnValue(false);
-            spyOn(telemetry, 'isOptedIn').and.returnValue(true);
-            spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(true);
+            isOptedOut = false;
         });
 
         it("Test#023 : skips prompt when user runs 'cordova telemetry X'", () => {
-            telemetry.hasUserOptedInOrOut.and.returnValue(false);
+            isOptedOut = undefined;
 
             return Promise.resolve()
                 .then(_ => cli(['node', 'cordova', 'telemetry', 'on']))
@@ -262,16 +275,18 @@ describe('cordova cli', () => {
         });
 
         it("Test#024 : is NOT collected when user runs 'cordova telemetry on' while NOT opted-in", () => {
-            telemetry.isOptedIn.and.returnValue(false);
+            isOptedOut = true;
 
             return cli(['node', 'cordova', 'telemetry', 'on']).then(() => {
-                expect(telemetry.track).not.toHaveBeenCalled();
+                expect(Insight.prototype.track).not.toHaveBeenCalled();
             });
         });
 
         it("Test#025 : is collected when user runs 'cordova telemetry off' while opted-in", () => {
             return cli(['node', 'cordova', 'telemetry', 'off']).then(() => {
                 expect(telemetry.track).toHaveBeenCalledWith('telemetry', 'off', 'via-cordova-telemetry-cmd', 'successful');
+                expect(Insight.prototype.track).toHaveBeenCalled();
+                expect(Insight.prototype._save).toHaveBeenCalled();
             });
         });
 
@@ -280,12 +295,14 @@ describe('cordova cli', () => {
 
             return cli(['node', 'cordova', 'platform', 'add', 'ios']).then(() => {
                 expect(telemetry.track).toHaveBeenCalledWith('platform', 'add', 'successful');
+                expect(Insight.prototype.track).toHaveBeenCalled();
+                expect(Insight.prototype._save).toHaveBeenCalled();
             });
         });
 
         it('Test#027 : shows prompt if user neither opted in or out yet', () => {
+            isOptedOut = undefined;
             spyOn(cordova, 'prepare').and.returnValue(Promise.resolve());
-            telemetry.hasUserOptedInOrOut.and.returnValue(false);
 
             return cli(['node', 'cordova', 'prepare']).then(() => {
                 expect(telemetry.showPrompt).toHaveBeenCalled();
@@ -301,20 +318,22 @@ describe('cordova cli', () => {
         });
 
         it("Test#030 : is NOT collected when --no-telemetry flag found and doesn't prompt", () => {
-            telemetry.hasUserOptedInOrOut.and.returnValue(false);
+            isOptedOut = undefined;
 
             return cli(['node', 'cordova', '--version', '--no-telemetry']).then(() => {
                 expect(telemetry.showPrompt).not.toHaveBeenCalled();
-                expect(telemetry.track).not.toHaveBeenCalled();
+                expect(Insight.prototype.track).not.toHaveBeenCalled();
             });
         });
 
         it("Test#033 : track opt-out that happened via 'cordova telemetry off' even if user is NOT opted-in ", () => {
-            telemetry.isOptedIn.and.returnValue(false);
+            isOptedOut = true;
 
             return cli(['node', 'cordova', 'telemetry', 'off']).then(() => {
                 expect(telemetry.isOptedIn()).toBeFalsy();
                 expect(telemetry.track).toHaveBeenCalledWith('telemetry', 'off', 'via-cordova-telemetry-cmd', 'successful');
+                expect(Insight.prototype.track).toHaveBeenCalled();
+                expect(Insight.prototype._save).toHaveBeenCalled();
             });
         });
     });
diff --git a/spec/telemetry.spec.js b/spec/telemetry.spec.js
index ed0360f..147b736 100644
--- a/spec/telemetry.spec.js
+++ b/spec/telemetry.spec.js
@@ -39,9 +39,12 @@ describe('telemetry', () => {
 
         // Prevent any settings from being persisted during testing
         insight.config = {
-            get: jasmine.createSpy('insight.config.get'),
-            set: jasmine.createSpy('insight.config.set')
+            get (key) { return this[key]; },
+            set (key, val) { this[key] = val; }
         };
+        for (const key in insight.config) {
+            spyOn(insight.config, key).and.callThrough();
+        }
 
         // Prevent tracking anything during testing
         spyOn(Insight.prototype, '_save');
@@ -134,9 +137,12 @@ describe('telemetry', () => {
 
         beforeEach(() => {
             spyOn(console, 'log');
-            spyOn(telemetry, 'track');
+            spyOn(telemetry, 'track').and.callThrough();
             response = Symbol('response');
-            insight.askPermission.and.callFake((_, cb) => cb(null, response));
+            insight.askPermission.and.callFake((_, cb) => {
+                insight.optOut = !response;
+                cb(null, response);
+            });
         });
 
         it('calls insight.askPermission [T011]', () => {
@@ -169,6 +175,7 @@ describe('telemetry', () => {
                     expect(telemetry.track).toHaveBeenCalledWith(
                         'telemetry', 'on', 'via-cli-prompt-choice', 'successful'
                     );
+                    expect(Insight.prototype._save).toHaveBeenCalled();
                 });
             });
         });
@@ -197,6 +204,7 @@ describe('telemetry', () => {
                     expect(telemetry.track).toHaveBeenCalledWith(
                         'telemetry', 'off', 'via-cli-prompt-choice', 'successful'
                     );
+                    expect(Insight.prototype._save).toHaveBeenCalled();
                 });
             });
         });
@@ -268,10 +276,10 @@ describe('telemetry', () => {
             expect(insight._save).toHaveBeenCalled();
         });
 
-        it('does NOT track when user opted out [T023]', () => {
+        it('still tracks when user opted out [T023]', () => {
             insight.config.get.and.returnValue(true);
             insight.track();
-            expect(insight._save).not.toHaveBeenCalled();
+            expect(insight._save).toHaveBeenCalled();
         });
 
         describe('on CI', () => {
diff --git a/src/telemetry.js b/src/telemetry.js
index 55765f7..f307e67 100644
--- a/src/telemetry.js
+++ b/src/telemetry.js
@@ -23,7 +23,18 @@ var GA_TRACKING_CODE = 'UA-64283057-7';
 
 var pkg = require('../package.json');
 var Insight = require('insight');
-var insight = new Insight({
+
+/**
+ * By redefining `get optOut` we trick Insight into tracking
+ * even though the user might have opted out.
+ */
+class RelentlessInsight extends Insight {
+    get optOut () { return false; }
+    set optOut (value) { super.optOut = value; }
+    get realOptOut () { return super.optOut; }
+}
+
+var insight = new RelentlessInsight({
     trackingCode: GA_TRACKING_CODE,
     pkg: pkg
 });
@@ -74,14 +85,14 @@ function clear () {
 }
 
 function isOptedIn () {
-    return !insight.optOut;
+    return !insight.realOptOut;
 }
 
 /**
  * Has the user already answered the telemetry prompt? (thereby opting in or out?)
  */
 function hasUserOptedInOrOut () {
-    var insightOptOut = insight.optOut === undefined;
+    var insightOptOut = insight.realOptOut === undefined;
     return !(insightOptOut);
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org