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: on:
push: push:
@ -12,7 +12,7 @@ permissions:
contents: read contents: read
jobs: jobs:
test: ci:
runs-on: ubuntu-latest runs-on: ubuntu-latest
services: services:
dind: dind:
@ -31,4 +31,13 @@ jobs:
- uses: golangci/golangci-lint-action@v3 - uses: golangci/golangci-lint-action@v3
with: with:
version: v1.54 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" "golang.org/x/oauth2"
) )
const resourceExpInSec = 120
var ( var (
giteaClient *gitea.Client giteaClient *gitea.Client
woodpeckerClient woodpecker.Client woodpeckerClient woodpecker.Client
@ -55,13 +53,13 @@ func TestMain(m *testing.M) {
_ = resourceWoodpecker.Close() _ = resourceWoodpecker.Close()
}) })
woodpeckerClient = newWoodpeckerClient(resourceWoodpecker.httpURL, resourceWoodpecker.token)
// set required envs // set required envs
_ = os.Setenv("TF_ACC", "1") _ = os.Setenv("TF_ACC", "1")
_ = os.Setenv("WOODPECKER_SERVER", resourceWoodpecker.httpURL.String()) _ = os.Setenv("WOODPECKER_SERVER", resourceWoodpecker.httpURL.String())
_ = os.Setenv("WOODPECKER_TOKEN", resourceWoodpecker.token) _ = os.Setenv("WOODPECKER_TOKEN", resourceWoodpecker.token)
woodpeckerClient = newWoodpeckerClient(resourceWoodpecker.httpURL, resourceWoodpecker.token)
code := m.Run() code := m.Run()
// LIFO // LIFO
@ -94,6 +92,8 @@ func newDockerNetwork(pool *dockertest.Pool) *dockertest.Network {
return network return network
} }
const giteaContainerExpInSec = 120
type giteaResource struct { type giteaResource struct {
docker *dockertest.Resource docker *dockertest.Resource
httpURL *urlpkg.URL httpURL *urlpkg.URL
@ -102,9 +102,10 @@ type giteaResource struct {
} }
func runGitea(pool *dockertest.Pool, network *dockertest.Network) giteaResource { func runGitea(pool *dockertest.Pool, network *dockertest.Network) giteaResource {
repo, tag := getGiteaRepoTag()
gitea, err := pool.RunWithOptions(&dockertest.RunOptions{ gitea, err := pool.RunWithOptions(&dockertest.RunOptions{
Repository: "gitea/gitea", Repository: repo,
Tag: "1.20", Tag: tag,
Networks: []*dockertest.Network{network}, Networks: []*dockertest.Network{network},
Env: []string{ Env: []string{
"GITEA__security__INSTALL_LOCK=true", "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) 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) log.Fatal(err)
} }
@ -171,6 +172,16 @@ func (r giteaResource) Close() error {
return r.docker.Close() 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 { func createGiteaUser(pool *dockertest.Pool, gitea *dockertest.Resource) *urlpkg.Userinfo {
username := strings.ReplaceAll(uuid.NewString(), "-", "") username := strings.ReplaceAll(uuid.NewString(), "-", "")
password := uuid.NewString() password := uuid.NewString()
@ -224,6 +235,8 @@ type woodpeckerResource struct {
token string token string
} }
const woodpeckerContainerExpInSec = 120
func runWoodpecker( func runWoodpecker(
pool *dockertest.Pool, pool *dockertest.Pool,
network *dockertest.Network, network *dockertest.Network,
@ -245,9 +258,10 @@ func runWoodpecker(
log.Fatalln("couldn't create oauth2 app:", err) log.Fatalln("couldn't create oauth2 app:", err)
} }
repo, tag := getWoodpeckerRepoTag()
woodpecker, err := pool.RunWithOptions(&dockertest.RunOptions{ woodpecker, err := pool.RunWithOptions(&dockertest.RunOptions{
Repository: "woodpeckerci/woodpecker-server", Repository: repo,
Tag: "v1.0.2", Tag: tag,
Networks: []*dockertest.Network{network}, Networks: []*dockertest.Network{network},
PortBindings: map[docker.Port][]docker.PortBinding{ PortBindings: map[docker.Port][]docker.PortBinding{
"8000/tcp": { "8000/tcp": {
@ -281,7 +295,7 @@ func runWoodpecker(
log.Fatalf("couldn't run woodpecker: %s", err) 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) log.Fatal(err)
} }
@ -324,6 +338,16 @@ func (r woodpeckerResource) Close() error {
return r.docker.Close() 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 { type woodpeckerTokenProvider struct {
client *http.Client client *http.Client
oauthApp *gitea.Oauth2 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) log.Fatalf("request to %s failed: %s", req.URL.String(), err)
} }
if resp.StatusCode/100 != 2 { // accept only 2XX requests 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 return resp
@ -461,7 +487,7 @@ func (p woodpeckerTokenProvider) getCSRFTokenFromCookies(cookies []*http.Cookie)
func (p woodpeckerTokenProvider) readCSRFTokenFromWoodpeckerWebConfig(r io.Reader) string { func (p woodpeckerTokenProvider) readCSRFTokenFromWoodpeckerWebConfig(r io.Reader) string {
defer func() { defer func() {
// discard the remaining bytes // discard remaining bytes
_, _ = io.Copy(io.Discard, r) _, _ = 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) { 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() { if resp.Diagnostics.HasError() {
return return
} }
p.client = p.createClient(ctx, cfg, resp) p.client = newClient(ctx, cfg, resp)
resp.DataSourceData = p.client resp.DataSourceData = p.client
resp.ResourceData = p.client resp.ResourceData = p.client
@ -80,7 +80,7 @@ type providerConfig struct {
Token types.String `tfsdk:"token"` Token types.String `tfsdk:"token"`
} }
func (p *woodpeckerProvider) createProviderConfiguration( func newProviderConfig(
ctx context.Context, ctx context.Context,
req provider.ConfigureRequest, req provider.ConfigureRequest,
resp *provider.ConfigureResponse, resp *provider.ConfigureResponse,
@ -120,7 +120,7 @@ func (p *woodpeckerProvider) createProviderConfiguration(
return config return config
} }
func (p *woodpeckerProvider) createClient( func newClient(
ctx context.Context, ctx context.Context,
config providerConfig, config providerConfig,
resp *provider.ConfigureResponse, resp *provider.ConfigureResponse,

View File

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