From 5582d99187099a38b251ec8d4dedb3a1febf5172 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Wed, 22 Apr 2020 12:21:12 +0200 Subject: [PATCH] testserver: add Git server --- go.mod | 5 ++ go.sum | 3 + internal/testserver/git.go | 112 +++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 internal/testserver/git.go diff --git a/go.mod b/go.mod index 593c5dd3..3040f457 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/go-logr/logr v0.1.0 github.com/onsi/ginkgo v1.11.0 github.com/onsi/gomega v1.8.1 + github.com/sosedoff/gitkit v0.2.1-0.20191202022816-7182d43c6254 golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 helm.sh/helm/v3 v3.1.2 k8s.io/api v0.17.2 @@ -17,3 +18,7 @@ require ( sigs.k8s.io/controller-runtime v0.5.0 sigs.k8s.io/yaml v1.1.0 ) + +// TODO(hidde): drop when PR is accepted: +// https://github.com/sosedoff/gitkit/pull/21 +replace github.com/sosedoff/gitkit => github.com/hiddeco/gitkit v0.2.1-0.20200422093229-4355fec70348 diff --git a/go.sum b/go.sum index d01480a2..1b2d0336 100644 --- a/go.sum +++ b/go.sum @@ -301,6 +301,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hiddeco/gitkit v0.2.1-0.20200422093229-4355fec70348 h1:m5YZOS7599S/K4swKGL4cDHbo2zqNhZKU2Z1leL7vuY= +github.com/hiddeco/gitkit v0.2.1-0.20200422093229-4355fec70348/go.mod h1:CrGdGLdRnoHSdSLqDVwmNbgUD5BmyapU+w3Z9r+s8xY= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.2.0 h1:yPeWdRnmynF7p+lLYz0H2tthW9lqhMJrQV/U7yy4wX0= @@ -451,6 +453,7 @@ github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uY github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= diff --git a/internal/testserver/git.go b/internal/testserver/git.go new file mode 100644 index 00000000..820dad33 --- /dev/null +++ b/internal/testserver/git.go @@ -0,0 +1,112 @@ +/* +Copyright 2020 The Flux CD contributors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package testserver + +import ( + "io/ioutil" + "net/http/httptest" + "path/filepath" + + "github.com/sosedoff/gitkit" +) + +// NewTempGitServer returns a GitServer with a newly created temp +// dir as repository docroot. +func NewTempGitServer() (*GitServer, error) { + tmpDir, err := ioutil.TempDir("", "git-server-test-") + if err != nil { + return nil, err + } + srv := NewGitServer(tmpDir) + return srv, nil +} + +// NewGitServer returns a GitServer with the given repository docroot +// set. +func NewGitServer(docroot string) *GitServer { + root, err := filepath.Abs(docroot) + if err != nil { + panic(err) + } + return &GitServer{ + config: gitkit.Config{Dir: root}, + } +} + +// GitServer is a git server for testing purposes. +// It can serve git repositories over HTTP and SSH. +type GitServer struct { + config gitkit.Config + httpServer *httptest.Server + sshServer *gitkit.SSH +} + +// StartHTTP starts a new HTTP git server with the current configuration. +func (s *GitServer) StartHTTP() error { + s.StopHTTP() + service := gitkit.New(s.config) + if err := service.Setup(); err != nil { + return err + } + s.httpServer = httptest.NewServer(service) + return nil +} + +// StopHTTP stops the HTTP git server. +func (s *GitServer) StopHTTP() { + if s.httpServer != nil { + s.httpServer.Close() + } + return +} + +// StartSSH starts a new SSH git server with the current configuration. +func (s *GitServer) StartSSH() error { + _ = s.StopSSH() + s.sshServer = gitkit.NewSSH(s.config) + // :0 should result in an OS assigned free port + return s.sshServer.ListenAndServe(":0") +} + +// StopSSH stops the SSH git server. +func (s *GitServer) StopSSH() error { + if s.sshServer != nil { + return s.sshServer.Stop() + } + return nil +} + +// Root returns the repositories root directory. +func (s *GitServer) Root() string { + return s.config.Dir +} + +// HTTPAddress returns the address of the HTTP git server. +func (s *GitServer) HTTPAddress() string { + if s.httpServer != nil { + return s.httpServer.URL + } + return "" +} + +// SSHAddress returns the address of the SSH git server. +func (s *GitServer) SSHAddress() string { + if s.sshServer != nil { + return s.sshServer.Address() + } + return "" +}