diff --git a/.github/workflows/tests-and-linters.yml b/.github/workflows/tests-and-linters.yml index 49aa7a5131..602f816597 100644 --- a/.github/workflows/tests-and-linters.yml +++ b/.github/workflows/tests-and-linters.yml @@ -60,6 +60,9 @@ jobs: - name: E2E basic test run: go run mage.go -v TestE2EBasic + - name: E2E shaper test + run: go run mage.go -v TestE2EShaper + e2e-nat: runs-on: ubuntu-latest diff --git a/ci/test/e2e.go b/ci/test/e2e.go index e14754b674..53a3c7a2c5 100644 --- a/ci/test/e2e.go +++ b/ci/test/e2e.go @@ -24,6 +24,7 @@ import ( "github.com/magefile/mage/mg" "github.com/magefile/mage/sh" "github.com/mysteriumnetwork/node/e2e" + e2e_6022 "github.com/mysteriumnetwork/node/e2e/e2e-6022" "github.com/mysteriumnetwork/node/logconfig" "github.com/rs/zerolog/log" ) @@ -50,6 +51,22 @@ func BuildE2eTestBinary() error { return os.Rename("./e2e.test", "./build/e2e/test") } +func BuildE2eShaperTestBinary() error { + err := sh.RunWith(crossCompileFlags, "go", "test", "-c", "./e2e/e2e-6022") + if err != nil { + return err + } + err = sh.RunWith(crossCompileFlags, "go", "build", "-o", "e2e-6022.websvc", "./e2e/e2e-6022/websvc") + if err != nil { + return err + } + + _ = os.Mkdir("./build/e2e/", os.ModeDir) + os.Rename("./e2e-6022.test", "./build/e2e/e2e-6022.test") + os.Rename("./e2e-6022.websvc", "./build/e2e/e2e-6022.websvc") + return nil +} + // BuildE2eDeployerBinary builds the deployer binary for e2e tests. func BuildE2eDeployerBinary() error { return sh.RunWith(crossCompileFlags, "go", "build", "-o", "./build/e2e/deployer", "./e2e/blockchain/deployer.go") @@ -75,6 +92,24 @@ func TestE2EBasic() error { return runner.Test("myst-provider") } +// TestE2EShaper runs end-to-end tests +func TestE2EShaper() error { + logconfig.Bootstrap() + + mg.Deps(BuildE2eShaperTestBinary) + + composeFiles := []string{ + "./docker-compose.e2e-shaper.yml", + } + + runner, cleanup := e2e_6022.NewRunner(composeFiles, "node_e2e_shaper_test", "") + defer cleanup() + if err := runner.Init(); err != nil { + return err + } + return runner.Test() +} + // TestE2ENAT runs end-to-end tests in NAT environment func TestE2ENAT() error { logconfig.Bootstrap() diff --git a/docker-compose.e2e-shaper.yml b/docker-compose.e2e-shaper.yml new file mode 100644 index 0000000000..b3659868d4 --- /dev/null +++ b/docker-compose.e2e-shaper.yml @@ -0,0 +1,25 @@ +version: '3.0' +services: + + e2e-6022-websvc: + build: + context: . + dockerfile: ./e2e/e2e-6022/websvc/Dockerfile + cap_add: + - NET_ADMIN + working_dir: /node + expose: + - 8083 + + #go runner to run go programs inside localnet (usefull for contract deployment or e2e test running) + go-runner: + depends_on: + - e2e-6022-websvc + build: + context: . + dockerfile: ./e2e/gorunner/Dockerfile.precompiled + cap_add: + - NET_ADMIN + volumes: + - ./e2e/blockchain/keystore:/node/keystore + working_dir: /node diff --git a/e2e/e2e-6022/runner.go b/e2e/e2e-6022/runner.go new file mode 100644 index 0000000000..d0667eb0b9 --- /dev/null +++ b/e2e/e2e-6022/runner.go @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2020 The "MysteriumNetwork/node" Authors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package e2e_6022 + +import ( + "github.com/magefile/mage/sh" + "github.com/pkg/errors" + "github.com/rs/zerolog/log" +) + +// NewRunner returns e2e test runners instance +func NewRunner(composeFiles []string, testEnv, services string) (runner *Runner, cleanup func()) { + fileArgs := make([]string, 0) + for _, f := range composeFiles { + fileArgs = append(fileArgs, "-f", f) + } + var args []string + args = append(args, fileArgs...) + args = append(args, "-p", testEnv) + + runner = &Runner{ + compose: sh.RunCmd("docker", append([]string{"compose"}, args...)...), + composeOut: sh.OutCmd("docker", append([]string{"compose"}, args...)...), + testEnv: testEnv, + services: services, + } + return runner, runner.cleanup +} + +// Runner is e2e tests runner responsible for starting test environment and running e2e tests. +type Runner struct { + compose func(args ...string) error + composeOut func(args ...string) (string, error) + etherPassphrase string + testEnv string + services string +} + +// Test starts given provider and consumer nodes and runs e2e tests. +func (r *Runner) Test() (retErr error) { + log.Info().Msg("Running tests for env: " + r.testEnv) + + err := r.compose("run", "go-runner", + "/usr/local/bin/e2e-6022.test", + ) + + retErr = errors.Wrap(err, "tests failed!") + return +} + +func (r *Runner) cleanup() { + log.Info().Msg("Cleaning up") + + _ = r.compose("logs") + if err := r.compose("down", "--volumes", "--remove-orphans", "--timeout", "30"); err != nil { + log.Warn().Err(err).Msg("Cleanup error") + } +} + +// Init starts bug6022.test dependency +func (r *Runner) Init() error { + log.Info().Msg("Starting other services") + if err := r.compose("pull"); err != nil { + return errors.Wrap(err, "could not pull images") + } + + if err := r.compose("up", "-d", "e2e-6022-websvc"); err != nil { + return errors.Wrap(err, "starting other services failed!") + } + + log.Info().Msg("Building app images") + if err := r.compose("build"); err != nil { + return errors.Wrap(err, "building app images failed!") + } + + return nil +} diff --git a/services/wireguard/endpoint/netstack-provider/shaper_service_test.go b/e2e/e2e-6022/shaper_service_test.go similarity index 83% rename from services/wireguard/endpoint/netstack-provider/shaper_service_test.go rename to e2e/e2e-6022/shaper_service_test.go index 4f4526f95a..e7b924b8bc 100644 --- a/services/wireguard/endpoint/netstack-provider/shaper_service_test.go +++ b/e2e/e2e-6022/shaper_service_test.go @@ -15,15 +15,17 @@ * along with this program. If not, see . */ -package netstack_provider +package e2e_6022 import ( "bytes" "encoding/hex" "io" "log" + "net" "net/http" "net/netip" + "net/url" "strings" "testing" @@ -33,6 +35,7 @@ import ( "github.com/mysteriumnetwork/node/config" netstack "github.com/mysteriumnetwork/node/services/wireguard/endpoint/netstack" + netstack_provider "github.com/mysteriumnetwork/node/services/wireguard/endpoint/netstack-provider" ) func startClient(t *testing.T, priv, pubServ wgtypes.Key) { @@ -69,14 +72,26 @@ func startClient(t *testing.T, priv, pubServ wgtypes.Key) { }, } - resp, err := client.Get("http://107.173.23.19:8080/test") + // resolve docker container hostname + u, _ := url.Parse("http://e2e-6022-websvc:8083/test") + address, err := net.LookupHost(u.Hostname()) if err != nil { t.Error(err) return } + u.Host = address[0] + ":" + u.Port() + + resp, err := client.Get(u.String()) + if err != nil { + t.Error(err) + log.Println(err) + return + } + body, err := io.ReadAll(resp.Body) if err != nil { t.Error(err) + log.Println(err) return } log.Println("Reply:", string(body)) @@ -87,12 +102,10 @@ func startClient(t *testing.T, priv, pubServ wgtypes.Key) { ok = "failed" } log.Println("Test result:", ok) - // dev.Down() - // tun.Close() } func startServer(t *testing.T, privKey, pubClinet wgtypes.Key) { - tun, _, _, err := CreateNetTUNWithStack( + tun, _, _, err := netstack_provider.CreateNetTUNWithStack( []netip.Addr{netip.MustParseAddr("192.168.4.1")}, 53, device.DefaultMTU, @@ -124,7 +137,9 @@ func TestShaperEnabled(t *testing.T) { config.Current.SetDefault(config.FlagShaperBandwidth.Name, "6250") config.Current.SetDefault(config.FlagShaperEnabled.Name, "true") - InitUserspaceShaper(nil) + config.FlagFirewallProtectedNetworks.Value = "10.0.0.0/8,127.0.0.0/8" // 192.168.0.0/16, + + netstack_provider.InitUserspaceShaper(nil) privKey1, err := wgtypes.GeneratePrivateKey() if err != nil { @@ -136,6 +151,8 @@ func TestShaperEnabled(t *testing.T) { t.Error(err) return } + _, _ = privKey1, privKey2 + startServer(t, privKey1, privKey2.PublicKey()) startClient(t, privKey2, privKey1.PublicKey()) } diff --git a/e2e/e2e-6022/websvc/Dockerfile b/e2e/e2e-6022/websvc/Dockerfile new file mode 100644 index 0000000000..c4ed464751 --- /dev/null +++ b/e2e/e2e-6022/websvc/Dockerfile @@ -0,0 +1,5 @@ +FROM alpine:3.12 + +COPY ./build/e2e/e2e-6022.websvc /usr/local/bin/e2e-6022.websvc + +ENTRYPOINT ["/usr/local/bin/e2e-6022.websvc"] diff --git a/e2e/e2e-6022/websvc/main.go b/e2e/e2e-6022/websvc/main.go new file mode 100644 index 0000000000..ae49399d0c --- /dev/null +++ b/e2e/e2e-6022/websvc/main.go @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2024 The "MysteriumNetwork/node" Authors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package main + +import ( + "fmt" + "net/http" +) + +func main() { + http.HandleFunc("/", handler) + http.ListenAndServe(":8083", nil) +} + +func handler(w http.ResponseWriter, r *http.Request) { + fmt.Println(r.URL.Path, r.RemoteAddr) + fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:]) +} diff --git a/e2e/gorunner/Dockerfile.precompiled b/e2e/gorunner/Dockerfile.precompiled index 72cc0a2bc3..df8eb84652 100644 --- a/e2e/gorunner/Dockerfile.precompiled +++ b/e2e/gorunner/Dockerfile.precompiled @@ -5,3 +5,4 @@ RUN ln -s /sbin/iptables /usr/sbin/iptables COPY ./build/e2e/test /usr/local/bin/test COPY ./build/e2e/deployer /usr/local/bin/deployer +COPY ./build/e2e/e2e-6022.test /usr/local/bin/e2e-6022.test