feat: test also whether the provider works with Forgejo & Woodpecker

This commit is contained in:
Dawid Wysokiński 2023-08-27 06:36:19 +02:00
parent e925cb39d9
commit b881a7ac23
Signed by: Kichiyaki
GPG Key ID: B5445E357FB8B892
4 changed files with 54 additions and 21 deletions

View File

@ -1,4 +1,4 @@
name: Test
name: CI
on:
push:
@ -12,7 +12,7 @@ permissions:
contents: read
jobs:
test:
ci:
runs-on: ubuntu-latest
services:
dind:
@ -31,4 +31,13 @@ jobs:
- uses: golangci/golangci-lint-action@v3
with:
version: v1.54
- run: go test -race -coverprofile=coverage.txt -covermode=atomic ./...
- name: Gitea 1.20 & Woodpecker 1.0
run: go test -race -coverprofile=coverage.txt -covermode=atomic ./...
env:
GITEA_IMAGE: gitea/gitea:1.20
WOODPECKER_IMAGE: woodpeckerci/woodpecker-server:v1.0
- name: Forgejo 1.20 & Woodpecker 1.0
run: go test -race -coverprofile=coverage.txt -covermode=atomic ./...
env:
GITEA_IMAGE: codeberg.org/forgejo/forgejo:1.20
WOODPECKER_IMAGE: woodpeckerci/woodpecker-server:v1.0

View File

@ -26,8 +26,6 @@ import (
"golang.org/x/oauth2"
)
const resourceExpInSec = 120
var (
giteaClient *gitea.Client
woodpeckerClient woodpecker.Client
@ -55,13 +53,13 @@ func TestMain(m *testing.M) {
_ = resourceWoodpecker.Close()
})
woodpeckerClient = newWoodpeckerClient(resourceWoodpecker.httpURL, resourceWoodpecker.token)
// set required envs
_ = os.Setenv("TF_ACC", "1")
_ = os.Setenv("WOODPECKER_SERVER", resourceWoodpecker.httpURL.String())
_ = os.Setenv("WOODPECKER_TOKEN", resourceWoodpecker.token)
woodpeckerClient = newWoodpeckerClient(resourceWoodpecker.httpURL, resourceWoodpecker.token)
code := m.Run()
// LIFO
@ -94,6 +92,8 @@ func newDockerNetwork(pool *dockertest.Pool) *dockertest.Network {
return network
}
const giteaContainerExpInSec = 120
type giteaResource struct {
docker *dockertest.Resource
httpURL *urlpkg.URL
@ -102,9 +102,10 @@ type giteaResource struct {
}
func runGitea(pool *dockertest.Pool, network *dockertest.Network) giteaResource {
repo, tag := getGiteaRepoTag()
gitea, err := pool.RunWithOptions(&dockertest.RunOptions{
Repository: "gitea/gitea",
Tag: "1.20",
Repository: repo,
Tag: tag,
Networks: []*dockertest.Network{network},
Env: []string{
"GITEA__security__INSTALL_LOCK=true",
@ -119,7 +120,7 @@ func runGitea(pool *dockertest.Pool, network *dockertest.Network) giteaResource
log.Fatalf("couldn't run gitea: %s", err)
}
if err = gitea.Expire(resourceExpInSec); err != nil {
if err = gitea.Expire(giteaContainerExpInSec); err != nil {
log.Fatal(err)
}
@ -171,6 +172,16 @@ func (r giteaResource) Close() error {
return r.docker.Close()
}
const defaultGiteaImage = "gitea/gitea:1.20"
func getGiteaRepoTag() (string, string) {
val := os.Getenv("GITEA_IMAGE")
if val == "" {
val = defaultGiteaImage
}
return docker.ParseRepositoryTag(val)
}
func createGiteaUser(pool *dockertest.Pool, gitea *dockertest.Resource) *urlpkg.Userinfo {
username := strings.ReplaceAll(uuid.NewString(), "-", "")
password := uuid.NewString()
@ -224,6 +235,8 @@ type woodpeckerResource struct {
token string
}
const woodpeckerContainerExpInSec = 120
func runWoodpecker(
pool *dockertest.Pool,
network *dockertest.Network,
@ -245,9 +258,10 @@ func runWoodpecker(
log.Fatalln("couldn't create oauth2 app:", err)
}
repo, tag := getWoodpeckerRepoTag()
woodpecker, err := pool.RunWithOptions(&dockertest.RunOptions{
Repository: "woodpeckerci/woodpecker-server",
Tag: "v1.0.2",
Repository: repo,
Tag: tag,
Networks: []*dockertest.Network{network},
PortBindings: map[docker.Port][]docker.PortBinding{
"8000/tcp": {
@ -281,7 +295,7 @@ func runWoodpecker(
log.Fatalf("couldn't run woodpecker: %s", err)
}
if err = woodpecker.Expire(resourceExpInSec); err != nil {
if err = woodpecker.Expire(woodpeckerContainerExpInSec); err != nil {
log.Fatal(err)
}
@ -324,6 +338,16 @@ func (r woodpeckerResource) Close() error {
return r.docker.Close()
}
const defaultWoodpeckerImage = "woodpeckerci/woodpecker-server:v1.0.2"
func getWoodpeckerRepoTag() (string, string) {
val := os.Getenv("WOODPECKER_IMAGE")
if val == "" {
val = defaultWoodpeckerImage
}
return docker.ParseRepositoryTag(val)
}
type woodpeckerTokenProvider struct {
client *http.Client
oauthApp *gitea.Oauth2
@ -444,7 +468,9 @@ func (p woodpeckerTokenProvider) do(req *http.Request) *http.Response {
log.Fatalf("request to %s failed: %s", req.URL.String(), err)
}
if resp.StatusCode/100 != 2 { // accept only 2XX requests
log.Fatalf("request to %s failed", req.URL.String())
b, _ := io.ReadAll(resp.Body)
_ = resp.Body.Close()
log.Fatalf("request to %s failed (status code = %d): %s", req.URL.String(), resp.StatusCode, b)
}
return resp
@ -461,7 +487,7 @@ func (p woodpeckerTokenProvider) getCSRFTokenFromCookies(cookies []*http.Cookie)
func (p woodpeckerTokenProvider) readCSRFTokenFromWoodpeckerWebConfig(r io.Reader) string {
defer func() {
// discard the remaining bytes
// discard remaining bytes
_, _ = io.Copy(io.Discard, r)
}()

View File

@ -64,12 +64,12 @@ func (p *woodpeckerProvider) Resources(_ context.Context) []func() resource.Reso
}
func (p *woodpeckerProvider) Configure(ctx context.Context, req provider.ConfigureRequest, resp *provider.ConfigureResponse) {
cfg := p.createProviderConfiguration(ctx, req, resp)
cfg := newProviderConfig(ctx, req, resp)
if resp.Diagnostics.HasError() {
return
}
p.client = p.createClient(ctx, cfg, resp)
p.client = newClient(ctx, cfg, resp)
resp.DataSourceData = p.client
resp.ResourceData = p.client
@ -80,7 +80,7 @@ type providerConfig struct {
Token types.String `tfsdk:"token"`
}
func (p *woodpeckerProvider) createProviderConfiguration(
func newProviderConfig(
ctx context.Context,
req provider.ConfigureRequest,
resp *provider.ConfigureResponse,
@ -120,7 +120,7 @@ func (p *woodpeckerProvider) createProviderConfiguration(
return config
}
func (p *woodpeckerProvider) createClient(
func newClient(
ctx context.Context,
config providerConfig,
resp *provider.ConfigureResponse,

View File

@ -9,12 +9,10 @@ import (
"github.com/hashicorp/terraform-plugin-go/tfprotov6"
)
//nolint:unused
var testAccProtoV6ProviderFactories = map[string]func() (tfprotov6.ProviderServer, error){
"woodpecker": providerserver.NewProtocol6WithError(internal.NewProvider("test")()),
}
//nolint:unused
func testAccPreCheck(t *testing.T) {
t.Helper()