From 9d3421389b82d0aa1e5c19db6c577e5556ab5602 Mon Sep 17 00:00:00 2001 From: tan Date: Mon, 29 Mar 2021 07:31:58 +0530 Subject: [PATCH 1/6] simplify CI, include windows and mac Simplify and remove platform dependencies by using pre-generated certificates and test server for CI. Also include Windows and Mac. --- .github/workflows/ci.yml | 44 +++++++++----------------------- Project.toml | 3 ++- README.md | 4 +-- test/.gitignore | 1 + test/buildserver.sh | 36 ++++++++++++++++++++++++++ test/certgen/.gitignore | 5 ---- test/certgen/ca.crt | 24 ++++++++++++++++++ test/certgen/ca.key | 28 ++++++++++++++++++++ test/certgen/ca.srl | 1 + test/certgen/certgen.sh | 21 ++++++++------- test/certgen/server.crt | 22 ++++++++++++++++ test/certgen/server.csr | 18 +++++++++++++ test/certgen/server.key | 28 ++++++++++++++++++++ test/certgen/server.pem | 50 ++++++++++++++++++++++++++++++++++++ test/runserver.sh | 30 ---------------------- test/runtests.jl | 55 ++++++++++++++++++++++++++++++++++++++-- 16 files changed, 286 insertions(+), 84 deletions(-) create mode 100755 test/buildserver.sh delete mode 100644 test/certgen/.gitignore create mode 100644 test/certgen/ca.crt create mode 100644 test/certgen/ca.key create mode 100644 test/certgen/ca.srl create mode 100644 test/certgen/server.crt create mode 100644 test/certgen/server.csr create mode 100644 test/certgen/server.key create mode 100644 test/certgen/server.pem delete mode 100755 test/runserver.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 28fb729..3e8a681 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,8 +4,6 @@ on: branches: [main] tags: ["*"] pull_request: -env: - GO111MODULE: on jobs: test: name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} @@ -22,39 +20,24 @@ jobs: arch: - x64 - x86 - # include: - # # test macOS and Windows with latest Julia only - # - os: macOS-latest - # arch: x64 - # version: 1 - # - os: windows-latest - # arch: x64 - # version: 1 - # - os: windows-latest - # arch: x86 - # version: 1 + include: + # test macOS and Windows with latest Julia only + - os: macOS-latest + arch: x64 + version: 1 + - os: windows-latest + arch: x64 + version: 1 + - os: windows-latest + arch: x86 + version: 1 steps: - uses: actions/checkout@v2 - - name: setup go - uses: actions/setup-go@v2 - with: - go-version: '1.12.9' - - run: go version - name: setup protoc uses: arduino/setup-protoc@v1 with: version: '3.x' - run: protoc --version - - name: generate test certificates - run: test/certgen/certgen.sh - shell: bash - - name: install protoc-gen-go - run: | - go get google.golang.org/protobuf/cmd/protoc-gen-go google.golang.org/grpc/cmd/protoc-gen-go-grpc - shell: bash - - name: start test server - run: test/runserver.sh - shell: bash - uses: julia-actions/setup-julia@v1 with: version: ${{ matrix.version }} @@ -74,7 +57,4 @@ jobs: - uses: julia-actions/julia-processcoverage@v1 - uses: codecov/codecov-action@v1 with: - file: lcov.info - - name: shutdown test server - run: kill `cat test/grpc-go/examples/route_guide/server.pid` - shell: bash \ No newline at end of file + file: lcov.info \ No newline at end of file diff --git a/Project.toml b/Project.toml index bb8930c..d62fcb5 100644 --- a/Project.toml +++ b/Project.toml @@ -16,7 +16,8 @@ julia = "1.3" [extras] Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +Sockets = "6462fe0b-24de-5631-8697-dd941f90decc" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Test", "Random"] +test = ["Random", "Sockets", "Test"] diff --git a/README.md b/README.md index 7094a5b..23abe19 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,7 @@ A Julia gRPC Client. -GitHub Actions : [![Build Status](https://github.com/JuliaComputing/gRPCClient.jl/workflows/CI/badge.svg)](https://github.com/JuliaComputing/gRPCClient.jl/actions?query=workflow%3ACI+branch%3Amain) - -[![Coverage Status](https://coveralls.io/repos/JuliaComputing/gRPCClient.jl/badge.svg?branch=main)](https://coveralls.io/r/JuliaComputing/gRPCClient.jl?branch=main) +[![Build Status](https://github.com/JuliaComputing/gRPCClient.jl/workflows/CI/badge.svg)](https://github.com/JuliaComputing/gRPCClient.jl/actions?query=workflow%3ACI+branch%3Amain) [![codecov.io](http://codecov.io/github/JuliaComputing/gRPCClient.jl/coverage.svg?branch=main)](http://codecov.io/github/JuliaComputing/gRPCClient.jl?branch=main) diff --git a/test/.gitignore b/test/.gitignore index 1a7d908..3513e3f 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -1,2 +1,3 @@ grpc-go server.pid +runserver_* diff --git a/test/buildserver.sh b/test/buildserver.sh new file mode 100755 index 0000000..6c44953 --- /dev/null +++ b/test/buildserver.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -e + +BASEDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cd ${BASEDIR} + +export PATH="$PATH:$(go env GOPATH)/bin" + +git clone -b v1.35.0 https://github.com/grpc/grpc-go +cd grpc-go/examples/route_guide +protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative routeguide/route_guide.proto +sed 's/localhost/0.0.0.0/g' server/server.go > server/server.go.new +rm server/server.go +mv server/server.go.new server/server.go + +export GOOS=linux +export GOARCH=amd64 +echo "building runserver_${GOOS}_${GOARCH}..." +go build -o runserver_${GOOS}_${GOARCH} -i server/server.go +export GOARCH=386 +echo "building runserver_${GOOS}_${GOARCH}..." +go build -o runserver_${GOOS}_${GOARCH} -i server/server.go +export GOOS=windows +export GOARCH=amd64 +echo "building runserver_${GOOS}_${GOARCH}..." +go build -o runserver_${GOOS}_${GOARCH}.exe -i server/server.go +export GOARCH=386 +echo "building runserver_${GOOS}_${GOARCH}..." +go build -o runserver_${GOOS}_${GOARCH}.exe -i server/server.go +export GOOS=darwin +export GOARCH=amd64 +echo "building runserver_${GOOS}_${GOARCH}..." +go build -o runserver_${GOOS}_${GOARCH} -i server/server.go + +mkdir -p ${BASEDIR}/runserver +cp runserver_* ${BASEDIR}/runserver/ diff --git a/test/certgen/.gitignore b/test/certgen/.gitignore deleted file mode 100644 index 3d9e703..0000000 --- a/test/certgen/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -*.crt -*.key -*.pem -*.csr -*.srl diff --git a/test/certgen/ca.crt b/test/certgen/ca.crt new file mode 100644 index 0000000..eb4cb10 --- /dev/null +++ b/test/certgen/ca.crt @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIUJwAMdqYf90hAAsNzrlsQTUf54xAwDQYJKoZIhvcNAQEL +BQAwgZkxCzAJBgNVBAYTAklOMQswCQYDVQQIDAJLQTESMBAGA1UEBwwJQmFuZ2Fs +b3JlMRcwFQYDVQQKDA5KdWxpYUNvbXB1dGluZzETMBEGA1UECwwKZ1JQQ0NsaWVu +dDESMBAGA1UEAwwJbG9jYWxob3N0MScwJQYJKoZIhvcNAQkBFhhjYUBleGFtcGxl +Z3JwY2NsaWVudC5jb20wHhcNMjEwMzI4MTQwODE0WhcNMjEwNDI3MTQwODE0WjCB +mTELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAktBMRIwEAYDVQQHDAlCYW5nYWxvcmUx +FzAVBgNVBAoMDkp1bGlhQ29tcHV0aW5nMRMwEQYDVQQLDApnUlBDQ2xpZW50MRIw +EAYDVQQDDAlsb2NhbGhvc3QxJzAlBgkqhkiG9w0BCQEWGGNhQGV4YW1wbGVncnBj +Y2xpZW50LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANtloAkf +xMRXRJ6A8TeODWI544Lpcxa22whUhHlFAxh9Moy9mTzTWq5mCKg7nUmhSOrJ8y5B +O955AsDy5+kMkz3bPj+bRX3AibgnQPhaO3uydUD0+4iJuVUhzUuKiIidqb/DlXid +h5+mxDiU0l82LxHeGszUb3E/WIBunKVl8Og9HsQcS/fSr2KqEfbEsY4++X2qQQo8 ++pusKZ7NY2lqtixiYdyWkpHok0Fuhff65YI0xemYgdQmH4Gwh0uZoXD4k+3HgI+Q +JFRNzp40gnb/hNu9mc/J4lOM4sbqB68mYONq1weFrdyjWlDEUJ72xlG4V0cKSC+M +i8mOBvcZx226bXsCAwEAAaNTMFEwHQYDVR0OBBYEFNeeA3TKfLxPJGWuxhs9nBzl +yXkbMB8GA1UdIwQYMBaAFNeeA3TKfLxPJGWuxhs9nBzlyXkbMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQELBQADggEBACarQwSHVRDf5ZYt7C4vkL17V9PfH0TE +MxRR6EF1tEEO5tT1RzvWHDhvhb8jLUp3Vu1qD1iU+BJJIO40m82F4zWstRVmr4L/ +oYQElfTFAt+OBQKNEqkKbktgls3+8smEuNZ7bOkjAA64v/OQ79Ah4chq+m+ivUur +v+A2jnn6Yjuo2IC+64dPGc5N0G5EhYYKa1lOMcWluN7rf044GOPzoNKScNSg2uUn +U8lTYkdmVHpfHhI4M9D1o2vgjAksw+wwUZlVOzbJFVq0ooFRO5F9yS013vdJPFBX +5k3lBIkFTefQmoc0MZvSIXHLBwl1KEGguV1i8S+CZNzEZ4egN8ui1CQ= +-----END CERTIFICATE----- diff --git a/test/certgen/ca.key b/test/certgen/ca.key new file mode 100644 index 0000000..dd55712 --- /dev/null +++ b/test/certgen/ca.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDbZaAJH8TEV0Se +gPE3jg1iOeOC6XMWttsIVIR5RQMYfTKMvZk801quZgioO51JoUjqyfMuQTveeQLA +8ufpDJM92z4/m0V9wIm4J0D4Wjt7snVA9PuIiblVIc1LioiInam/w5V4nYefpsQ4 +lNJfNi8R3hrM1G9xP1iAbpylZfDoPR7EHEv30q9iqhH2xLGOPvl9qkEKPPqbrCme +zWNparYsYmHclpKR6JNBboX3+uWCNMXpmIHUJh+BsIdLmaFw+JPtx4CPkCRUTc6e +NIJ2/4TbvZnPyeJTjOLG6gevJmDjatcHha3co1pQxFCe9sZRuFdHCkgvjIvJjgb3 +Gcdtum17AgMBAAECggEAN/oAz/MkD/g4ELzTTppWvdYJPzBy5bu3vLNbrVk3RftD +d3c0brl6LH7p/IphQhT9drIZ8pZAQS3czv/qvaIwuxqCElZ6b3A9cxfI0tSq0o+g +rPcUaizBdYAPUhPBbCHV2pB7RW/j148EB2+pERPRBJ0Hd3VIDbvcx7/xBZ4xzf64 +6rluQERe9PLK/9QHC3600QxJ6rYRUisuAsUTqvHIn5V9rEEWZIZae9e7+08OEGCA +x6JayT1qPJQGHBpYvnvwINdhz0Fo7VePE2MRUCuPvQ7kZ89PbdgvelVdSAP0svub +YoE5PqpNnJ5OAzyweUhLPem1JTAxN8audfLMUg24WQKBgQD+bXo4V5SYKeKNzpT+ +0rvZdgs9qjEDrsBUW260kuNMnAXBIv6aaz9EmtHhemExkCIojE8vi38/ZjkMej5f +30KgY/audHEt2oBHqF9dgkFc0J4dSKVvBKi5gJWP4F3v/U0RZ+/0k5RMS41Tobsh +P1zKWyvaPLSF1bt6q2MNjHmUdQKBgQDcwLoJjnkrPhSadErYS6FAJ3L/SZJfD6MH +5PdsziW9mGnGd97/jT4qxrqnK1LL0p365EISxLjD/4GqbiPd14Op4oek0wHPQVEE +5uNDzV3+wgnM3U/Z0njZDqZKf9csdrckjz1blt8hRC+8pdzlJRXdwWZCfB/OWL+D +kx22g5H8LwKBgE2MAq9/iiviwEmmiGUux9CdGQn/gJb1wWs0vwZMqvjjqSFX0DAy +tgLsCUJnMY6QtsiTE2OTagJh3st9ytsfykfmj/5WQVTPfz/YAtEWbWOjtj2Isdun +mOGJXoyOvzLxinberhVmkdG7SWUPK2ET1e1bYn9O91q/bTgTWsp7YWctAoGANWir +mgRObJfohDX+pbYmnU7uE7XJJBa0awSKmFiH6QcnEE2QNmQF1nOeVTO2JHognsL6 ++W9/BGydAo8DPnkV8dRM3SPwHCTBZV43PgBB7ZEkrdwdpaW2d02EDiI//RH73WyK +e85UzcehhRLcDtSaJbzU8OD3EQWH0F2XosDSYSECgYAue0WAvDS1VgvOosJFf+oW +L3250hMp6vk4fZ0PwGjYrCqdNcPaIvrdOraqzzDAsfyEwxQ9KJ06bqNJLeUI1Yr0 +S1AjjBNT1CxSJPocutvtHD8OnGIwMT3j0YL2Ap2gfnSX4Hz4kp/qDKzdqA8sSsng +PyIwRI0Lafzxy02uQ5pWdg== +-----END PRIVATE KEY----- diff --git a/test/certgen/ca.srl b/test/certgen/ca.srl new file mode 100644 index 0000000..cb5ac81 --- /dev/null +++ b/test/certgen/ca.srl @@ -0,0 +1 @@ +74C2232B01173129DFDA99BF6FE8CB886B66C9FF diff --git a/test/certgen/certgen.sh b/test/certgen/certgen.sh index 8aa16fc..b58149f 100755 --- a/test/certgen/certgen.sh +++ b/test/certgen/certgen.sh @@ -3,8 +3,8 @@ BASEDIR=$(dirname $0) cd $BASEDIR -HOSTNAME=`hostname -f` -# HOSTNAME=localhost +# HOSTNAME=`hostname -f` +HOSTNAME=localhost # Generate self signed root CA cert openssl req -nodes -x509 -newkey rsa:2048 -keyout ca.key -out ca.crt -subj "/C=IN/ST=KA/L=Bangalore/O=JuliaComputing/OU=gRPCClient/CN=${HOSTNAME}/emailAddress=ca@examplegrpcclient.com" @@ -18,12 +18,11 @@ openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out s # Create server PEM file cat server.key server.crt > server.pem - -# Generate client cert to be signed -openssl req -nodes -newkey rsa:2048 -keyout client.key -out client.csr -subj "/C=IN/ST=KA/L=Bangalore/O=JuliaComputing/OU=client/CN=${HOSTNAME}/emailAddress=client@examplegrpcclient.com" - -# Sign the client cert -openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAserial ca.srl -out client.crt - -# Create client PEM file -cat client.key client.crt > client.pem +## Generate client cert to be signed +#openssl req -nodes -newkey rsa:2048 -keyout client.key -out client.csr -subj "/C=IN/ST=KA/L=Bangalore/O=JuliaComputing/OU=client/CN=${HOSTNAME}/emailAddress=client@examplegrpcclient.com" +# +## Sign the client cert +#openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAserial ca.srl -out client.crt +# +## Create client PEM file +#cat client.key client.crt > client.pem diff --git a/test/certgen/server.crt b/test/certgen/server.crt new file mode 100644 index 0000000..9930ce8 --- /dev/null +++ b/test/certgen/server.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDuzCCAqMCFHTCIysBFzEp39qZv2/oy4hrZsn/MA0GCSqGSIb3DQEBCwUAMIGZ +MQswCQYDVQQGEwJJTjELMAkGA1UECAwCS0ExEjAQBgNVBAcMCUJhbmdhbG9yZTEX +MBUGA1UECgwOSnVsaWFDb21wdXRpbmcxEzARBgNVBAsMCmdSUENDbGllbnQxEjAQ +BgNVBAMMCWxvY2FsaG9zdDEnMCUGCSqGSIb3DQEJARYYY2FAZXhhbXBsZWdycGNj +bGllbnQuY29tMB4XDTIxMDMyODE0MDgxNFoXDTIxMDQyNzE0MDgxNFowgZkxCzAJ +BgNVBAYTAklOMQswCQYDVQQIDAJLQTESMBAGA1UEBwwJQmFuZ2Fsb3JlMRcwFQYD +VQQKDA5KdWxpYUNvbXB1dGluZzEPMA0GA1UECwwGc2VydmVyMRIwEAYDVQQDDAls +b2NhbGhvc3QxKzApBgkqhkiG9w0BCQEWHHNlcnZlckBleGFtcGxlZ3JwY2NsaWVu +dC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDeTvUHwEeUtr03 +eEOXIMdxe8llaGCQyLfW/bWRbEWAhQxZonyEv1qYsIjZe33tVCRWtKgmOmw1eCAr +sueR72a53TE0WhCVq8ORnc5lwb5w9gEocpZhOGI9GXTTu9jnhLH2X0HWL2hxcKaB +Fz4rAOLcb4417xNG8R5vz0sNO/L33n0QSoXTX/OU/s68yMVywrfn9v18nBCmQzBf +uxK3wAbaHm5Y95/Y5w9ThwR5IKcSO1toQmHy4Y/1wEKjcTuvEKYCVAdueOKLOS0q +G3npqxgtFuMZaj5MiyMx2r73Dn2e/V32gZ8Svpl3iJQitlq7cm2Lgmx9ZSn6mSb9 +G5hxG72RAgMBAAEwDQYJKoZIhvcNAQELBQADggEBACTg9Aojj/p1xUd9jhIwrFE+ +MlOfyKZda10mOsWJ0Pr4ko0MMrWugTKtOhllNbkn1Qm/oS29zo/KBOghdESxqv8T +HjdkqvSMwV7P7WjMJUNsaljFQ7V2wHTwtfxaBZUVmK9a/CTS0/rzDnTNjF/xXRfS +VqIwU6IodcjC2NSyu2MYjxcIVe2fTA281mK56KIqLrMH9YdzAGPK3pJC+NBoKG3K +v7y8ohCABdv9/C8uqXDpmFg0ctkO+wDDxX9THbiHzzF4sDrMBQ0BgUmM2AWiaLNA +h8FcoyN4hJGuie5SdvMxHZzCs5QcgBvcNiFuhHKi0jaf/dvTXBHNm+iU3fZogcQ= +-----END CERTIFICATE----- diff --git a/test/certgen/server.csr b/test/certgen/server.csr new file mode 100644 index 0000000..b7b74ba --- /dev/null +++ b/test/certgen/server.csr @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIC3zCCAccCAQAwgZkxCzAJBgNVBAYTAklOMQswCQYDVQQIDAJLQTESMBAGA1UE +BwwJQmFuZ2Fsb3JlMRcwFQYDVQQKDA5KdWxpYUNvbXB1dGluZzEPMA0GA1UECwwG +c2VydmVyMRIwEAYDVQQDDAlsb2NhbGhvc3QxKzApBgkqhkiG9w0BCQEWHHNlcnZl +ckBleGFtcGxlZ3JwY2NsaWVudC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDeTvUHwEeUtr03eEOXIMdxe8llaGCQyLfW/bWRbEWAhQxZonyEv1qY +sIjZe33tVCRWtKgmOmw1eCArsueR72a53TE0WhCVq8ORnc5lwb5w9gEocpZhOGI9 +GXTTu9jnhLH2X0HWL2hxcKaBFz4rAOLcb4417xNG8R5vz0sNO/L33n0QSoXTX/OU +/s68yMVywrfn9v18nBCmQzBfuxK3wAbaHm5Y95/Y5w9ThwR5IKcSO1toQmHy4Y/1 +wEKjcTuvEKYCVAdueOKLOS0qG3npqxgtFuMZaj5MiyMx2r73Dn2e/V32gZ8Svpl3 +iJQitlq7cm2Lgmx9ZSn6mSb9G5hxG72RAgMBAAGgADANBgkqhkiG9w0BAQsFAAOC +AQEAEYTN+a6KlmyrpdYnSX/+oMbaMZTlfQqpOoM+8Pkq4uade3xynu3B7WCtOd7K +IvgmWCGNtvnZsSVs7ssop2J4zWRipfjtM0dAtP3JQMiy4pzf2n87gUf4TQWM1PPw +Q9v0ysXdWxxq+a4EVr4V5cJ3KzaONRo8sOFe98B9txiiy9WjOncYyQKAnOJvNtcd +dc9dgLqStEkhtr3dOawjUTI51PQANjv617DRWDiNpR8QuOek0aP+d0Iq5bP3TsWR +QGev+rIZp3DJcn0qygJIit7vDmYZnFfaZ+bIDq32IZ4sQPFPo7wLiaZ+S+IX4ynU ++QJcc3VxCeS9S8f+CKo/NvBRog== +-----END CERTIFICATE REQUEST----- diff --git a/test/certgen/server.key b/test/certgen/server.key new file mode 100644 index 0000000..b65d1d5 --- /dev/null +++ b/test/certgen/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDeTvUHwEeUtr03 +eEOXIMdxe8llaGCQyLfW/bWRbEWAhQxZonyEv1qYsIjZe33tVCRWtKgmOmw1eCAr +sueR72a53TE0WhCVq8ORnc5lwb5w9gEocpZhOGI9GXTTu9jnhLH2X0HWL2hxcKaB +Fz4rAOLcb4417xNG8R5vz0sNO/L33n0QSoXTX/OU/s68yMVywrfn9v18nBCmQzBf +uxK3wAbaHm5Y95/Y5w9ThwR5IKcSO1toQmHy4Y/1wEKjcTuvEKYCVAdueOKLOS0q +G3npqxgtFuMZaj5MiyMx2r73Dn2e/V32gZ8Svpl3iJQitlq7cm2Lgmx9ZSn6mSb9 +G5hxG72RAgMBAAECggEAUep8RbfnaHgRrx/koAqXE00OwAw/EPq1K0Zfok9oKNxd +2aWTBoNQSdU7CBCGLW6E2WJGV5fNicJS8GdDBzZU/wXvfJ/3Xn9lWAHzLPHAT/WG +JbZbjUVuhZ8cumyMl3sA7IzbQKZFcQ+WexjqcoQoFBwTJfKLgueUVJTozd6aQBUO +26af7VMSIWW34RZOJaRQe4CXkMdjcg8STonkahc3tR7RiTeurzdE7ibgLwnWiGDp +YyLbsxVg+tcPHCdvWN9Pe0jN08iYz4QMCq1Xlyyll31GrnK8yw6DGpRCQri8OAHp +dSGSZGLzVI1jh9sPZ3PU8mVKwxtyaMS1HmMB0OkjxQKBgQDz6MkhozKYNHmJSVN/ +zBhnJvEpl+RZQp+Xj5NP2PW4ro8Z8uz9LvCxONo2QRU9i90KkRK+pbWEoMIboyEL +bqB4BK17lwLTom0VoKR7e8OPDXHg2gCOLWnbW9V+tp2akFi3/szXFJ/OMjynqDRl +/fSX5T6+DEM+T+ru781O+7YQuwKBgQDpVA5CjV6KQngBtq/OuHr97nUNF3mahLKX +3673CYlrb37DogpBO4ilr/KbzVt8KKxiCN6jdgmZ9tMyvqVRkSKxu176jPxVO/Zi +KMfttM+fYkskvu0SiBCKR/yHNstSzbNxMjONIGZaUDJ9zZSMEpJM8vWCUSMMpMkE +5Cmdz3kcIwKBgQDrSjPEnD8xbuWTV0YScVtVHs7j9d/Vb5yuw1UzYLNh7hqjyKFv +d/m+rH5sego4bhTUnbA8c3SQtdeqe4pkEdsBDFoicEHM0NJ0W5xwdqrm8+xYIVUJ +0qtcbdGdRCLzOK4tCMKn9QBYFERI481wWjS61u3YvdGcadHTn0cqG02+AwKBgQDe +YlXhCpqDzkxQ3cz8iwn2glMfsjMdmcIaTICXRYirVC4OyZ9agyJ/QI5L/tNmJ+H8 +4hVI2JTYIM80u04Xyuu1WC9zP/K0Th1LezDql32XnHigQjT0h6i0E15VhV0Ow612 +gvFtXecPxwYIr2sYgg7ctmhW13w/bcOGHOypU3hL3wKBgBUMfMCNHNmEJFUqdVg+ +W7hYV3h2G4jkwcuNa/TuhwsHR2XdKdtA3FbtJfV86zzhbeadauwMmet8d23Z5rSu +ceGtDXiXHF58Urin8li5soFpjfXOL3ojwstMZANvBU82XUw3f/oa+Dt7JrWrJSNd +OYhTz0ZiixK7pmBPaa0lrT7i +-----END PRIVATE KEY----- diff --git a/test/certgen/server.pem b/test/certgen/server.pem new file mode 100644 index 0000000..d351073 --- /dev/null +++ b/test/certgen/server.pem @@ -0,0 +1,50 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDeTvUHwEeUtr03 +eEOXIMdxe8llaGCQyLfW/bWRbEWAhQxZonyEv1qYsIjZe33tVCRWtKgmOmw1eCAr +sueR72a53TE0WhCVq8ORnc5lwb5w9gEocpZhOGI9GXTTu9jnhLH2X0HWL2hxcKaB +Fz4rAOLcb4417xNG8R5vz0sNO/L33n0QSoXTX/OU/s68yMVywrfn9v18nBCmQzBf +uxK3wAbaHm5Y95/Y5w9ThwR5IKcSO1toQmHy4Y/1wEKjcTuvEKYCVAdueOKLOS0q +G3npqxgtFuMZaj5MiyMx2r73Dn2e/V32gZ8Svpl3iJQitlq7cm2Lgmx9ZSn6mSb9 +G5hxG72RAgMBAAECggEAUep8RbfnaHgRrx/koAqXE00OwAw/EPq1K0Zfok9oKNxd +2aWTBoNQSdU7CBCGLW6E2WJGV5fNicJS8GdDBzZU/wXvfJ/3Xn9lWAHzLPHAT/WG +JbZbjUVuhZ8cumyMl3sA7IzbQKZFcQ+WexjqcoQoFBwTJfKLgueUVJTozd6aQBUO +26af7VMSIWW34RZOJaRQe4CXkMdjcg8STonkahc3tR7RiTeurzdE7ibgLwnWiGDp +YyLbsxVg+tcPHCdvWN9Pe0jN08iYz4QMCq1Xlyyll31GrnK8yw6DGpRCQri8OAHp +dSGSZGLzVI1jh9sPZ3PU8mVKwxtyaMS1HmMB0OkjxQKBgQDz6MkhozKYNHmJSVN/ +zBhnJvEpl+RZQp+Xj5NP2PW4ro8Z8uz9LvCxONo2QRU9i90KkRK+pbWEoMIboyEL +bqB4BK17lwLTom0VoKR7e8OPDXHg2gCOLWnbW9V+tp2akFi3/szXFJ/OMjynqDRl +/fSX5T6+DEM+T+ru781O+7YQuwKBgQDpVA5CjV6KQngBtq/OuHr97nUNF3mahLKX +3673CYlrb37DogpBO4ilr/KbzVt8KKxiCN6jdgmZ9tMyvqVRkSKxu176jPxVO/Zi +KMfttM+fYkskvu0SiBCKR/yHNstSzbNxMjONIGZaUDJ9zZSMEpJM8vWCUSMMpMkE +5Cmdz3kcIwKBgQDrSjPEnD8xbuWTV0YScVtVHs7j9d/Vb5yuw1UzYLNh7hqjyKFv +d/m+rH5sego4bhTUnbA8c3SQtdeqe4pkEdsBDFoicEHM0NJ0W5xwdqrm8+xYIVUJ +0qtcbdGdRCLzOK4tCMKn9QBYFERI481wWjS61u3YvdGcadHTn0cqG02+AwKBgQDe +YlXhCpqDzkxQ3cz8iwn2glMfsjMdmcIaTICXRYirVC4OyZ9agyJ/QI5L/tNmJ+H8 +4hVI2JTYIM80u04Xyuu1WC9zP/K0Th1LezDql32XnHigQjT0h6i0E15VhV0Ow612 +gvFtXecPxwYIr2sYgg7ctmhW13w/bcOGHOypU3hL3wKBgBUMfMCNHNmEJFUqdVg+ +W7hYV3h2G4jkwcuNa/TuhwsHR2XdKdtA3FbtJfV86zzhbeadauwMmet8d23Z5rSu +ceGtDXiXHF58Urin8li5soFpjfXOL3ojwstMZANvBU82XUw3f/oa+Dt7JrWrJSNd +OYhTz0ZiixK7pmBPaa0lrT7i +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDuzCCAqMCFHTCIysBFzEp39qZv2/oy4hrZsn/MA0GCSqGSIb3DQEBCwUAMIGZ +MQswCQYDVQQGEwJJTjELMAkGA1UECAwCS0ExEjAQBgNVBAcMCUJhbmdhbG9yZTEX +MBUGA1UECgwOSnVsaWFDb21wdXRpbmcxEzARBgNVBAsMCmdSUENDbGllbnQxEjAQ +BgNVBAMMCWxvY2FsaG9zdDEnMCUGCSqGSIb3DQEJARYYY2FAZXhhbXBsZWdycGNj +bGllbnQuY29tMB4XDTIxMDMyODE0MDgxNFoXDTIxMDQyNzE0MDgxNFowgZkxCzAJ +BgNVBAYTAklOMQswCQYDVQQIDAJLQTESMBAGA1UEBwwJQmFuZ2Fsb3JlMRcwFQYD +VQQKDA5KdWxpYUNvbXB1dGluZzEPMA0GA1UECwwGc2VydmVyMRIwEAYDVQQDDAls +b2NhbGhvc3QxKzApBgkqhkiG9w0BCQEWHHNlcnZlckBleGFtcGxlZ3JwY2NsaWVu +dC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDeTvUHwEeUtr03 +eEOXIMdxe8llaGCQyLfW/bWRbEWAhQxZonyEv1qYsIjZe33tVCRWtKgmOmw1eCAr +sueR72a53TE0WhCVq8ORnc5lwb5w9gEocpZhOGI9GXTTu9jnhLH2X0HWL2hxcKaB +Fz4rAOLcb4417xNG8R5vz0sNO/L33n0QSoXTX/OU/s68yMVywrfn9v18nBCmQzBf +uxK3wAbaHm5Y95/Y5w9ThwR5IKcSO1toQmHy4Y/1wEKjcTuvEKYCVAdueOKLOS0q +G3npqxgtFuMZaj5MiyMx2r73Dn2e/V32gZ8Svpl3iJQitlq7cm2Lgmx9ZSn6mSb9 +G5hxG72RAgMBAAEwDQYJKoZIhvcNAQELBQADggEBACTg9Aojj/p1xUd9jhIwrFE+ +MlOfyKZda10mOsWJ0Pr4ko0MMrWugTKtOhllNbkn1Qm/oS29zo/KBOghdESxqv8T +HjdkqvSMwV7P7WjMJUNsaljFQ7V2wHTwtfxaBZUVmK9a/CTS0/rzDnTNjF/xXRfS +VqIwU6IodcjC2NSyu2MYjxcIVe2fTA281mK56KIqLrMH9YdzAGPK3pJC+NBoKG3K +v7y8ohCABdv9/C8uqXDpmFg0ctkO+wDDxX9THbiHzzF4sDrMBQ0BgUmM2AWiaLNA +h8FcoyN4hJGuie5SdvMxHZzCs5QcgBvcNiFuhHKi0jaf/dvTXBHNm+iU3fZogcQ= +-----END CERTIFICATE----- diff --git a/test/runserver.sh b/test/runserver.sh deleted file mode 100755 index 87e9691..0000000 --- a/test/runserver.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -set -e - -BASEDIR=$(dirname $0) -cd ${BASEDIR} - -export PATH="$PATH:$(go env GOPATH)/bin" -CERT_FILE=../../../certgen/server.pem -KEY_FILE=../../../certgen/server.key -HOSTNAME=`hostname -f` - -git clone -b v1.35.0 https://github.com/grpc/grpc-go -cd grpc-go/examples/route_guide -protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative routeguide/route_guide.proto -sed 's/localhost/0.0.0.0/g' server/server.go > server/server.go.new -rm server/server.go -mv server/server.go.new server/server.go -go build -o runserver -i server/server.go - -./runserver --tls=true --cert_file=$CERT_FILE --key_file=$KEY_FILE & -echo $! > server.pid -echo "server pid `cat server.pid`" - -NEXT_WAIT_TIME=0 -until [ $NEXT_WAIT_TIME -eq 10 ] || nc -z 127.0.0.1 10000; do - sleep $(( NEXT_WAIT_TIME++ )) -done -[ $NEXT_WAIT_TIME -lt 5 ] - -echo "server listening" diff --git a/test/runtests.jl b/test/runtests.jl index 51a121b..8c93364 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,7 +1,52 @@ using gRPCClient +using Downloads using Random +using Sockets using Test +const SERVER_RELEASE = "https://github.com/JuliaComputing/gRPCClient.jl/releases/download/testserver_v0.1/" +function server_binary() + arch = (Sys.ARCH === :x86_64) ? "amd64" : "386" + filename = Sys.islinux() ? "runserver_linux_$(arch)" : + Sys.iswindows() ? "runserver_windows_$(arch).exe" : + Sys.isapple() ? "runserver_darwin_$(arch)" : + error("no server binary available for this platform") + source = string(SERVER_RELEASE, filename) + destination = joinpath(@__DIR__, filename) + isfile(destination) || Downloads.download(source, destination) + ((filemode(destination) & 0o777) == 0o777) || chmod(destination, 0o777) + + destination +end + +function start_server() + serverbin = server_binary() + cert_file = joinpath(@__DIR__, "certgen", "server.pem") + key_file = joinpath(@__DIR__, "certgen", "server.key") + @assert isfile(cert_file) && isfile(key_file) + + @info("starting test server", serverbin, cert_file, key_file) + serverproc = run(`$serverbin --tls=true --cert_file=$cert_file --key_file=$key_file`; wait=false) + + listening = timedwait(120.0; pollint=5.0) do + try + sock = connect(ip"127.0.0.1", 10000) + close(sock) + true + catch + false + end + end + + if listening !== :ok + @warn("test server did not start, stopping server") + kill(serverproc) + error("test server did not start") + end + + serverproc +end + function test_generate() @testset "codegen" begin dir = joinpath(@__DIR__, "RouteGuideClients") @@ -22,12 +67,18 @@ if isempty(get(ENV, "JULIA_NO_VERIFY_HOSTS", "")) ENV["JULIA_NO_VERIFY_HOSTS"] = "**" end -server_endpoint = isempty(ARGS) ? "https://$(strip(read(`hostname -f`, String))):10000/" : ARGS[1] +server_endpoint = isempty(ARGS) ? "https://localhost:10000/" : ARGS[1] @info("server endpoint: $server_endpoint") @testset "gRPCClient" begin test_generate() include("test_routeclient.jl") + + serverproc = start_server() + @info("testing routeclinet...") test_clients(server_endpoint) -end \ No newline at end of file + + kill(serverproc) + @info("stopped test server") +end From 8c89760d52be7110048ba33a1c67d3ad8019c89c Mon Sep 17 00:00:00 2001 From: tan Date: Mon, 29 Mar 2021 08:57:27 +0530 Subject: [PATCH 2/6] ensure julia is in path for codegen --- src/generate.jl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/generate.jl b/src/generate.jl index afd0733..5120d94 100644 --- a/src/generate.jl +++ b/src/generate.jl @@ -125,7 +125,11 @@ function generate(proto::String; outdir::String=pwd()) # generate protobuf service mkpath(outdir) - ProtoBuf.protoc(`-I=$protodir --julia_out=$outdir $proto`) + bindir = Sys.BINDIR + pathenv = string(ENV["PATH"], Sys.iswindows() ? ";" : ":", bindir) + withenv("PATH"=>pathenv) do + ProtoBuf.protoc(`-I=$protodir --julia_out=$outdir $proto`) + end # include the generated code and detect service method names generated_module = joinpath(outdir, "$(package).jl") From 81ce3f89540d4fd4422b5da1ea182bc2d5b1ca0f Mon Sep 17 00:00:00 2001 From: tan Date: Mon, 29 Mar 2021 15:53:24 +0530 Subject: [PATCH 3/6] avoid code generation on Windows Code generation on Windows needs additional setup to allow batch file execution, which is not available in CI environments. This skips code generation on Windows and uses pre-generated files. --- test/RouteGuideClients/.gitignore | 1 - test/RouteGuideClients/RouteGuideClients.jl | 79 +++++++ test/RouteGuideClients/route_guide_pb.jl | 237 ++++++++++++++++++++ test/RouteGuideClients/routeguide.jl | 4 + test/runtests.jl | 6 +- 5 files changed, 325 insertions(+), 2 deletions(-) delete mode 100644 test/RouteGuideClients/.gitignore create mode 100644 test/RouteGuideClients/RouteGuideClients.jl create mode 100644 test/RouteGuideClients/route_guide_pb.jl create mode 100644 test/RouteGuideClients/routeguide.jl diff --git a/test/RouteGuideClients/.gitignore b/test/RouteGuideClients/.gitignore deleted file mode 100644 index 27d013c..0000000 --- a/test/RouteGuideClients/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.jl diff --git a/test/RouteGuideClients/RouteGuideClients.jl b/test/RouteGuideClients/RouteGuideClients.jl new file mode 100644 index 0000000..864fcdc --- /dev/null +++ b/test/RouteGuideClients/RouteGuideClients.jl @@ -0,0 +1,79 @@ +module RouteGuideClients +using gRPCClient + +include("routeguide.jl") +using .routeguide + +import Base: show +export RouteGuideBlockingClient, RouteGuideClient + +struct RouteGuideBlockingClient + controller::gRPCController + channel::gRPCChannel + stub::RouteGuideBlockingStub + + function RouteGuideBlockingClient(api_base_url::String; kwargs...) + controller = gRPCController(; kwargs...) + channel = gRPCChannel(api_base_url) + stub = RouteGuideBlockingStub(channel) + new(controller, channel, stub) + end +end + +struct RouteGuideClient + controller::gRPCController + channel::gRPCChannel + stub::RouteGuideStub + + function RouteGuideClient(api_base_url::String; kwargs...) + controller = gRPCController(; kwargs...) + channel = gRPCChannel(api_base_url) + stub = RouteGuideStub(channel) + new(controller, channel, stub) + end +end + +show(io::IO, client::RouteGuideBlockingClient) = print(io, "RouteGuideBlockingClient(", client.channel.baseurl, ")") +show(io::IO, client::RouteGuideClient) = print(io, "RouteGuideClient(", client.channel.baseurl, ")") + +import .routeguide: GetFeature +""" + GetFeature + +- input: routeguide.Point +- output: routeguide.Feature +""" +GetFeature(client::RouteGuideBlockingClient, inp::routeguide.Point) = GetFeature(client.stub, client.controller, inp) +GetFeature(client::RouteGuideClient, inp::routeguide.Point, done::Function) = GetFeature(client.stub, client.controller, inp, done) + +import .routeguide: ListFeatures +""" + ListFeatures + +- input: routeguide.Rectangle +- output: Channel{routeguide.Feature} +""" +ListFeatures(client::RouteGuideBlockingClient, inp::routeguide.Rectangle) = ListFeatures(client.stub, client.controller, inp) +ListFeatures(client::RouteGuideClient, inp::routeguide.Rectangle, done::Function) = ListFeatures(client.stub, client.controller, inp, done) + +import .routeguide: RecordRoute +""" + RecordRoute + +- input: Channel{routeguide.Point} +- output: routeguide.RouteSummary +""" +RecordRoute(client::RouteGuideBlockingClient, inp::Channel{routeguide.Point}) = RecordRoute(client.stub, client.controller, inp) +RecordRoute(client::RouteGuideClient, inp::Channel{routeguide.Point}, done::Function) = RecordRoute(client.stub, client.controller, inp, done) + +import .routeguide: RouteChat +""" + RouteChat + +- input: Channel{routeguide.RouteNote} +- output: Channel{routeguide.RouteNote} +""" +RouteChat(client::RouteGuideBlockingClient, inp::Channel{routeguide.RouteNote}) = RouteChat(client.stub, client.controller, inp) +RouteChat(client::RouteGuideClient, inp::Channel{routeguide.RouteNote}, done::Function) = RouteChat(client.stub, client.controller, inp, done) + +end # module RouteGuideClients diff --git a/test/RouteGuideClients/route_guide_pb.jl b/test/RouteGuideClients/route_guide_pb.jl new file mode 100644 index 0000000..b61f48d --- /dev/null +++ b/test/RouteGuideClients/route_guide_pb.jl @@ -0,0 +1,237 @@ +# syntax: proto3 +using ProtoBuf +import ProtoBuf.meta + +mutable struct Point <: ProtoType + __protobuf_jl_internal_meta::ProtoMeta + __protobuf_jl_internal_values::Dict{Symbol,Any} + __protobuf_jl_internal_defaultset::Set{Symbol} + + function Point(; kwargs...) + obj = new(meta(Point), Dict{Symbol,Any}(), Set{Symbol}()) + values = obj.__protobuf_jl_internal_values + symdict = obj.__protobuf_jl_internal_meta.symdict + for nv in kwargs + fldname, fldval = nv + fldtype = symdict[fldname].jtyp + (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) + values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) + end + obj + end +end # mutable struct Point +const __meta_Point = Ref{ProtoMeta}() +function meta(::Type{Point}) + ProtoBuf.metalock() do + if !isassigned(__meta_Point) + __meta_Point[] = target = ProtoMeta(Point) + allflds = Pair{Symbol,Union{Type,String}}[:latitude => Int32, :longitude => Int32] + meta(target, Point, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) + end + __meta_Point[] + end +end +function Base.getproperty(obj::Point, name::Symbol) + if name === :latitude + return (obj.__protobuf_jl_internal_values[name])::Int32 + elseif name === :longitude + return (obj.__protobuf_jl_internal_values[name])::Int32 + else + getfield(obj, name) + end +end + +mutable struct Rectangle <: ProtoType + __protobuf_jl_internal_meta::ProtoMeta + __protobuf_jl_internal_values::Dict{Symbol,Any} + __protobuf_jl_internal_defaultset::Set{Symbol} + + function Rectangle(; kwargs...) + obj = new(meta(Rectangle), Dict{Symbol,Any}(), Set{Symbol}()) + values = obj.__protobuf_jl_internal_values + symdict = obj.__protobuf_jl_internal_meta.symdict + for nv in kwargs + fldname, fldval = nv + fldtype = symdict[fldname].jtyp + (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) + values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) + end + obj + end +end # mutable struct Rectangle +const __meta_Rectangle = Ref{ProtoMeta}() +function meta(::Type{Rectangle}) + ProtoBuf.metalock() do + if !isassigned(__meta_Rectangle) + __meta_Rectangle[] = target = ProtoMeta(Rectangle) + allflds = Pair{Symbol,Union{Type,String}}[:lo => Point, :hi => Point] + meta(target, Rectangle, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) + end + __meta_Rectangle[] + end +end +function Base.getproperty(obj::Rectangle, name::Symbol) + if name === :lo + return (obj.__protobuf_jl_internal_values[name])::Point + elseif name === :hi + return (obj.__protobuf_jl_internal_values[name])::Point + else + getfield(obj, name) + end +end + +mutable struct Feature <: ProtoType + __protobuf_jl_internal_meta::ProtoMeta + __protobuf_jl_internal_values::Dict{Symbol,Any} + __protobuf_jl_internal_defaultset::Set{Symbol} + + function Feature(; kwargs...) + obj = new(meta(Feature), Dict{Symbol,Any}(), Set{Symbol}()) + values = obj.__protobuf_jl_internal_values + symdict = obj.__protobuf_jl_internal_meta.symdict + for nv in kwargs + fldname, fldval = nv + fldtype = symdict[fldname].jtyp + (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) + values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) + end + obj + end +end # mutable struct Feature +const __meta_Feature = Ref{ProtoMeta}() +function meta(::Type{Feature}) + ProtoBuf.metalock() do + if !isassigned(__meta_Feature) + __meta_Feature[] = target = ProtoMeta(Feature) + allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :location => Point] + meta(target, Feature, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) + end + __meta_Feature[] + end +end +function Base.getproperty(obj::Feature, name::Symbol) + if name === :name + return (obj.__protobuf_jl_internal_values[name])::AbstractString + elseif name === :location + return (obj.__protobuf_jl_internal_values[name])::Point + else + getfield(obj, name) + end +end + +mutable struct RouteNote <: ProtoType + __protobuf_jl_internal_meta::ProtoMeta + __protobuf_jl_internal_values::Dict{Symbol,Any} + __protobuf_jl_internal_defaultset::Set{Symbol} + + function RouteNote(; kwargs...) + obj = new(meta(RouteNote), Dict{Symbol,Any}(), Set{Symbol}()) + values = obj.__protobuf_jl_internal_values + symdict = obj.__protobuf_jl_internal_meta.symdict + for nv in kwargs + fldname, fldval = nv + fldtype = symdict[fldname].jtyp + (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) + values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) + end + obj + end +end # mutable struct RouteNote +const __meta_RouteNote = Ref{ProtoMeta}() +function meta(::Type{RouteNote}) + ProtoBuf.metalock() do + if !isassigned(__meta_RouteNote) + __meta_RouteNote[] = target = ProtoMeta(RouteNote) + allflds = Pair{Symbol,Union{Type,String}}[:location => Point, :message => AbstractString] + meta(target, RouteNote, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) + end + __meta_RouteNote[] + end +end +function Base.getproperty(obj::RouteNote, name::Symbol) + if name === :location + return (obj.__protobuf_jl_internal_values[name])::Point + elseif name === :message + return (obj.__protobuf_jl_internal_values[name])::AbstractString + else + getfield(obj, name) + end +end + +mutable struct RouteSummary <: ProtoType + __protobuf_jl_internal_meta::ProtoMeta + __protobuf_jl_internal_values::Dict{Symbol,Any} + __protobuf_jl_internal_defaultset::Set{Symbol} + + function RouteSummary(; kwargs...) + obj = new(meta(RouteSummary), Dict{Symbol,Any}(), Set{Symbol}()) + values = obj.__protobuf_jl_internal_values + symdict = obj.__protobuf_jl_internal_meta.symdict + for nv in kwargs + fldname, fldval = nv + fldtype = symdict[fldname].jtyp + (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) + values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) + end + obj + end +end # mutable struct RouteSummary +const __meta_RouteSummary = Ref{ProtoMeta}() +function meta(::Type{RouteSummary}) + ProtoBuf.metalock() do + if !isassigned(__meta_RouteSummary) + __meta_RouteSummary[] = target = ProtoMeta(RouteSummary) + allflds = Pair{Symbol,Union{Type,String}}[:point_count => Int32, :feature_count => Int32, :distance => Int32, :elapsed_time => Int32] + meta(target, RouteSummary, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) + end + __meta_RouteSummary[] + end +end +function Base.getproperty(obj::RouteSummary, name::Symbol) + if name === :point_count + return (obj.__protobuf_jl_internal_values[name])::Int32 + elseif name === :feature_count + return (obj.__protobuf_jl_internal_values[name])::Int32 + elseif name === :distance + return (obj.__protobuf_jl_internal_values[name])::Int32 + elseif name === :elapsed_time + return (obj.__protobuf_jl_internal_values[name])::Int32 + else + getfield(obj, name) + end +end + +# service methods for RouteGuide +const _RouteGuide_methods = MethodDescriptor[ + MethodDescriptor("GetFeature", 1, routeguide.Point, routeguide.Feature), + MethodDescriptor("ListFeatures", 2, routeguide.Rectangle, Channel{routeguide.Feature}), + MethodDescriptor("RecordRoute", 3, Channel{routeguide.Point}, routeguide.RouteSummary), + MethodDescriptor("RouteChat", 4, Channel{routeguide.RouteNote}, Channel{routeguide.RouteNote}) + ] # const _RouteGuide_methods +const _RouteGuide_desc = ServiceDescriptor("routeguide.RouteGuide", 1, _RouteGuide_methods) + +RouteGuide(impl::Module) = ProtoService(_RouteGuide_desc, impl) + +mutable struct RouteGuideStub <: AbstractProtoServiceStub{false} + impl::ProtoServiceStub + RouteGuideStub(channel::ProtoRpcChannel) = new(ProtoServiceStub(_RouteGuide_desc, channel)) +end # mutable struct RouteGuideStub + +mutable struct RouteGuideBlockingStub <: AbstractProtoServiceStub{true} + impl::ProtoServiceBlockingStub + RouteGuideBlockingStub(channel::ProtoRpcChannel) = new(ProtoServiceBlockingStub(_RouteGuide_desc, channel)) +end # mutable struct RouteGuideBlockingStub + +GetFeature(stub::RouteGuideStub, controller::ProtoRpcController, inp::routeguide.Point, done::Function) = call_method(stub.impl, _RouteGuide_methods[1], controller, inp, done) +GetFeature(stub::RouteGuideBlockingStub, controller::ProtoRpcController, inp::routeguide.Point) = call_method(stub.impl, _RouteGuide_methods[1], controller, inp) + +ListFeatures(stub::RouteGuideStub, controller::ProtoRpcController, inp::routeguide.Rectangle, done::Function) = call_method(stub.impl, _RouteGuide_methods[2], controller, inp, done) +ListFeatures(stub::RouteGuideBlockingStub, controller::ProtoRpcController, inp::routeguide.Rectangle) = call_method(stub.impl, _RouteGuide_methods[2], controller, inp) + +RecordRoute(stub::RouteGuideStub, controller::ProtoRpcController, inp::Channel{routeguide.Point}, done::Function) = call_method(stub.impl, _RouteGuide_methods[3], controller, inp, done) +RecordRoute(stub::RouteGuideBlockingStub, controller::ProtoRpcController, inp::Channel{routeguide.Point}) = call_method(stub.impl, _RouteGuide_methods[3], controller, inp) + +RouteChat(stub::RouteGuideStub, controller::ProtoRpcController, inp::Channel{routeguide.RouteNote}, done::Function) = call_method(stub.impl, _RouteGuide_methods[4], controller, inp, done) +RouteChat(stub::RouteGuideBlockingStub, controller::ProtoRpcController, inp::Channel{routeguide.RouteNote}) = call_method(stub.impl, _RouteGuide_methods[4], controller, inp) + +export Point, Rectangle, Feature, RouteNote, RouteSummary, RouteGuide, RouteGuideStub, RouteGuideBlockingStub, GetFeature, ListFeatures, RecordRoute, RouteChat diff --git a/test/RouteGuideClients/routeguide.jl b/test/RouteGuideClients/routeguide.jl new file mode 100644 index 0000000..6dbe92d --- /dev/null +++ b/test/RouteGuideClients/routeguide.jl @@ -0,0 +1,4 @@ +module routeguide + const _ProtoBuf_Top_ = @static isdefined(parentmodule(@__MODULE__), :_ProtoBuf_Top_) ? (parentmodule(@__MODULE__))._ProtoBuf_Top_ : parentmodule(@__MODULE__) + include("route_guide_pb.jl") +end diff --git a/test/runtests.jl b/test/runtests.jl index 8c93364..d8579f3 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -71,7 +71,11 @@ server_endpoint = isempty(ARGS) ? "https://localhost:10000/" : ARGS[1] @info("server endpoint: $server_endpoint") @testset "gRPCClient" begin - test_generate() + if !Sys.iswindows() + test_generate() + else + @info("skipping code generation on Windows to avoid needing batch file execution permissions") + end include("test_routeclient.jl") serverproc = start_server() From 5619b32c020806b8db1f2a24d58e9129bbb2c3cb Mon Sep 17 00:00:00 2001 From: tan Date: Mon, 29 Mar 2021 14:14:45 +0530 Subject: [PATCH 4/6] http2 negotiation, check cert revocation modes --- README.md | 6 ++++++ src/curl.jl | 17 +++++++++++++---- src/grpc.jl | 14 +++++++++++++- test/runtests.jl | 20 +++++++++++--------- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 23abe19..00f9a53 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,8 @@ arguments passed to its constructor. gRPCController(; [ maxage::Int = 0, ] [ keepalive::Int64 = 60, ] + [ negotiation::Symbol = :http2_prior_knowledge, ] + [ revocation::Bool = true, ] [ request_timeout::Real = Inf, ] [ connect_timeout::Real = 0, ] [ verbose::Bool = false, ] @@ -80,6 +82,10 @@ gRPCController(; be reused (default 180 seconds, same as setting this to 0). - `keepalive`: interval (seconds) in which to send TCP keepalive messages on the connection (default 60 seconds). +- `negotiation`: how to negotiate HTTP2, can be one of `:http2_prior_knowledge` + (no negotiation, the default), `:http2_tls` (http2 upgrade but only over + tls), or `:http2` (http2 upgrade) +- `revocation`: whether to check for certificate recovation (default is true) - `request_timeout`: request timeout (seconds) - `connect_timeout`: connect timeout (seconds) (default is 300 seconds, same as setting this to 0) diff --git a/src/curl.jl b/src/curl.jl index 4261897..2a3526a 100644 --- a/src/curl.jl +++ b/src/curl.jl @@ -38,12 +38,19 @@ function grpc_headers() headers end -function easy_handle(maxage::Clong, keepalive::Clong) +function easy_handle(maxage::Clong, keepalive::Clong, negotiation::Symbol, revocation::Bool) easy = Curl.Easy() - Curl.setopt(easy, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0) + http_version = (negotiation === :http2) ? CURL_HTTP_VERSION_2_0 : + (negotiation === :http2_tls) ? CURL_HTTP_VERSION_2TLS : + (negotiation === :http2_prior_knowledge) ? CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE : + throw(ArgumentError("unsupported HTTP2 negotiation mode $negotiation")) + Curl.setopt(easy, CURLOPT_HTTP_VERSION, http_version) Curl.setopt(easy, CURLOPT_PIPEWAIT, Clong(1)) Curl.setopt(easy, CURLOPT_POST, Clong(1)) Curl.setopt(easy, CURLOPT_HTTPHEADER, GRPC_STATIC_HEADERS[]) + if !revocation + Curl.setopt(easy, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE) + end if maxage > 0 Curl.setopt(easy, CURLOPT_MAXAGE_CONN, maxage) end @@ -106,10 +113,12 @@ end function grpc_request(downloader::Downloader, url::String, input::Channel{T1}, output::Channel{T2}; maxage::Clong = typemax(Clong), keepalive::Clong = 60, + negotiation::Symbol = :http2_prior_knowledge, + revocation::Bool = true, request_timeout::Real = Inf, connect_timeout::Real = 0, verbose::Bool = false)::gRPCStatus where {T1 <: ProtoType, T2 <: ProtoType} - Curl.with_handle(easy_handle(maxage, keepalive)) do easy + Curl.with_handle(easy_handle(maxage, keepalive, negotiation, revocation)) do easy # setup the request Curl.set_url(easy, url) Curl.set_timeout(easy, request_timeout) @@ -133,4 +142,4 @@ function grpc_request(downloader::Downloader, url::String, input::Channel{T1}, o (easy.code == CURLE_OK) ? gRPCStatus(true, "") : gRPCStatus(false, Curl.get_curl_errstr(easy)) end -end \ No newline at end of file +end diff --git a/src/grpc.jl b/src/grpc.jl index 11aa010..9bcaaa8 100644 --- a/src/grpc.jl +++ b/src/grpc.jl @@ -51,6 +51,8 @@ end gRPCController(; [ maxage::Int = 0, ] [ keepalive::Int64 = 60, ] + [ negotiation::Symbol = :http2_prior_knowledge, ] + [ revocation::Bool = true, ] [ request_timeout::Real = Inf, ] [ connect_timeout::Real = 0, ] [ verbose::Bool = false, ] @@ -61,6 +63,10 @@ Contains settings to control the behavior of gRPC requests. be reused (default 180 seconds, same as setting this to 0). - `keepalive`: interval (seconds) in which to send TCP keepalive messages on the connection (default 60 seconds). +- `negotiation`: how to negotiate HTTP2, can be one of `:http2_prior_knowledge` + (no negotiation, the default), `:http2_tls` (http2 upgrade but only over + tls), or `:http2` (http2 upgrade) +- `revocation`: whether to check for certificate recovation (default is true) - `request_timeout`: request timeout (seconds) - `connect_timeout`: connect timeout (seconds) (default is 300 seconds, same as setting this to 0) @@ -69,6 +75,8 @@ Contains settings to control the behavior of gRPC requests. struct gRPCController <: ProtoRpcController maxage::Clong keepalive::Clong + negotiation::Symbol + revocation::Bool request_timeout::Real connect_timeout::Real verbose::Bool @@ -76,11 +84,13 @@ struct gRPCController <: ProtoRpcController function gRPCController(; maxage::Integer = 0, keepalive::Integer = 60, + negotiation::Symbol = :http2_prior_knowledge, + revocation::Bool = true, request_timeout::Real = Inf, connect_timeout::Real = 0, verbose::Bool = false ) - new(maxage, keepalive, request_timeout, connect_timeout, verbose) + new(maxage, keepalive, negotiation, revocation, request_timeout, connect_timeout, verbose) end end @@ -141,6 +151,8 @@ function call_method(channel::gRPCChannel, service::ServiceDescriptor, method::M status_future = @async grpc_request(channel.downloader, url, input, outchannel; maxage = controller.maxage, keepalive = controller.keepalive, + negotiation = controller.negotiation, + revocation = controller.revocation, request_timeout = controller.request_timeout, connect_timeout = controller.connect_timeout, verbose = controller.verbose, diff --git a/test/runtests.jl b/test/runtests.jl index d8579f3..553a254 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -21,12 +21,14 @@ end function start_server() serverbin = server_binary() - cert_file = joinpath(@__DIR__, "certgen", "server.pem") - key_file = joinpath(@__DIR__, "certgen", "server.key") - @assert isfile(cert_file) && isfile(key_file) + #cert_file = joinpath(@__DIR__, "certgen", "server.pem") + #key_file = joinpath(@__DIR__, "certgen", "server.key") + #@assert isfile(cert_file) && isfile(key_file) - @info("starting test server", serverbin, cert_file, key_file) - serverproc = run(`$serverbin --tls=true --cert_file=$cert_file --key_file=$key_file`; wait=false) + @info("starting test server", serverbin) + #@info("starting test server", serverbin, cert_file, key_file) + #serverproc = run(`$serverbin --tls=true --cert_file=$cert_file --key_file=$key_file`; wait=false) + serverproc = run(`$serverbin`; wait=false) listening = timedwait(120.0; pollint=5.0) do try @@ -58,16 +60,16 @@ function test_generate() end # e.g.: SSL_CERT_FILE=/path/to/gRPCClient/test/certgen/ca.crt julia runtests.jl https://hostname:10000/ -if isempty(get(ENV, "SSL_CERT_FILE", "")) - ENV["SSL_CERT_FILE"] = joinpath(@__DIR__, "certgen", "ca.crt") -end +#if isempty(get(ENV, "SSL_CERT_FILE", "")) +# ENV["SSL_CERT_FILE"] = joinpath(@__DIR__, "certgen", "ca.crt") +#end # switch off host verification for tests if isempty(get(ENV, "JULIA_NO_VERIFY_HOSTS", "")) ENV["JULIA_NO_VERIFY_HOSTS"] = "**" end -server_endpoint = isempty(ARGS) ? "https://localhost:10000/" : ARGS[1] +server_endpoint = isempty(ARGS) ? "http://localhost:10000/" : ARGS[1] @info("server endpoint: $server_endpoint") @testset "gRPCClient" begin From 823bf55345d71b6a5ce082facb02dfd8ebcc2597 Mon Sep 17 00:00:00 2001 From: tan Date: Mon, 29 Mar 2021 15:55:00 +0530 Subject: [PATCH 5/6] yield here avoids strange curl error --- src/curl.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/curl.jl b/src/curl.jl index 2a3526a..bd04229 100644 --- a/src/curl.jl +++ b/src/curl.jl @@ -20,6 +20,7 @@ end function send_data(easy::Curl.Easy, input::Channel{T}) where T <: ProtoType while true + yield() data = isready(input) ? to_delimited_message_bytes(take!(input)) : isopen(input) ? UInt8[] : nothing easy.input === nothing && break easy.input = data From 830bf26efeba78b3aac03bc0fba1dfc35320738b Mon Sep 17 00:00:00 2001 From: tan Date: Mon, 29 Mar 2021 17:02:09 +0530 Subject: [PATCH 6/6] do not need certificates for test anymore --- test/certgen/ca.crt | 24 -------------------- test/certgen/ca.key | 28 ----------------------- test/certgen/ca.srl | 1 - test/certgen/certgen.sh | 28 ----------------------- test/certgen/server.crt | 22 ------------------ test/certgen/server.csr | 18 --------------- test/certgen/server.key | 28 ----------------------- test/certgen/server.pem | 50 ----------------------------------------- test/runtests.jl | 10 --------- 9 files changed, 209 deletions(-) delete mode 100644 test/certgen/ca.crt delete mode 100644 test/certgen/ca.key delete mode 100644 test/certgen/ca.srl delete mode 100755 test/certgen/certgen.sh delete mode 100644 test/certgen/server.crt delete mode 100644 test/certgen/server.csr delete mode 100644 test/certgen/server.key delete mode 100644 test/certgen/server.pem diff --git a/test/certgen/ca.crt b/test/certgen/ca.crt deleted file mode 100644 index eb4cb10..0000000 --- a/test/certgen/ca.crt +++ /dev/null @@ -1,24 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIUJwAMdqYf90hAAsNzrlsQTUf54xAwDQYJKoZIhvcNAQEL -BQAwgZkxCzAJBgNVBAYTAklOMQswCQYDVQQIDAJLQTESMBAGA1UEBwwJQmFuZ2Fs -b3JlMRcwFQYDVQQKDA5KdWxpYUNvbXB1dGluZzETMBEGA1UECwwKZ1JQQ0NsaWVu -dDESMBAGA1UEAwwJbG9jYWxob3N0MScwJQYJKoZIhvcNAQkBFhhjYUBleGFtcGxl -Z3JwY2NsaWVudC5jb20wHhcNMjEwMzI4MTQwODE0WhcNMjEwNDI3MTQwODE0WjCB -mTELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAktBMRIwEAYDVQQHDAlCYW5nYWxvcmUx -FzAVBgNVBAoMDkp1bGlhQ29tcHV0aW5nMRMwEQYDVQQLDApnUlBDQ2xpZW50MRIw -EAYDVQQDDAlsb2NhbGhvc3QxJzAlBgkqhkiG9w0BCQEWGGNhQGV4YW1wbGVncnBj -Y2xpZW50LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANtloAkf -xMRXRJ6A8TeODWI544Lpcxa22whUhHlFAxh9Moy9mTzTWq5mCKg7nUmhSOrJ8y5B -O955AsDy5+kMkz3bPj+bRX3AibgnQPhaO3uydUD0+4iJuVUhzUuKiIidqb/DlXid -h5+mxDiU0l82LxHeGszUb3E/WIBunKVl8Og9HsQcS/fSr2KqEfbEsY4++X2qQQo8 -+pusKZ7NY2lqtixiYdyWkpHok0Fuhff65YI0xemYgdQmH4Gwh0uZoXD4k+3HgI+Q -JFRNzp40gnb/hNu9mc/J4lOM4sbqB68mYONq1weFrdyjWlDEUJ72xlG4V0cKSC+M -i8mOBvcZx226bXsCAwEAAaNTMFEwHQYDVR0OBBYEFNeeA3TKfLxPJGWuxhs9nBzl -yXkbMB8GA1UdIwQYMBaAFNeeA3TKfLxPJGWuxhs9nBzlyXkbMA8GA1UdEwEB/wQF -MAMBAf8wDQYJKoZIhvcNAQELBQADggEBACarQwSHVRDf5ZYt7C4vkL17V9PfH0TE -MxRR6EF1tEEO5tT1RzvWHDhvhb8jLUp3Vu1qD1iU+BJJIO40m82F4zWstRVmr4L/ -oYQElfTFAt+OBQKNEqkKbktgls3+8smEuNZ7bOkjAA64v/OQ79Ah4chq+m+ivUur -v+A2jnn6Yjuo2IC+64dPGc5N0G5EhYYKa1lOMcWluN7rf044GOPzoNKScNSg2uUn -U8lTYkdmVHpfHhI4M9D1o2vgjAksw+wwUZlVOzbJFVq0ooFRO5F9yS013vdJPFBX -5k3lBIkFTefQmoc0MZvSIXHLBwl1KEGguV1i8S+CZNzEZ4egN8ui1CQ= ------END CERTIFICATE----- diff --git a/test/certgen/ca.key b/test/certgen/ca.key deleted file mode 100644 index dd55712..0000000 --- a/test/certgen/ca.key +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDbZaAJH8TEV0Se -gPE3jg1iOeOC6XMWttsIVIR5RQMYfTKMvZk801quZgioO51JoUjqyfMuQTveeQLA -8ufpDJM92z4/m0V9wIm4J0D4Wjt7snVA9PuIiblVIc1LioiInam/w5V4nYefpsQ4 -lNJfNi8R3hrM1G9xP1iAbpylZfDoPR7EHEv30q9iqhH2xLGOPvl9qkEKPPqbrCme -zWNparYsYmHclpKR6JNBboX3+uWCNMXpmIHUJh+BsIdLmaFw+JPtx4CPkCRUTc6e -NIJ2/4TbvZnPyeJTjOLG6gevJmDjatcHha3co1pQxFCe9sZRuFdHCkgvjIvJjgb3 -Gcdtum17AgMBAAECggEAN/oAz/MkD/g4ELzTTppWvdYJPzBy5bu3vLNbrVk3RftD -d3c0brl6LH7p/IphQhT9drIZ8pZAQS3czv/qvaIwuxqCElZ6b3A9cxfI0tSq0o+g -rPcUaizBdYAPUhPBbCHV2pB7RW/j148EB2+pERPRBJ0Hd3VIDbvcx7/xBZ4xzf64 -6rluQERe9PLK/9QHC3600QxJ6rYRUisuAsUTqvHIn5V9rEEWZIZae9e7+08OEGCA -x6JayT1qPJQGHBpYvnvwINdhz0Fo7VePE2MRUCuPvQ7kZ89PbdgvelVdSAP0svub -YoE5PqpNnJ5OAzyweUhLPem1JTAxN8audfLMUg24WQKBgQD+bXo4V5SYKeKNzpT+ -0rvZdgs9qjEDrsBUW260kuNMnAXBIv6aaz9EmtHhemExkCIojE8vi38/ZjkMej5f -30KgY/audHEt2oBHqF9dgkFc0J4dSKVvBKi5gJWP4F3v/U0RZ+/0k5RMS41Tobsh -P1zKWyvaPLSF1bt6q2MNjHmUdQKBgQDcwLoJjnkrPhSadErYS6FAJ3L/SZJfD6MH -5PdsziW9mGnGd97/jT4qxrqnK1LL0p365EISxLjD/4GqbiPd14Op4oek0wHPQVEE -5uNDzV3+wgnM3U/Z0njZDqZKf9csdrckjz1blt8hRC+8pdzlJRXdwWZCfB/OWL+D -kx22g5H8LwKBgE2MAq9/iiviwEmmiGUux9CdGQn/gJb1wWs0vwZMqvjjqSFX0DAy -tgLsCUJnMY6QtsiTE2OTagJh3st9ytsfykfmj/5WQVTPfz/YAtEWbWOjtj2Isdun -mOGJXoyOvzLxinberhVmkdG7SWUPK2ET1e1bYn9O91q/bTgTWsp7YWctAoGANWir -mgRObJfohDX+pbYmnU7uE7XJJBa0awSKmFiH6QcnEE2QNmQF1nOeVTO2JHognsL6 -+W9/BGydAo8DPnkV8dRM3SPwHCTBZV43PgBB7ZEkrdwdpaW2d02EDiI//RH73WyK -e85UzcehhRLcDtSaJbzU8OD3EQWH0F2XosDSYSECgYAue0WAvDS1VgvOosJFf+oW -L3250hMp6vk4fZ0PwGjYrCqdNcPaIvrdOraqzzDAsfyEwxQ9KJ06bqNJLeUI1Yr0 -S1AjjBNT1CxSJPocutvtHD8OnGIwMT3j0YL2Ap2gfnSX4Hz4kp/qDKzdqA8sSsng -PyIwRI0Lafzxy02uQ5pWdg== ------END PRIVATE KEY----- diff --git a/test/certgen/ca.srl b/test/certgen/ca.srl deleted file mode 100644 index cb5ac81..0000000 --- a/test/certgen/ca.srl +++ /dev/null @@ -1 +0,0 @@ -74C2232B01173129DFDA99BF6FE8CB886B66C9FF diff --git a/test/certgen/certgen.sh b/test/certgen/certgen.sh deleted file mode 100755 index b58149f..0000000 --- a/test/certgen/certgen.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -BASEDIR=$(dirname $0) -cd $BASEDIR - -# HOSTNAME=`hostname -f` -HOSTNAME=localhost - -# Generate self signed root CA cert -openssl req -nodes -x509 -newkey rsa:2048 -keyout ca.key -out ca.crt -subj "/C=IN/ST=KA/L=Bangalore/O=JuliaComputing/OU=gRPCClient/CN=${HOSTNAME}/emailAddress=ca@examplegrpcclient.com" - -# Generate server cert to be signed -openssl req -nodes -newkey rsa:2048 -keyout server.key -out server.csr -subj "/C=IN/ST=KA/L=Bangalore/O=JuliaComputing/OU=server/CN=${HOSTNAME}/emailAddress=server@examplegrpcclient.com" - -# Sign the server cert -openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt - -# Create server PEM file -cat server.key server.crt > server.pem - -## Generate client cert to be signed -#openssl req -nodes -newkey rsa:2048 -keyout client.key -out client.csr -subj "/C=IN/ST=KA/L=Bangalore/O=JuliaComputing/OU=client/CN=${HOSTNAME}/emailAddress=client@examplegrpcclient.com" -# -## Sign the client cert -#openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAserial ca.srl -out client.crt -# -## Create client PEM file -#cat client.key client.crt > client.pem diff --git a/test/certgen/server.crt b/test/certgen/server.crt deleted file mode 100644 index 9930ce8..0000000 --- a/test/certgen/server.crt +++ /dev/null @@ -1,22 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDuzCCAqMCFHTCIysBFzEp39qZv2/oy4hrZsn/MA0GCSqGSIb3DQEBCwUAMIGZ -MQswCQYDVQQGEwJJTjELMAkGA1UECAwCS0ExEjAQBgNVBAcMCUJhbmdhbG9yZTEX -MBUGA1UECgwOSnVsaWFDb21wdXRpbmcxEzARBgNVBAsMCmdSUENDbGllbnQxEjAQ -BgNVBAMMCWxvY2FsaG9zdDEnMCUGCSqGSIb3DQEJARYYY2FAZXhhbXBsZWdycGNj -bGllbnQuY29tMB4XDTIxMDMyODE0MDgxNFoXDTIxMDQyNzE0MDgxNFowgZkxCzAJ -BgNVBAYTAklOMQswCQYDVQQIDAJLQTESMBAGA1UEBwwJQmFuZ2Fsb3JlMRcwFQYD -VQQKDA5KdWxpYUNvbXB1dGluZzEPMA0GA1UECwwGc2VydmVyMRIwEAYDVQQDDAls -b2NhbGhvc3QxKzApBgkqhkiG9w0BCQEWHHNlcnZlckBleGFtcGxlZ3JwY2NsaWVu -dC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDeTvUHwEeUtr03 -eEOXIMdxe8llaGCQyLfW/bWRbEWAhQxZonyEv1qYsIjZe33tVCRWtKgmOmw1eCAr -sueR72a53TE0WhCVq8ORnc5lwb5w9gEocpZhOGI9GXTTu9jnhLH2X0HWL2hxcKaB -Fz4rAOLcb4417xNG8R5vz0sNO/L33n0QSoXTX/OU/s68yMVywrfn9v18nBCmQzBf -uxK3wAbaHm5Y95/Y5w9ThwR5IKcSO1toQmHy4Y/1wEKjcTuvEKYCVAdueOKLOS0q -G3npqxgtFuMZaj5MiyMx2r73Dn2e/V32gZ8Svpl3iJQitlq7cm2Lgmx9ZSn6mSb9 -G5hxG72RAgMBAAEwDQYJKoZIhvcNAQELBQADggEBACTg9Aojj/p1xUd9jhIwrFE+ -MlOfyKZda10mOsWJ0Pr4ko0MMrWugTKtOhllNbkn1Qm/oS29zo/KBOghdESxqv8T -HjdkqvSMwV7P7WjMJUNsaljFQ7V2wHTwtfxaBZUVmK9a/CTS0/rzDnTNjF/xXRfS -VqIwU6IodcjC2NSyu2MYjxcIVe2fTA281mK56KIqLrMH9YdzAGPK3pJC+NBoKG3K -v7y8ohCABdv9/C8uqXDpmFg0ctkO+wDDxX9THbiHzzF4sDrMBQ0BgUmM2AWiaLNA -h8FcoyN4hJGuie5SdvMxHZzCs5QcgBvcNiFuhHKi0jaf/dvTXBHNm+iU3fZogcQ= ------END CERTIFICATE----- diff --git a/test/certgen/server.csr b/test/certgen/server.csr deleted file mode 100644 index b7b74ba..0000000 --- a/test/certgen/server.csr +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIC3zCCAccCAQAwgZkxCzAJBgNVBAYTAklOMQswCQYDVQQIDAJLQTESMBAGA1UE -BwwJQmFuZ2Fsb3JlMRcwFQYDVQQKDA5KdWxpYUNvbXB1dGluZzEPMA0GA1UECwwG -c2VydmVyMRIwEAYDVQQDDAlsb2NhbGhvc3QxKzApBgkqhkiG9w0BCQEWHHNlcnZl -ckBleGFtcGxlZ3JwY2NsaWVudC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDeTvUHwEeUtr03eEOXIMdxe8llaGCQyLfW/bWRbEWAhQxZonyEv1qY -sIjZe33tVCRWtKgmOmw1eCArsueR72a53TE0WhCVq8ORnc5lwb5w9gEocpZhOGI9 -GXTTu9jnhLH2X0HWL2hxcKaBFz4rAOLcb4417xNG8R5vz0sNO/L33n0QSoXTX/OU -/s68yMVywrfn9v18nBCmQzBfuxK3wAbaHm5Y95/Y5w9ThwR5IKcSO1toQmHy4Y/1 -wEKjcTuvEKYCVAdueOKLOS0qG3npqxgtFuMZaj5MiyMx2r73Dn2e/V32gZ8Svpl3 -iJQitlq7cm2Lgmx9ZSn6mSb9G5hxG72RAgMBAAGgADANBgkqhkiG9w0BAQsFAAOC -AQEAEYTN+a6KlmyrpdYnSX/+oMbaMZTlfQqpOoM+8Pkq4uade3xynu3B7WCtOd7K -IvgmWCGNtvnZsSVs7ssop2J4zWRipfjtM0dAtP3JQMiy4pzf2n87gUf4TQWM1PPw -Q9v0ysXdWxxq+a4EVr4V5cJ3KzaONRo8sOFe98B9txiiy9WjOncYyQKAnOJvNtcd -dc9dgLqStEkhtr3dOawjUTI51PQANjv617DRWDiNpR8QuOek0aP+d0Iq5bP3TsWR -QGev+rIZp3DJcn0qygJIit7vDmYZnFfaZ+bIDq32IZ4sQPFPo7wLiaZ+S+IX4ynU -+QJcc3VxCeS9S8f+CKo/NvBRog== ------END CERTIFICATE REQUEST----- diff --git a/test/certgen/server.key b/test/certgen/server.key deleted file mode 100644 index b65d1d5..0000000 --- a/test/certgen/server.key +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDeTvUHwEeUtr03 -eEOXIMdxe8llaGCQyLfW/bWRbEWAhQxZonyEv1qYsIjZe33tVCRWtKgmOmw1eCAr -sueR72a53TE0WhCVq8ORnc5lwb5w9gEocpZhOGI9GXTTu9jnhLH2X0HWL2hxcKaB -Fz4rAOLcb4417xNG8R5vz0sNO/L33n0QSoXTX/OU/s68yMVywrfn9v18nBCmQzBf -uxK3wAbaHm5Y95/Y5w9ThwR5IKcSO1toQmHy4Y/1wEKjcTuvEKYCVAdueOKLOS0q -G3npqxgtFuMZaj5MiyMx2r73Dn2e/V32gZ8Svpl3iJQitlq7cm2Lgmx9ZSn6mSb9 -G5hxG72RAgMBAAECggEAUep8RbfnaHgRrx/koAqXE00OwAw/EPq1K0Zfok9oKNxd -2aWTBoNQSdU7CBCGLW6E2WJGV5fNicJS8GdDBzZU/wXvfJ/3Xn9lWAHzLPHAT/WG -JbZbjUVuhZ8cumyMl3sA7IzbQKZFcQ+WexjqcoQoFBwTJfKLgueUVJTozd6aQBUO -26af7VMSIWW34RZOJaRQe4CXkMdjcg8STonkahc3tR7RiTeurzdE7ibgLwnWiGDp -YyLbsxVg+tcPHCdvWN9Pe0jN08iYz4QMCq1Xlyyll31GrnK8yw6DGpRCQri8OAHp -dSGSZGLzVI1jh9sPZ3PU8mVKwxtyaMS1HmMB0OkjxQKBgQDz6MkhozKYNHmJSVN/ -zBhnJvEpl+RZQp+Xj5NP2PW4ro8Z8uz9LvCxONo2QRU9i90KkRK+pbWEoMIboyEL -bqB4BK17lwLTom0VoKR7e8OPDXHg2gCOLWnbW9V+tp2akFi3/szXFJ/OMjynqDRl -/fSX5T6+DEM+T+ru781O+7YQuwKBgQDpVA5CjV6KQngBtq/OuHr97nUNF3mahLKX -3673CYlrb37DogpBO4ilr/KbzVt8KKxiCN6jdgmZ9tMyvqVRkSKxu176jPxVO/Zi -KMfttM+fYkskvu0SiBCKR/yHNstSzbNxMjONIGZaUDJ9zZSMEpJM8vWCUSMMpMkE -5Cmdz3kcIwKBgQDrSjPEnD8xbuWTV0YScVtVHs7j9d/Vb5yuw1UzYLNh7hqjyKFv -d/m+rH5sego4bhTUnbA8c3SQtdeqe4pkEdsBDFoicEHM0NJ0W5xwdqrm8+xYIVUJ -0qtcbdGdRCLzOK4tCMKn9QBYFERI481wWjS61u3YvdGcadHTn0cqG02+AwKBgQDe -YlXhCpqDzkxQ3cz8iwn2glMfsjMdmcIaTICXRYirVC4OyZ9agyJ/QI5L/tNmJ+H8 -4hVI2JTYIM80u04Xyuu1WC9zP/K0Th1LezDql32XnHigQjT0h6i0E15VhV0Ow612 -gvFtXecPxwYIr2sYgg7ctmhW13w/bcOGHOypU3hL3wKBgBUMfMCNHNmEJFUqdVg+ -W7hYV3h2G4jkwcuNa/TuhwsHR2XdKdtA3FbtJfV86zzhbeadauwMmet8d23Z5rSu -ceGtDXiXHF58Urin8li5soFpjfXOL3ojwstMZANvBU82XUw3f/oa+Dt7JrWrJSNd -OYhTz0ZiixK7pmBPaa0lrT7i ------END PRIVATE KEY----- diff --git a/test/certgen/server.pem b/test/certgen/server.pem deleted file mode 100644 index d351073..0000000 --- a/test/certgen/server.pem +++ /dev/null @@ -1,50 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDeTvUHwEeUtr03 -eEOXIMdxe8llaGCQyLfW/bWRbEWAhQxZonyEv1qYsIjZe33tVCRWtKgmOmw1eCAr -sueR72a53TE0WhCVq8ORnc5lwb5w9gEocpZhOGI9GXTTu9jnhLH2X0HWL2hxcKaB -Fz4rAOLcb4417xNG8R5vz0sNO/L33n0QSoXTX/OU/s68yMVywrfn9v18nBCmQzBf -uxK3wAbaHm5Y95/Y5w9ThwR5IKcSO1toQmHy4Y/1wEKjcTuvEKYCVAdueOKLOS0q -G3npqxgtFuMZaj5MiyMx2r73Dn2e/V32gZ8Svpl3iJQitlq7cm2Lgmx9ZSn6mSb9 -G5hxG72RAgMBAAECggEAUep8RbfnaHgRrx/koAqXE00OwAw/EPq1K0Zfok9oKNxd -2aWTBoNQSdU7CBCGLW6E2WJGV5fNicJS8GdDBzZU/wXvfJ/3Xn9lWAHzLPHAT/WG -JbZbjUVuhZ8cumyMl3sA7IzbQKZFcQ+WexjqcoQoFBwTJfKLgueUVJTozd6aQBUO -26af7VMSIWW34RZOJaRQe4CXkMdjcg8STonkahc3tR7RiTeurzdE7ibgLwnWiGDp -YyLbsxVg+tcPHCdvWN9Pe0jN08iYz4QMCq1Xlyyll31GrnK8yw6DGpRCQri8OAHp -dSGSZGLzVI1jh9sPZ3PU8mVKwxtyaMS1HmMB0OkjxQKBgQDz6MkhozKYNHmJSVN/ -zBhnJvEpl+RZQp+Xj5NP2PW4ro8Z8uz9LvCxONo2QRU9i90KkRK+pbWEoMIboyEL -bqB4BK17lwLTom0VoKR7e8OPDXHg2gCOLWnbW9V+tp2akFi3/szXFJ/OMjynqDRl -/fSX5T6+DEM+T+ru781O+7YQuwKBgQDpVA5CjV6KQngBtq/OuHr97nUNF3mahLKX -3673CYlrb37DogpBO4ilr/KbzVt8KKxiCN6jdgmZ9tMyvqVRkSKxu176jPxVO/Zi -KMfttM+fYkskvu0SiBCKR/yHNstSzbNxMjONIGZaUDJ9zZSMEpJM8vWCUSMMpMkE -5Cmdz3kcIwKBgQDrSjPEnD8xbuWTV0YScVtVHs7j9d/Vb5yuw1UzYLNh7hqjyKFv -d/m+rH5sego4bhTUnbA8c3SQtdeqe4pkEdsBDFoicEHM0NJ0W5xwdqrm8+xYIVUJ -0qtcbdGdRCLzOK4tCMKn9QBYFERI481wWjS61u3YvdGcadHTn0cqG02+AwKBgQDe -YlXhCpqDzkxQ3cz8iwn2glMfsjMdmcIaTICXRYirVC4OyZ9agyJ/QI5L/tNmJ+H8 -4hVI2JTYIM80u04Xyuu1WC9zP/K0Th1LezDql32XnHigQjT0h6i0E15VhV0Ow612 -gvFtXecPxwYIr2sYgg7ctmhW13w/bcOGHOypU3hL3wKBgBUMfMCNHNmEJFUqdVg+ -W7hYV3h2G4jkwcuNa/TuhwsHR2XdKdtA3FbtJfV86zzhbeadauwMmet8d23Z5rSu -ceGtDXiXHF58Urin8li5soFpjfXOL3ojwstMZANvBU82XUw3f/oa+Dt7JrWrJSNd -OYhTz0ZiixK7pmBPaa0lrT7i ------END PRIVATE KEY----- ------BEGIN CERTIFICATE----- -MIIDuzCCAqMCFHTCIysBFzEp39qZv2/oy4hrZsn/MA0GCSqGSIb3DQEBCwUAMIGZ -MQswCQYDVQQGEwJJTjELMAkGA1UECAwCS0ExEjAQBgNVBAcMCUJhbmdhbG9yZTEX -MBUGA1UECgwOSnVsaWFDb21wdXRpbmcxEzARBgNVBAsMCmdSUENDbGllbnQxEjAQ -BgNVBAMMCWxvY2FsaG9zdDEnMCUGCSqGSIb3DQEJARYYY2FAZXhhbXBsZWdycGNj -bGllbnQuY29tMB4XDTIxMDMyODE0MDgxNFoXDTIxMDQyNzE0MDgxNFowgZkxCzAJ -BgNVBAYTAklOMQswCQYDVQQIDAJLQTESMBAGA1UEBwwJQmFuZ2Fsb3JlMRcwFQYD -VQQKDA5KdWxpYUNvbXB1dGluZzEPMA0GA1UECwwGc2VydmVyMRIwEAYDVQQDDAls -b2NhbGhvc3QxKzApBgkqhkiG9w0BCQEWHHNlcnZlckBleGFtcGxlZ3JwY2NsaWVu -dC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDeTvUHwEeUtr03 -eEOXIMdxe8llaGCQyLfW/bWRbEWAhQxZonyEv1qYsIjZe33tVCRWtKgmOmw1eCAr -sueR72a53TE0WhCVq8ORnc5lwb5w9gEocpZhOGI9GXTTu9jnhLH2X0HWL2hxcKaB -Fz4rAOLcb4417xNG8R5vz0sNO/L33n0QSoXTX/OU/s68yMVywrfn9v18nBCmQzBf -uxK3wAbaHm5Y95/Y5w9ThwR5IKcSO1toQmHy4Y/1wEKjcTuvEKYCVAdueOKLOS0q -G3npqxgtFuMZaj5MiyMx2r73Dn2e/V32gZ8Svpl3iJQitlq7cm2Lgmx9ZSn6mSb9 -G5hxG72RAgMBAAEwDQYJKoZIhvcNAQELBQADggEBACTg9Aojj/p1xUd9jhIwrFE+ -MlOfyKZda10mOsWJ0Pr4ko0MMrWugTKtOhllNbkn1Qm/oS29zo/KBOghdESxqv8T -HjdkqvSMwV7P7WjMJUNsaljFQ7V2wHTwtfxaBZUVmK9a/CTS0/rzDnTNjF/xXRfS -VqIwU6IodcjC2NSyu2MYjxcIVe2fTA281mK56KIqLrMH9YdzAGPK3pJC+NBoKG3K -v7y8ohCABdv9/C8uqXDpmFg0ctkO+wDDxX9THbiHzzF4sDrMBQ0BgUmM2AWiaLNA -h8FcoyN4hJGuie5SdvMxHZzCs5QcgBvcNiFuhHKi0jaf/dvTXBHNm+iU3fZogcQ= ------END CERTIFICATE----- diff --git a/test/runtests.jl b/test/runtests.jl index 553a254..814f90c 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -21,13 +21,8 @@ end function start_server() serverbin = server_binary() - #cert_file = joinpath(@__DIR__, "certgen", "server.pem") - #key_file = joinpath(@__DIR__, "certgen", "server.key") - #@assert isfile(cert_file) && isfile(key_file) @info("starting test server", serverbin) - #@info("starting test server", serverbin, cert_file, key_file) - #serverproc = run(`$serverbin --tls=true --cert_file=$cert_file --key_file=$key_file`; wait=false) serverproc = run(`$serverbin`; wait=false) listening = timedwait(120.0; pollint=5.0) do @@ -59,11 +54,6 @@ function test_generate() end end -# e.g.: SSL_CERT_FILE=/path/to/gRPCClient/test/certgen/ca.crt julia runtests.jl https://hostname:10000/ -#if isempty(get(ENV, "SSL_CERT_FILE", "")) -# ENV["SSL_CERT_FILE"] = joinpath(@__DIR__, "certgen", "ca.crt") -#end - # switch off host verification for tests if isempty(get(ENV, "JULIA_NO_VERIFY_HOSTS", "")) ENV["JULIA_NO_VERIFY_HOSTS"] = "**"