cmd/osbuild-composer-dbjobqueue-tests: add migration test
Migration 9 alters the result column in the jobs table is relied on for compose statuses. Because it has to be kept consistent across migrations, add a test to verify this. As a side effect, the test itself handles the migration now, so remove that part from the tests GHA.
This commit is contained in:
parent
c4360a67f5
commit
d7686244cd
3 changed files with 131 additions and 38 deletions
|
|
@ -4,33 +4,74 @@ package main
|
|||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/jackc/pgx/v4"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/osbuild/osbuild-composer/pkg/jobqueue"
|
||||
"github.com/osbuild/osbuild-composer/pkg/jobqueue/dbjobqueue"
|
||||
|
||||
"github.com/osbuild/osbuild-composer/internal/jobqueue/jobqueuetest"
|
||||
)
|
||||
|
||||
func migrate(migration string) error {
|
||||
// migrate
|
||||
gopath, err := exec.Command("go", "env", "GOPATH").Output()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
tern := fmt.Sprintf("%s/bin/tern", strings.TrimSpace(string(gopath)))
|
||||
wd, err := os.Getwd()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if out, err := exec.Command(
|
||||
tern,
|
||||
"migrate",
|
||||
"--conn-string",
|
||||
jobqueuetest.TestDbURL(),
|
||||
"-m",
|
||||
fmt.Sprintf("%s/../../pkg/jobqueue/dbjobqueue/schemas", wd),
|
||||
"-d",
|
||||
migration,
|
||||
).CombinedOutput(); err != nil {
|
||||
fmt.Println("tern output:", string(out))
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func TestJobQueueInterface(t *testing.T) {
|
||||
makeJobQueue := func() (jobqueue.JobQueue, func(), error) {
|
||||
// clear db before each run
|
||||
conn, err := pgx.Connect(context.Background(), jobqueuetest.TestDbURL())
|
||||
makeJobQueue := func(migration string, clean bool) (jobqueue.JobQueue, func(), error) {
|
||||
err := migrate(migration)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
defer conn.Close(context.Background())
|
||||
for _, table := range []string{"job_dependencies", "heartbeats", "jobs"} {
|
||||
_, err = conn.Exec(context.Background(), fmt.Sprintf("DELETE FROM %s", table))
|
||||
|
||||
if clean {
|
||||
conn, err := pgx.Connect(context.Background(), jobqueuetest.TestDbURL())
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
defer conn.Close(context.Background())
|
||||
for _, table := range []string{"job_dependencies", "heartbeats", "jobs"} {
|
||||
_, err = conn.Exec(context.Background(), fmt.Sprintf("DELETE FROM %s", table))
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
}
|
||||
err = conn.Close(context.Background())
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
}
|
||||
err = conn.Close(context.Background())
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
q, err := dbjobqueue.New(jobqueuetest.TestDbURL())
|
||||
|
|
@ -43,5 +84,58 @@ func TestJobQueueInterface(t *testing.T) {
|
|||
return q, stop, nil
|
||||
}
|
||||
|
||||
jobqueuetest.TestJobQueue(t, makeJobQueue)
|
||||
// run first, as migrations aren't reversible
|
||||
testMigrationPath(t, makeJobQueue)
|
||||
|
||||
jobqueuetest.TestJobQueue(t, func () (jobqueue.JobQueue, func(), error) {
|
||||
return makeJobQueue("last", true)
|
||||
})
|
||||
}
|
||||
|
||||
func testMigrationPath(t *testing.T, makeJobQueue func(migration string, clean bool) (jobqueue.JobQueue, func(), error)) {
|
||||
q, stop, err := makeJobQueue("8", false)
|
||||
defer stop()
|
||||
require.NoError(t, err)
|
||||
|
||||
id, err := q.Enqueue("test", "{\"arg\": \"impormtanmt\"}", nil, "")
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, id)
|
||||
id, tok, _, _, _, err := q.Dequeue(context.Background(), uuid.Nil, []string{"test"}, []string{""})
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, id)
|
||||
require.NotEmpty(t, tok)
|
||||
|
||||
// make sure entering escaped nullbytes fails in 8
|
||||
_, err = q.RequeueOrFinishJob(id, 0, &jobqueuetest.TestResult{Logs: []byte("{\"blegh\\u0000\": \"\\u0000reallyimportant stuff!\"}")})
|
||||
require.Error(t, err)
|
||||
|
||||
tr := jobqueuetest.TestResult{Logs: []byte("{\"blegh\": \"really important stuff!\"}")}
|
||||
_, err = q.RequeueOrFinishJob(id, 0, &tr)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NoError(t, migrate("last"))
|
||||
|
||||
// reopen the connection to the db, as the old connection will still treat the result column as jsonb
|
||||
stop()
|
||||
db_q, err := dbjobqueue.New(jobqueuetest.TestDbURL())
|
||||
require.NoError(t, err)
|
||||
defer db_q.Close()
|
||||
require.NoError(t, err)
|
||||
|
||||
// make sure entering escaped nullbytes works in last
|
||||
id2, err := db_q.Enqueue("test", "{\"arg\": \"impormtanmt\"}", nil, "")
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, id2)
|
||||
id2, tok2, _, _, _, err := db_q.Dequeue(context.Background(), uuid.Nil, []string{"test"}, []string{""})
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, id)
|
||||
require.NotEmpty(t, tok2)
|
||||
_, err = db_q.RequeueOrFinishJob(id2, 0, &jobqueuetest.TestResult{Logs: []byte("{\"blegh\\u0000\": \"\\u0000\"}")})
|
||||
require.NoError(t, err)
|
||||
|
||||
_, _, result, _, _, _, _, _, _, err := db_q.JobStatus(id)
|
||||
require.NoError(t, err)
|
||||
var tr2 jobqueuetest.TestResult
|
||||
require.NoError(t, json.Unmarshal(result, &tr2))
|
||||
require.Equal(t, tr, tr2)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue