From 1448040dfb75ea723f15dab51ee17c04f0c3fdf0 Mon Sep 17 00:00:00 2001 From: Jono Wenger <jono@elixxir.io> Date: Tue, 20 Sep 2022 19:15:05 +0000 Subject: [PATCH] Add test to check that wasm bindings has all bindings in client and update makefile and CI --- .gitlab-ci.yml | 20 +++++--- Makefile | 13 ++++- go.mod | 2 +- go.sum | 23 +++------ indexedDb/implementation.go | 1 - indexedDb/implementation_test.go | 2 + indexedDb/init.go | 1 - indexedDb/model.go | 1 - utils/array.go | 2 + utils/array_test.go | 3 ++ utils/convert.go | 2 + utils/convert_test.go | 2 + utils/errors.go | 2 + utils/errors_test.go | 2 + wasm/backup_test.go | 2 + wasm/channels.go | 12 +++-- wasm/channels_test.go | 2 + wasm/cmix_test.go | 1 - wasm/connect_test.go | 2 + wasm/fileTransfer_test.go | 2 + wasm_test.go | 83 ++++++++++++++++++++++++++++++++ 21 files changed, 148 insertions(+), 32 deletions(-) create mode 100644 wasm_test.go diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9d646b50..5d70c54f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,10 @@ image: docker-registry.xx.network/elixxir/sysadmin/backend-ci:go1.17-wasm +stages: + - wasm-test + - go-test + - build + build: stage: build script: @@ -10,13 +15,14 @@ build: paths: - release/ -#native-test: -# stage: test -# script: -# - go test ./... - wasm-test: - stage: test + stage: wasm-test script: - export PATH=/root/go/bin:$PATH - - GOOS=js GOARCH=wasm go test ./... + - GOOS=js GOARCH=wasm go test ./... -v + +go-test: + stage: go-test + script: + - go mod vendor -v + - go test ./... -v diff --git a/Makefile b/Makefile index 14bf12e4..b6cb6de0 100644 --- a/Makefile +++ b/Makefile @@ -22,8 +22,19 @@ update_master: GOFLAGS="" go get gitlab.com/xx_network/primitives@master binary: - GOOS=js GOARCH=wasm go build -ldflags '-w -s' -o xxdk.wasm main.go + GOOS=js GOARCH=wasm go build -ldflags '-w -s' -trimpath -o xxdk.wasm main.go + +wasm_tests: + cp utils/utils_js.s utils/utils_js.s.bak + > utils/utils_js.s + -GOOS=js GOARCH=wasm go test ./... -v + mv utils/utils_js.s.bak utils/utils_js.s + +go_tests: + go test ./... -v master: update_master clean build release: update_release clean build + +tests: wasm_tests go_tests diff --git a/go.mod b/go.mod index 6d626319..dc9b76a8 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/hack-pad/go-indexeddb v0.2.0 github.com/pkg/errors v0.9.1 github.com/spf13/jwalterweatherman v1.1.0 - gitlab.com/elixxir/client v1.5.1-0.20220920003304-3bce7b64b826 + gitlab.com/elixxir/client v1.5.1-0.20220920174009-2a53a7ef68b8 gitlab.com/elixxir/crypto v0.0.7-0.20220920002307-5541473e9aa7 gitlab.com/xx_network/primitives v0.0.4-0.20220809193445-9fc0a5209548 ) diff --git a/go.sum b/go.sum index 7b0564e9..b3cee78f 100644 --- a/go.sum +++ b/go.sum @@ -628,26 +628,19 @@ github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f h1:yXGvNBqzZwAhDYlSnxPRbgor6JWoOt1Z7s3z1O9JR40= gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f/go.mod h1:H6jztdm0k+wEV2QGK/KYA+MY9nj9Zzatux/qIvDDv3k= -gitlab.com/elixxir/client v1.5.1-0.20220919211114-4fe61cbe3400 h1:wTpH4idYq9Xe/xYRJ+e5fRjSyj3PnpdfHH+LAfQ9K50= -gitlab.com/elixxir/client v1.5.1-0.20220919211114-4fe61cbe3400/go.mod h1:x6QH8UsPUXpKB/B7byWwsCTBCjx+qiiE7hMvA3rK6v8= -gitlab.com/elixxir/client v1.5.1-0.20220919221644-fed0850ccff6 h1:tVdxY5BMZ9mvIzP0ddJyoYwqKu1YIYQvCiPpKhJ9yFk= -gitlab.com/elixxir/client v1.5.1-0.20220919221644-fed0850ccff6/go.mod h1:TrCtCQ7FAijaNfo6In2s2HDqbNJivxQV3m36ZGyNXFk= -gitlab.com/elixxir/client v1.5.1-0.20220919223314-930e66a05c1a h1:Q8F0uZwni37B0jWbfoTBpRNsvw2yyx5dOZa6O+CGyH8= -gitlab.com/elixxir/client v1.5.1-0.20220919223314-930e66a05c1a/go.mod h1:TrCtCQ7FAijaNfo6In2s2HDqbNJivxQV3m36ZGyNXFk= -gitlab.com/elixxir/client v1.5.1-0.20220919230833-8d25dfcd399e h1:tVDQE+Utif6bzBhiXZuc5Je+4rPgm2WiO9uVBuJsrSk= -gitlab.com/elixxir/client v1.5.1-0.20220919230833-8d25dfcd399e/go.mod h1:TrCtCQ7FAijaNfo6In2s2HDqbNJivxQV3m36ZGyNXFk= -gitlab.com/elixxir/client v1.5.1-0.20220920003304-3bce7b64b826 h1:QaxYWQlCvX9KTJ5MDiNbImE7F01vitU2C2F7ITqE1ws= -gitlab.com/elixxir/client v1.5.1-0.20220920003304-3bce7b64b826/go.mod h1:pX1uLFS8v6pNVzJEcfbMUrYPTWLPl8p71ghqW2Xm0Ns= +gitlab.com/elixxir/client v1.5.1-0.20220920165356-70c6a360f4a4 h1:TScsikTuMTpfssqpJOG7G88icjNQVzZtTP/eJMo+WJo= +gitlab.com/elixxir/client v1.5.1-0.20220920165356-70c6a360f4a4/go.mod h1:pX1uLFS8v6pNVzJEcfbMUrYPTWLPl8p71ghqW2Xm0Ns= +gitlab.com/elixxir/client v1.5.1-0.20220920174009-2a53a7ef68b8 h1:4g5E4wglxzMjm1vEAtxHlpyaU2XrFV1vClIjdhdm2vo= +gitlab.com/elixxir/client v1.5.1-0.20220920174009-2a53a7ef68b8/go.mod h1:pX1uLFS8v6pNVzJEcfbMUrYPTWLPl8p71ghqW2Xm0Ns= +gitlab.com/elixxir/client v1.5.1-0.20220920174748-d717a6622f0e h1:AJfdLR218PR2dfgStDjlKX/F/q19Xh9uHe/g4ZbHLt0= +gitlab.com/elixxir/client v1.5.1-0.20220920174748-d717a6622f0e/go.mod h1:pX1uLFS8v6pNVzJEcfbMUrYPTWLPl8p71ghqW2Xm0Ns= +gitlab.com/elixxir/client v1.5.1-0.20220920180021-72075c042387 h1:nBpcixXVZhwAnbjA0DTuSaidPNFXtUM70FgusV8AwCU= +gitlab.com/elixxir/client v1.5.1-0.20220920180021-72075c042387/go.mod h1:pX1uLFS8v6pNVzJEcfbMUrYPTWLPl8p71ghqW2Xm0Ns= gitlab.com/elixxir/comms v0.0.4-0.20220913220502-eed192f654bd h1:2nHE7EoptSTBFjCxMeAveKT6urbguCwgg8Jx7XYEVe4= gitlab.com/elixxir/comms v0.0.4-0.20220913220502-eed192f654bd/go.mod h1:AO6XkMhaHJW8eXlgL5m3UUcJqsSP8F5Wm1GX+wyq/rw= gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo+K0N2GwRRpaNr+tKXMIOVWzmyUD0SbOu2c= gitlab.com/elixxir/crypto v0.0.3/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA= gitlab.com/elixxir/crypto v0.0.7-0.20220913220142-ab0771bad0af/go.mod h1:QF8SzsrYh9Elip9EUYUDAhPjqO9DGrrrQxYHvn+VXok= -gitlab.com/elixxir/crypto v0.0.7-0.20220919174648-8d1b7f5cacc4/go.mod h1:QF8SzsrYh9Elip9EUYUDAhPjqO9DGrrrQxYHvn+VXok= -gitlab.com/elixxir/crypto v0.0.7-0.20220919183519-5bbca98a2c00 h1:BZ2v6dfdYOUQHbssWJyHv+jNZheORvz4O1nPT8Y2S94= -gitlab.com/elixxir/crypto v0.0.7-0.20220919183519-5bbca98a2c00/go.mod h1:QF8SzsrYh9Elip9EUYUDAhPjqO9DGrrrQxYHvn+VXok= -gitlab.com/elixxir/crypto v0.0.7-0.20220919221444-cb6c054c9fcd h1:uWcp0aokdBnaZhNhlbXiDYusecIP5AaFbJfBtuzEg5A= -gitlab.com/elixxir/crypto v0.0.7-0.20220919221444-cb6c054c9fcd/go.mod h1:QF8SzsrYh9Elip9EUYUDAhPjqO9DGrrrQxYHvn+VXok= gitlab.com/elixxir/crypto v0.0.7-0.20220920002307-5541473e9aa7 h1:9IsBtL8zcUG86XcfNUVIKcnlL5tyKlyQt1cJ5nogr1U= gitlab.com/elixxir/crypto v0.0.7-0.20220920002307-5541473e9aa7/go.mod h1:QF8SzsrYh9Elip9EUYUDAhPjqO9DGrrrQxYHvn+VXok= gitlab.com/elixxir/ekv v0.2.1 h1:dtwbt6KmAXG2Tik5d60iDz2fLhoFBgWwST03p7T+9Is= diff --git a/indexedDb/implementation.go b/indexedDb/implementation.go index 6e6cc915..f8159c51 100644 --- a/indexedDb/implementation.go +++ b/indexedDb/implementation.go @@ -6,7 +6,6 @@ //////////////////////////////////////////////////////////////////////////////// //go:build js && wasm -// +build js,wasm package indexedDb diff --git a/indexedDb/implementation_test.go b/indexedDb/implementation_test.go index 3f008359..a4d5d0bd 100644 --- a/indexedDb/implementation_test.go +++ b/indexedDb/implementation_test.go @@ -5,6 +5,8 @@ // LICENSE file. // //////////////////////////////////////////////////////////////////////////////// +//go:build js && wasm + package indexedDb import ( diff --git a/indexedDb/init.go b/indexedDb/init.go index fa82a6e2..515505c7 100644 --- a/indexedDb/init.go +++ b/indexedDb/init.go @@ -6,7 +6,6 @@ //////////////////////////////////////////////////////////////////////////////// //go:build js && wasm -// +build js,wasm package indexedDb diff --git a/indexedDb/model.go b/indexedDb/model.go index e8050d52..c46bad40 100644 --- a/indexedDb/model.go +++ b/indexedDb/model.go @@ -6,7 +6,6 @@ //////////////////////////////////////////////////////////////////////////////// //go:build js && wasm -// +build js,wasm package indexedDb diff --git a/utils/array.go b/utils/array.go index 9a126696..3b703237 100644 --- a/utils/array.go +++ b/utils/array.go @@ -5,6 +5,8 @@ // LICENSE file. // //////////////////////////////////////////////////////////////////////////////// +//go:build js && wasm + package utils import ( diff --git a/utils/array_test.go b/utils/array_test.go index a420dc84..fa52ee9e 100644 --- a/utils/array_test.go +++ b/utils/array_test.go @@ -5,6 +5,8 @@ // LICENSE file. // //////////////////////////////////////////////////////////////////////////////// +//go:build js && wasm + package utils import ( @@ -28,6 +30,7 @@ var testBytes = [][]byte{ // Tests that a series of Uint8Array Javascript objects are correctly converted // to base 64 strings with Uint8ArrayToBase64. func TestUint8ArrayToBase64(t *testing.T) { + t.Errorf("ERROR") for i, val := range testBytes { // Create Uint8Array and set each element individually jsBytes := Uint8Array.New(len(val)) diff --git a/utils/convert.go b/utils/convert.go index 589979ab..6f4be8fd 100644 --- a/utils/convert.go +++ b/utils/convert.go @@ -5,6 +5,8 @@ // LICENSE file. // //////////////////////////////////////////////////////////////////////////////// +//go:build js && wasm + package utils import ( diff --git a/utils/convert_test.go b/utils/convert_test.go index 7a9e1fb6..9193aa93 100644 --- a/utils/convert_test.go +++ b/utils/convert_test.go @@ -5,6 +5,8 @@ // LICENSE file. // //////////////////////////////////////////////////////////////////////////////// +//go:build js && wasm + package utils import ( diff --git a/utils/errors.go b/utils/errors.go index 2b3f1572..d8de2b0a 100644 --- a/utils/errors.go +++ b/utils/errors.go @@ -5,6 +5,8 @@ // LICENSE file. // //////////////////////////////////////////////////////////////////////////////// +//go:build js && wasm + package utils import ( diff --git a/utils/errors_test.go b/utils/errors_test.go index 94b507d7..f9965e34 100644 --- a/utils/errors_test.go +++ b/utils/errors_test.go @@ -5,6 +5,8 @@ // LICENSE file. // //////////////////////////////////////////////////////////////////////////////// +//go:build js && wasm + package utils import ( diff --git a/wasm/backup_test.go b/wasm/backup_test.go index 8946fc6a..8ac779ae 100644 --- a/wasm/backup_test.go +++ b/wasm/backup_test.go @@ -5,6 +5,8 @@ // LICENSE file. // //////////////////////////////////////////////////////////////////////////////// +//go:build js && wasm + package wasm import ( diff --git a/wasm/channels.go b/wasm/channels.go index d3c497d3..4706c038 100644 --- a/wasm/channels.go +++ b/wasm/channels.go @@ -5,6 +5,8 @@ // LICENSE file. // //////////////////////////////////////////////////////////////////////////////// +//go:build js && wasm + package wasm import ( @@ -116,8 +118,8 @@ func NewChannelsManagerWithIndexedDb(_ js.Value, args []js.Value) interface{} { // using an indexedDb backend and a dummy name server instead of UD. // // Parameters: -// - args[0] - ID of E2e object in tracker (int). This can be retrieved using -// [E2e.GetID]. +// - args[0] - ID of Cmix object in tracker (int). This can be retrieved using +// [Cmix.GetID]. // - args[1] - username (string). // // Returns: @@ -145,8 +147,8 @@ func NewChannelsManagerWithIndexedDbDummyNameService(_ js.Value, args []js.Value // using a Javascript event model backend and a dummy name server instead of UD. // // Parameters: -// - args[0] - ID of E2e object in tracker (int). This can be retrieved using -// [E2e.GetID]. +// - args[0] - ID of Cmix object in tracker (int). This can be retrieved using +// [Cmix.GetID]. // - args[1] - Username (string). // - args[2] - Javascript object that matches the [bindings.EventModel] // interface. @@ -592,6 +594,8 @@ func (ch *ChannelsManager) RegisterReceiveHandler(_ js.Value, args []js.Value) i // Event Model Logic // //////////////////////////////////////////////////////////////////////////////// +// TODO: add comments + type eventModel struct { joinChannel func(args ...interface{}) js.Value leaveChannel func(args ...interface{}) js.Value diff --git a/wasm/channels_test.go b/wasm/channels_test.go index 7f952295..c9ec47fb 100644 --- a/wasm/channels_test.go +++ b/wasm/channels_test.go @@ -5,6 +5,8 @@ // LICENSE file. // //////////////////////////////////////////////////////////////////////////////// +//go:build js && wasm + package wasm import ( diff --git a/wasm/cmix_test.go b/wasm/cmix_test.go index 703440b4..2455ff06 100644 --- a/wasm/cmix_test.go +++ b/wasm/cmix_test.go @@ -6,7 +6,6 @@ //////////////////////////////////////////////////////////////////////////////// //go:build js && wasm -// +build js,wasm package wasm diff --git a/wasm/connect_test.go b/wasm/connect_test.go index c2acb98a..5c973991 100644 --- a/wasm/connect_test.go +++ b/wasm/connect_test.go @@ -5,6 +5,8 @@ // LICENSE file. // //////////////////////////////////////////////////////////////////////////////// +//go:build js && wasm + package wasm import ( diff --git a/wasm/fileTransfer_test.go b/wasm/fileTransfer_test.go index b339903f..ead8b566 100644 --- a/wasm/fileTransfer_test.go +++ b/wasm/fileTransfer_test.go @@ -5,6 +5,8 @@ // LICENSE file. // //////////////////////////////////////////////////////////////////////////////// +//go:build js && wasm + package wasm import ( diff --git a/wasm_test.go b/wasm_test.go new file mode 100644 index 00000000..f8a02021 --- /dev/null +++ b/wasm_test.go @@ -0,0 +1,83 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 xx foundation // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file. // +//////////////////////////////////////////////////////////////////////////////// + +// This file is compiled for all architectures except WebAssembly. +//go:build !js || !wasm + +package xxdk_wasm + +import ( + "go/ast" + "go/parser" + "go/token" + "testing" + "unicode" +) + +// Tests that all public functions in client/bindings are implemented here in +// the WASM bindings. +func TestPublicFunctions(t *testing.T) { + // Exclude these functions from the check. These functions are intentionally + // not implemented. + excludeList := map[string]struct{}{ + // Notifications are not available in the browser + "GetNotificationsReport": {}, + "RegisterForNotifications": {}, + "UnregisterForNotifications": {}, + + // UD not available in the browser + "IsRegisteredWithUD": {}, + "NewOrLoadUd": {}, + "NewUdManagerFromBackup": {}, + "LookupUD": {}, + "MultiLookupUD": {}, + "SearchUD": {}, + + // These functions are used internally by the WASM bindings but are not + // exposed + "NewEventModel": {}, + "NewChannelsManagerGoEventModel": {}, + "NewChannelsManagerGoEventModelDummyNameService": {}, + } + wasmFuncs := getPublicFunctions("wasm", t) + bindingsFuncs := getPublicFunctions( + "vendor/gitlab.com/elixxir/client/bindings", t) + + for fnName := range bindingsFuncs { + if _, exists := wasmFuncs[fnName]; !exists { + if _, exists = excludeList[fnName]; !exists { + t.Errorf("Function %q does not exist in WASM bindings.", fnName) + } else { + delete(wasmFuncs, fnName) + } + } + } +} + +func getPublicFunctions(pkg string, t testing.TB) map[string]*ast.FuncDecl { + set := token.NewFileSet() + packs, err := parser.ParseDir(set, pkg, nil, 0) + if err != nil { + t.Fatalf("Failed to parse package: %+v", err) + } + + funcs := make(map[string]*ast.FuncDecl) + for _, pack := range packs { + for _, f := range pack.Files { + for _, d := range f.Decls { + if fn, isFn := d.(*ast.FuncDecl); isFn { + // Exclude type methods and private functions + if fn.Recv == nil && unicode.IsUpper(rune(fn.Name.Name[0])) { + funcs[fn.Name.Name] = fn + } + } + } + } + } + + return funcs +} -- GitLab