2019-02-04 07:56:53 +08:00
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package integrations
import (
"context"
"fmt"
"io/ioutil"
"net"
"net/http"
"net/url"
"os"
"path/filepath"
"testing"
"time"
2019-03-27 17:33:00 +08:00
"code.gitea.io/gitea/modules/git"
2019-02-04 07:56:53 +08:00
"code.gitea.io/gitea/modules/setting"
2019-02-07 15:13:12 +08:00
"code.gitea.io/gitea/modules/ssh"
2019-02-04 07:56:53 +08:00
"github.com/Unknwon/com"
"github.com/stretchr/testify/assert"
)
func withKeyFile ( t * testing . T , keyname string , callback func ( string ) ) {
keyFile := filepath . Join ( setting . AppDataPath , keyname )
2019-02-07 15:13:12 +08:00
err := ssh . GenKeyPair ( keyFile )
2019-02-04 07:56:53 +08:00
assert . NoError ( t , err )
//Setup ssh wrapper
os . Setenv ( "GIT_SSH_COMMAND" ,
"ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i " +
filepath . Join ( setting . AppWorkPath , keyFile ) )
os . Setenv ( "GIT_SSH_VARIANT" , "ssh" )
callback ( keyFile )
defer os . RemoveAll ( keyFile )
defer os . RemoveAll ( keyFile + ".pub" )
}
func createSSHUrl ( gitPath string , u * url . URL ) * url . URL {
u2 := * u
u2 . Scheme = "ssh"
u2 . User = url . User ( "git" )
u2 . Host = fmt . Sprintf ( "%s:%d" , setting . SSH . ListenHost , setting . SSH . ListenPort )
u2 . Path = gitPath
return & u2
}
func onGiteaRun ( t * testing . T , callback func ( * testing . T , * url . URL ) ) {
2019-04-07 08:25:14 +08:00
prepareTestEnv ( t , 1 )
2019-02-04 07:56:53 +08:00
s := http . Server {
Handler : mac ,
}
u , err := url . Parse ( setting . AppURL )
assert . NoError ( t , err )
listener , err := net . Listen ( "tcp" , u . Host )
assert . NoError ( t , err )
defer func ( ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 2 * time . Minute )
s . Shutdown ( ctx )
cancel ( )
} ( )
go s . Serve ( listener )
//Started by config go ssh.Listen(setting.SSH.ListenHost, setting.SSH.ListenPort, setting.SSH.ServerCiphers, setting.SSH.ServerKeyExchanges, setting.SSH.ServerMACs)
callback ( t , u )
}
func doGitClone ( dstLocalPath string , u * url . URL ) func ( * testing . T ) {
return func ( t * testing . T ) {
assert . NoError ( t , git . Clone ( u . String ( ) , dstLocalPath , git . CloneRepoOptions { } ) )
assert . True ( t , com . IsExist ( filepath . Join ( dstLocalPath , "README.md" ) ) )
}
}
func doGitCloneFail ( dstLocalPath string , u * url . URL ) func ( * testing . T ) {
return func ( t * testing . T ) {
assert . Error ( t , git . Clone ( u . String ( ) , dstLocalPath , git . CloneRepoOptions { } ) )
assert . False ( t , com . IsExist ( filepath . Join ( dstLocalPath , "README.md" ) ) )
}
}
func doGitInitTestRepository ( dstPath string ) func ( * testing . T ) {
return func ( t * testing . T ) {
// Init repository in dstPath
assert . NoError ( t , git . InitRepository ( dstPath , false ) )
assert . NoError ( t , ioutil . WriteFile ( filepath . Join ( dstPath , "README.md" ) , [ ] byte ( fmt . Sprintf ( "# Testing Repository\n\nOriginally created in: %s" , dstPath ) ) , 0644 ) )
assert . NoError ( t , git . AddChanges ( dstPath , true ) )
signature := git . Signature {
Email : "test@example.com" ,
Name : "test" ,
When : time . Now ( ) ,
}
assert . NoError ( t , git . CommitChanges ( dstPath , git . CommitChangesOptions {
Committer : & signature ,
Author : & signature ,
Message : "Initial Commit" ,
} ) )
}
}
func doGitAddRemote ( dstPath , remoteName string , u * url . URL ) func ( * testing . T ) {
return func ( t * testing . T ) {
_ , err := git . NewCommand ( "remote" , "add" , remoteName , u . String ( ) ) . RunInDir ( dstPath )
assert . NoError ( t , err )
}
}
func doGitPushTestRepository ( dstPath , remoteName , branch string ) func ( * testing . T ) {
return func ( t * testing . T ) {
_ , err := git . NewCommand ( "push" , "-u" , remoteName , branch ) . RunInDir ( dstPath )
assert . NoError ( t , err )
}
}
func doGitPushTestRepositoryFail ( dstPath , remoteName , branch string ) func ( * testing . T ) {
return func ( t * testing . T ) {
_ , err := git . NewCommand ( "push" , "-u" , remoteName , branch ) . RunInDir ( dstPath )
assert . Error ( t , err )
}
}