You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zipkin.apache.org by ad...@apache.org on 2019/04/30 03:24:47 UTC

[incubator-zipkin-api] 01/01: Adds validation of protobuf api

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

adriancole pushed a commit to branch proto-check
in repository https://gitbox.apache.org/repos/asf/incubator-zipkin-api.git

commit f5341c9f1b6cb661ff21642b970d9c4954c280e3
Author: Adrian Cole <ac...@pivotal.io>
AuthorDate: Tue Apr 30 11:24:23 2019 +0800

    Adds validation of protobuf api
---
 package-lock.json | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 package.json      |   1 +
 validate.test.js  |  52 ++++++++++++++++++++-------
 3 files changed, 144 insertions(+), 12 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index cda7e89..1bfb6b0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -393,6 +393,70 @@
         "@types/yargs": "^12.0.9"
       }
     },
+    "@protobufjs/aspromise": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+      "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=",
+      "dev": true
+    },
+    "@protobufjs/base64": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+      "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
+      "dev": true
+    },
+    "@protobufjs/codegen": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+      "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+      "dev": true
+    },
+    "@protobufjs/eventemitter": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+      "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=",
+      "dev": true
+    },
+    "@protobufjs/fetch": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+      "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
+      "dev": true,
+      "requires": {
+        "@protobufjs/aspromise": "^1.1.1",
+        "@protobufjs/inquire": "^1.1.0"
+      }
+    },
+    "@protobufjs/float": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+      "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=",
+      "dev": true
+    },
+    "@protobufjs/inquire": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+      "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=",
+      "dev": true
+    },
+    "@protobufjs/path": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+      "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=",
+      "dev": true
+    },
+    "@protobufjs/pool": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+      "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=",
+      "dev": true
+    },
+    "@protobufjs/utf8": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+      "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=",
+      "dev": true
+    },
     "@types/babel__core": {
       "version": "7.1.1",
       "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.1.tgz",
@@ -440,6 +504,18 @@
       "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==",
       "dev": true
     },
+    "@types/long": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz",
+      "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "10.14.6",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.6.tgz",
+      "integrity": "sha512-Fvm24+u85lGmV4hT5G++aht2C5I4Z4dYlWZIh62FAfFO/TfzXtPpoLI6I7AuBWkIFqZCnhFOoTT7RjjaIL5Fjg==",
+      "dev": true
+    },
     "@types/stack-utils": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
@@ -3533,6 +3609,12 @@
       "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
       "dev": true
     },
+    "long": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+      "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
+      "dev": true
+    },
     "loose-envify": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -4214,6 +4296,27 @@
         "sisteransi": "^1.0.0"
       }
     },
+    "protobufjs": {
+      "version": "6.8.8",
+      "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz",
+      "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==",
+      "dev": true,
+      "requires": {
+        "@protobufjs/aspromise": "^1.1.2",
+        "@protobufjs/base64": "^1.1.2",
+        "@protobufjs/codegen": "^2.0.4",
+        "@protobufjs/eventemitter": "^1.1.0",
+        "@protobufjs/fetch": "^1.1.0",
+        "@protobufjs/float": "^1.0.2",
+        "@protobufjs/inquire": "^1.1.0",
+        "@protobufjs/path": "^1.1.2",
+        "@protobufjs/pool": "^1.1.0",
+        "@protobufjs/utf8": "^1.1.0",
+        "@types/long": "^4.0.0",
+        "@types/node": "^10.1.0",
+        "long": "^4.0.0"
+      }
+    },
     "psl": {
       "version": "1.1.31",
       "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
diff --git a/package.json b/package.json
index 819a0c0..7e0dbe4 100644
--- a/package.json
+++ b/package.json
@@ -23,6 +23,7 @@
   "devDependencies": {
     "jest": "^24.7.1",
     "js-yaml": "^3.13.1",
+    "protobufjs": "^6.8.8",
     "sway": "^2.0.6"
   }
 }
diff --git a/validate.test.js b/validate.test.js
index 0a4343a..24649da 100644
--- a/validate.test.js
+++ b/validate.test.js
@@ -14,20 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-'use strict';
-
-const Sway = require('sway');
-const read = require('fs').readFileSync;
-const load = require('js-yaml').load;
+describe('Zipkin Http Api', () => {
+  const Sway = require('sway');
+  const read = require('fs').readFileSync;
+  const load = require('js-yaml').load;
 
-function validateSwagger(yaml, validationCallback) {
-  const zipkinAPI = read(yaml).toString();
-  Sway.create({definition: load(zipkinAPI)}).then(api => {
-    validationCallback(api.validate());
-  });
-}
+  function validateSwagger(yaml, validationCallback) {
+    const zipkinAPI = read(yaml).toString();
+    Sway.create({definition: load(zipkinAPI)}).then(api => {
+      validationCallback(api.validate());
+    });
+  }
 
-describe('Zipkin Http Api', () => {
   it('/api/v1 yaml should have no swagger syntax errors', done => {
     validateSwagger('./zipkin-api.yaml', result => {
       expect(result.errors).toHaveLength(0);
@@ -42,3 +40,33 @@ describe('Zipkin Http Api', () => {
     });
   });
 });
+
+describe('Zipkin Protocol Buffers Api', () => {
+  const load = require('protobufjs').load;
+
+  function validateProto(proto, validationCallback) {
+    load(proto, (err, root) => {
+      if (err) throw err;
+      validationCallback(root);
+    });
+  }
+
+  it('should include core data structures', done => {
+    validateProto('zipkin.proto', root => {
+      expect(root.lookupType("zipkin.proto3.Endpoint")).toBeDefined();
+      expect(root.lookupType("zipkin.proto3.Annotation")).toBeDefined();
+      expect(root.lookupType("zipkin.proto3.Span")).toBeDefined();
+      expect(root.lookupType("zipkin.proto3.ListOfSpans")).toBeDefined();
+      done();
+    });
+  });
+
+  it('should include reporting service', done => {
+    validateProto('zipkin.proto', root => {
+      // lookup is different for services vs messages
+      expect(root.lookup("SpanService")).toBeDefined();
+      expect(root.lookupType("zipkin.proto3.ReportResponse")).toBeDefined();
+      done();
+    });
+  });
+});