From ed8bcd2f499977185cce90985e984792e03891b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Budai?= Date: Tue, 5 Apr 2022 09:16:51 +0200 Subject: [PATCH] worker: move client test to its own file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This test actually verifies that the client code for OAuth works. As this was the only code that tests client in the file, I think it deserves its own one. Signed-off-by: Ondřej Budai --- internal/worker/client_test.go | 107 +++++++++++++++++++++++++++++++++ internal/worker/server_test.go | 89 --------------------------- 2 files changed, 107 insertions(+), 89 deletions(-) create mode 100644 internal/worker/client_test.go diff --git a/internal/worker/client_test.go b/internal/worker/client_test.go new file mode 100644 index 000000000..f8b3315d6 --- /dev/null +++ b/internal/worker/client_test.go @@ -0,0 +1,107 @@ +package worker_test + +import ( + "encoding/json" + "io/ioutil" + "net/http" + "net/http/httptest" + "os" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/osbuild/osbuild-composer/internal/distro" + "github.com/osbuild/osbuild-composer/internal/distro/test_distro" + "github.com/osbuild/osbuild-composer/internal/jobqueue/fsjobqueue" + "github.com/osbuild/osbuild-composer/internal/worker" +) + +func TestOAuth(t *testing.T) { + tempdir, err := ioutil.TempDir("", "worker-tests-") + require.NoError(t, err) + defer os.RemoveAll(tempdir) + + q, err := fsjobqueue.New(tempdir) + require.NoError(t, err) + config := worker.Config{ + ArtifactsDir: tempdir, + BasePath: "/api/image-builder-worker/v1", + } + workerServer := worker.NewServer(nil, q, config) + handler := workerServer.Handler() + + workSrv := httptest.NewServer(handler) + defer workSrv.Close() + + /* Check that the worker supplies the access token */ + calls := 0 + proxySrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if calls == 0 { + require.Equal(t, "Bearer", r.Header.Get("Authorization")) + w.WriteHeader(http.StatusUnauthorized) + return + } + require.Equal(t, "Bearer accessToken!", r.Header.Get("Authorization")) + handler.ServeHTTP(w, r) + })) + defer proxySrv.Close() + + offlineToken := "someOfflineToken" + /* Start oauth srv supplying the bearer token */ + oauthSrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + calls += 1 + require.Equal(t, "POST", r.Method) + err = r.ParseForm() + require.NoError(t, err) + + require.Equal(t, "refresh_token", r.FormValue("grant_type")) + require.Equal(t, "rhsm-api", r.FormValue("client_id")) + require.Equal(t, offlineToken, r.FormValue("refresh_token")) + + bt := struct { + AccessToken string `json:"access_token"` + }{ + "accessToken!", + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + err = json.NewEncoder(w).Encode(bt) + require.NoError(t, err) + })) + defer oauthSrv.Close() + + distroStruct := test_distro.New() + arch, err := distroStruct.GetArch(test_distro.TestArchName) + if err != nil { + t.Fatalf("error getting arch from distro: %v", err) + } + imageType, err := arch.GetImageType(test_distro.TestImageTypeName) + if err != nil { + t.Fatalf("error getting image type from arch: %v", err) + } + manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, 0) + if err != nil { + t.Fatalf("error creating osbuild manifest: %v", err) + } + + _, err = workerServer.EnqueueOSBuild(arch.Name(), &worker.OSBuildJob{Manifest: manifest}, "") + require.NoError(t, err) + + client, err := worker.NewClient(worker.ClientConfig{ + BaseURL: proxySrv.URL, + TlsConfig: nil, + ClientId: "rhsm-api", + OfflineToken: offlineToken, + OAuthURL: oauthSrv.URL, + BasePath: "/api/image-builder-worker/v1", + }) + require.NoError(t, err) + job, err := client.RequestJob([]string{"osbuild"}, arch.Name()) + require.NoError(t, err) + r := strings.NewReader("artifact contents") + require.NoError(t, job.UploadArtifact("some-artifact", r)) + c, err := job.Canceled() + require.False(t, c) +} diff --git a/internal/worker/server_test.go b/internal/worker/server_test.go index 0e70f969a..22be2243d 100644 --- a/internal/worker/server_test.go +++ b/internal/worker/server_test.go @@ -5,8 +5,6 @@ import ( "encoding/json" "fmt" "net/http" - "net/http/httptest" - "strings" "testing" "time" @@ -291,93 +289,6 @@ func TestUploadAlteredBasePath(t *testing.T) { test.TestRoute(t, handler, false, "PUT", fmt.Sprintf("/api/image-builder-worker/v1/jobs/%s/artifacts/foobar", token), `this is my artifact`, http.StatusOK, `?`) } -func TestOAuth(t *testing.T) { - tempdir := t.TempDir() - - q, err := fsjobqueue.New(tempdir) - require.NoError(t, err) - config := worker.Config{ - ArtifactsDir: tempdir, - BasePath: "/api/image-builder-worker/v1", - } - workerServer := worker.NewServer(nil, q, config) - handler := workerServer.Handler() - - workSrv := httptest.NewServer(handler) - defer workSrv.Close() - - /* Check that the worker supplies the access token */ - calls := 0 - proxySrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if calls == 0 { - require.Equal(t, "Bearer", r.Header.Get("Authorization")) - w.WriteHeader(http.StatusUnauthorized) - return - } - require.Equal(t, "Bearer accessToken!", r.Header.Get("Authorization")) - handler.ServeHTTP(w, r) - })) - defer proxySrv.Close() - - offlineToken := "someOfflineToken" - /* Start oauth srv supplying the bearer token */ - oauthSrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - calls += 1 - require.Equal(t, "POST", r.Method) - err = r.ParseForm() - require.NoError(t, err) - - require.Equal(t, "refresh_token", r.FormValue("grant_type")) - require.Equal(t, "rhsm-api", r.FormValue("client_id")) - require.Equal(t, offlineToken, r.FormValue("refresh_token")) - - bt := struct { - AccessToken string `json:"access_token"` - }{ - "accessToken!", - } - - w.WriteHeader(http.StatusOK) - w.Header().Set("Content-Type", "application/json") - err = json.NewEncoder(w).Encode(bt) - require.NoError(t, err) - })) - defer oauthSrv.Close() - - distroStruct := test_distro.New() - arch, err := distroStruct.GetArch(test_distro.TestArchName) - if err != nil { - t.Fatalf("error getting arch from distro: %v", err) - } - imageType, err := arch.GetImageType(test_distro.TestImageTypeName) - if err != nil { - t.Fatalf("error getting image type from arch: %v", err) - } - manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, 0) - if err != nil { - t.Fatalf("error creating osbuild manifest: %v", err) - } - - _, err = workerServer.EnqueueOSBuild(arch.Name(), &worker.OSBuildJob{Manifest: manifest}, "") - require.NoError(t, err) - - client, err := worker.NewClient(worker.ClientConfig{ - BaseURL: proxySrv.URL, - TlsConfig: nil, - ClientId: "rhsm-api", - OfflineToken: offlineToken, - OAuthURL: oauthSrv.URL, - BasePath: "/api/image-builder-worker/v1", - }) - require.NoError(t, err) - job, err := client.RequestJob([]string{"osbuild"}, arch.Name()) - require.NoError(t, err) - r := strings.NewReader("artifact contents") - require.NoError(t, job.UploadArtifact("some-artifact", r)) - c, err := job.Canceled() - require.False(t, c) -} - func TestTimeout(t *testing.T) { distroStruct := test_distro.New() arch, err := distroStruct.GetArch(test_distro.TestArchName)