Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit b35fc66

Browse files
committed
transport: ssh, mocked SSH server, fixes #332
Signed-off-by: Máximo Cuadros <[email protected]>
1 parent 47fc5cb commit b35fc66

File tree

2 files changed

+104
-25
lines changed

2 files changed

+104
-25
lines changed

.travis.yml

-9
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,6 @@ before_install:
2323
- git config --global user.email "[email protected]"
2424
- git config --global user.name "Travis CI"
2525

26-
# we only decrypt the SSH key when we aren't in a pull request
27-
- >
28-
if [ "$TRAVIS_PULL_REQUEST" = "false" ] ; then \
29-
bash .travis/install_key.sh; \
30-
export SSH_TEST_PRIVATE_KEY=$HOME/.travis/deploy.pem; \
31-
else \
32-
export SSH_AUTH_SOCK=""; \
33-
fi
34-
3526
install:
3627
- go get -v -t ./...
3728

+104-16
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,135 @@
11
package ssh
22

33
import (
4+
"fmt"
5+
"io"
6+
"io/ioutil"
7+
"log"
8+
"net"
49
"os"
10+
"os/exec"
11+
"path/filepath"
512

613
"gopkg.in/src-d/go-git.v4/plumbing/transport"
714
"gopkg.in/src-d/go-git.v4/plumbing/transport/test"
815

16+
"github.com/gliderlabs/ssh"
17+
"github.com/src-d/go-git-fixtures"
18+
stdssh "golang.org/x/crypto/ssh"
919
. "gopkg.in/check.v1"
1020
)
1121

1222
type UploadPackSuite struct {
1323
test.UploadPackSuite
24+
fixtures.Suite
25+
26+
port int
27+
base string
1428
}
1529

1630
var _ = Suite(&UploadPackSuite{})
1731

1832
func (s *UploadPackSuite) SetUpSuite(c *C) {
19-
s.setAuthBuilder(c)
20-
s.UploadPackSuite.Client = DefaultClient
33+
s.Suite.SetUpSuite(c)
34+
35+
l, err := net.Listen("tcp", "localhost:0")
36+
c.Assert(err, IsNil)
37+
38+
s.port = l.Addr().(*net.TCPAddr).Port
39+
s.base, err = ioutil.TempDir(os.TempDir(), fmt.Sprintf("go-git-ssh-%d", s.port))
40+
c.Assert(err, IsNil)
41+
42+
DefaultAuthBuilder = func(user string) (AuthMethod, error) {
43+
return &Password{User: user}, nil
44+
}
45+
46+
s.UploadPackSuite.Client = NewClient(&stdssh.ClientConfig{
47+
HostKeyCallback: stdssh.InsecureIgnoreHostKey(),
48+
})
49+
50+
s.UploadPackSuite.Endpoint = s.prepareRepository(c, fixtures.Basic().One(), "basic.git")
51+
s.UploadPackSuite.EmptyEndpoint = s.prepareRepository(c, fixtures.ByTag("empty").One(), "empty.git")
52+
s.UploadPackSuite.NonExistentEndpoint = s.newEndpoint(c, "non-existent.git")
2153

22-
ep, err := transport.NewEndpoint("[email protected]:git-fixtures/basic.git")
54+
server := &ssh.Server{Handler: handlerSSH}
55+
go func() {
56+
log.Fatal(server.Serve(l))
57+
}()
58+
}
59+
60+
func (s *UploadPackSuite) prepareRepository(c *C, f *fixtures.Fixture, name string) transport.Endpoint {
61+
fs := f.DotGit()
62+
63+
err := fixtures.EnsureIsBare(fs)
2364
c.Assert(err, IsNil)
24-
s.UploadPackSuite.Endpoint = ep
2565

26-
ep, err = transport.NewEndpoint("[email protected]:git-fixtures/empty.git")
66+
path := filepath.Join(s.base, name)
67+
err = os.Rename(fs.Root(), path)
2768
c.Assert(err, IsNil)
28-
s.UploadPackSuite.EmptyEndpoint = ep
2969

30-
ep, err = transport.NewEndpoint("[email protected]:git-fixtures/non-existent.git")
70+
return s.newEndpoint(c, name)
71+
}
72+
73+
func (s *UploadPackSuite) newEndpoint(c *C, name string) transport.Endpoint {
74+
ep, err := transport.NewEndpoint(fmt.Sprintf(
75+
"ssh://git@localhost:%d%s/%s", s.port, filepath.ToSlash(s.base), name,
76+
))
77+
3178
c.Assert(err, IsNil)
32-
s.UploadPackSuite.NonExistentEndpoint = ep
79+
return ep
80+
}
81+
82+
func handlerSSH(s ssh.Session) {
83+
cmd, stdin, stderr, stdout, err := buildCommand(s.Command())
84+
if err != nil {
85+
fmt.Println(err)
86+
return
87+
}
88+
89+
if err := cmd.Start(); err != nil {
90+
fmt.Println(err)
91+
return
92+
}
93+
94+
go func() {
95+
defer stdin.Close()
96+
io.Copy(stdin, s)
97+
}()
98+
99+
go func() {
100+
defer stderr.Close()
101+
io.Copy(s.Stderr(), stderr)
102+
}()
103+
104+
defer stdout.Close()
105+
io.Copy(s, stdout)
106+
107+
if err := cmd.Wait(); err != nil {
108+
return
109+
}
33110
}
34111

35-
func (s *UploadPackSuite) setAuthBuilder(c *C) {
36-
privateKey := os.Getenv("SSH_TEST_PRIVATE_KEY")
37-
if privateKey != "" {
38-
DefaultAuthBuilder = func(user string) (AuthMethod, error) {
39-
return NewPublicKeysFromFile(user, privateKey, "")
40-
}
112+
func buildCommand(c []string) (cmd *exec.Cmd, stdin io.WriteCloser, stderr, stdout io.ReadCloser, err error) {
113+
if len(c) < 2 {
114+
err = fmt.Errorf("invalid command")
115+
return
116+
}
117+
118+
cmd = exec.Command(c[0], c[1:]...)
119+
stdout, err = cmd.StdoutPipe()
120+
if err != nil {
121+
return
41122
}
42123

43-
if privateKey == "" && os.Getenv("SSH_AUTH_SOCK") == "" {
44-
c.Skip("SSH_AUTH_SOCK or SSH_TEST_PRIVATE_KEY are required")
124+
stdin, err = cmd.StdinPipe()
125+
if err != nil {
45126
return
46127
}
128+
129+
stderr, err = cmd.StderrPipe()
130+
if err != nil {
131+
return
132+
}
133+
134+
return
47135
}

0 commit comments

Comments
 (0)