Skip to content
Snippets Groups Projects
Commit c980e86f authored by OZGCloud's avatar OZGCloud
Browse files

OZG-6553 Modularisierung

parent 9114143b
Branches
Tags
No related merge requests found
/*
* Copyright (C) 2023-2024
* Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package server
import (
"context"
pb "fachstellen-proxy/gen/go"
"fmt"
"google.golang.org/grpc"
"log"
"net"
)
const GrpcMockPort = 50051
type server struct {
pb.UnimplementedFachstelleRegistrationServiceServer
}
func (s *server) Register(ctx context.Context, in *pb.GrpcFachstelleRegistrationRequest) (*pb.GrpcFachstelleRegistrationResponse, error) {
return &pb.GrpcFachstelleRegistrationResponse{}, nil
}
func StartGrpcServer() *grpc.Server {
s := grpc.NewServer()
pb.RegisterFachstelleRegistrationServiceServer(s, &server{})
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", GrpcMockPort))
if err != nil {
log.Fatalf("gRPC server failed to listen: %v", err)
}
log.Printf("gRPC server listening on port %d", GrpcMockPort)
if err := s.Serve(lis); err != nil {
log.Fatalf("gRPC server failed to serve: %v", err)
}
return s
}
......@@ -26,64 +26,19 @@
package server
import (
"bytes"
"context"
"fachstellen-proxy/internal/config"
pb "fachstellen-proxy/gen/go"
"fmt"
"net/http"
"sync"
"testing"
"time"
"github.com/stretchr/testify/assert"
"google.golang.org/grpc/credentials/insecure"
pb "fachstellen-proxy/gen/go"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"testing"
)
var setUpOnce sync.Once
func SetUp() {
setUpOnce.Do(func() {
go StartGrpcServer()
time.Sleep(time.Second) // Wait for the server to start
conf := config.Config{}
conf.Server.Port = 8080
conf.Grpc.Mock = true
go StartHttpGateway(conf)
time.Sleep(time.Second) // Wait for the server to start
})
}
func TestStartHttpGateway(t *testing.T) {
t.Run("should handle register fachstelle requests", func(t *testing.T) {
SetUp()
jsonData := []byte(`{"mukId": "TestMukId"}`)
resp, err := http.Post(fmt.Sprintf("http://localhost:8080%v", RegisterFachstelleUrlPath), "application/json", bytes.NewBuffer(jsonData))
assert.NoError(t, err)
assert.Equal(t, http.StatusOK, resp.StatusCode)
})
t.Run("should handle home requests", func(t *testing.T) {
SetUp()
resp, err := http.Get("http://localhost:8080/")
assert.NoError(t, err)
assert.Equal(t, http.StatusOK, resp.StatusCode)
})
}
func TestStartGrpcServer(t *testing.T) {
SetUp()
SetUpGrpcServer()
conn, err := grpc.NewClient(fmt.Sprintf("localhost:%d", MockGrpcPort), grpc.WithTransportCredentials(insecure.NewCredentials()))
conn, err := grpc.NewClient(fmt.Sprintf("localhost:%d", GrpcMockPort), grpc.WithTransportCredentials(insecure.NewCredentials()))
assert.NoError(t, err)
defer conn.Close()
......
/*
* Copyright (C) 2023-2024
* Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package server
import (
"context"
"fmt"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"log"
"net/http"
)
func registerHomeEndpoint(mux *runtime.ServeMux) {
err := mux.HandlePath("GET", "/", func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
defer func() {
if err := recover(); err != nil {
log.Printf("failed to recover: %v", err)
http.Error(w, fmt.Sprintf("failed to recover: %v", err), http.StatusInternalServerError)
}
}()
})
if err != nil {
log.Fatalf("failed to register home endpoint: %v", err)
}
}
func errorHandler(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
st, ok := status.FromError(err)
if !ok {
runtime.DefaultHTTPErrorHandler(ctx, mux, marshaler, w, r, err)
return
}
statusCodeMap := map[codes.Code]int{
codes.InvalidArgument: http.StatusBadRequest,
codes.AlreadyExists: http.StatusConflict,
codes.Unavailable: http.StatusServiceUnavailable,
}
httpStatusCode := http.StatusInternalServerError
if code, exists := statusCodeMap[st.Code()]; exists {
httpStatusCode = code
}
w.Header().Set("Content-Type", marshaler.ContentType(r))
w.WriteHeader(httpStatusCode)
_, writeErr := w.Write([]byte(st.Message()))
if writeErr != nil {
log.Fatalf("failed to handle grpc error: %v", writeErr)
}
}
/*
* Copyright (C) 2023-2024
* Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package server
import (
"github.com/stretchr/testify/assert"
"net/http"
"testing"
)
func TestRegisterHomeEndpoint(t *testing.T) {
SetUpHttpGateway()
resp, err := http.Get("http://localhost:8080/")
assert.NoError(t, err)
assert.Equal(t, http.StatusOK, resp.StatusCode)
}
// TODO: Error handler test
/*
* Copyright (C) 2023-2024
* Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package server
import (
"context"
"fachstellen-proxy/internal/config"
"fmt"
"google.golang.org/grpc/credentials/insecure"
"log"
"net/http"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"google.golang.org/grpc"
pb "fachstellen-proxy/gen/go"
)
func StartHttpGateway(conf config.Config) *http.Server {
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
defer cancel()
grpcEndpoint := conf.Grpc.Url
if conf.Grpc.Mock {
grpcEndpoint = fmt.Sprintf("localhost:%d", GrpcMockPort)
}
mux := runtime.NewServeMux(runtime.WithErrorHandler(errorHandler))
opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
err := pb.RegisterFachstelleRegistrationServiceHandlerFromEndpoint(ctx, mux, grpcEndpoint, opts)
if err != nil {
log.Fatalf("failed to start HTTP gateway: %v", err)
}
registerHomeEndpoint(mux)
httpServer := &http.Server{
Addr: fmt.Sprintf(":%d", conf.Server.Port),
Handler: RequestLoggingMiddleware(mux),
}
log.Printf("HTTP gateway listening on port %d", conf.Server.Port)
if err := httpServer.ListenAndServe(); err != nil {
log.Fatalf("HTTP gateway failed to serve: %v", err)
}
return httpServer
}
/*
* Copyright (C) 2023-2024
* Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package server
import (
"bytes"
"fmt"
"github.com/stretchr/testify/assert"
"net/http"
"testing"
)
func TestStartHttpGateway(t *testing.T) {
SetUpGrpcServer()
SetUpHttpGateway()
jsonData := []byte(`{"mukId": "TestMukId"}`)
resp, err := http.Post(fmt.Sprintf("http://localhost:8080%v", RegisterFachstelleUrlPath), "application/json", bytes.NewBuffer(jsonData))
assert.NoError(t, err)
assert.Equal(t, http.StatusOK, resp.StatusCode)
}
......@@ -27,72 +27,15 @@ package server
import (
"bytes"
"context"
"fachstellen-proxy/internal/config"
"fmt"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/grpclog"
"io"
"log"
"net"
"net/http"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"google.golang.org/grpc"
pb "fachstellen-proxy/gen/go"
)
const MockGrpcPort = 50051
const RegisterFachstelleUrlPath = "/api/fachstellen"
func StartHttpGateway(conf config.Config) *http.Server {
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
defer cancel()
grpcEndpoint := conf.Grpc.Url
if conf.Grpc.Mock {
grpcEndpoint = fmt.Sprintf("localhost:%d", MockGrpcPort)
}
mux := runtime.NewServeMux()
opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
err := pb.RegisterFachstelleRegistrationServiceHandlerFromEndpoint(ctx, mux, grpcEndpoint, opts)
if err != nil {
log.Fatalf("failed to start HTTP gateway: %v", err)
}
registerHomeEndpoint(mux)
httpServer := &http.Server{
Addr: fmt.Sprintf(":%d", conf.Server.Port),
Handler: logRequests(mux),
}
log.Printf("HTTP gateway listening on port %d", conf.Server.Port)
if err := httpServer.ListenAndServe(); err != nil {
log.Fatalf("HTTP gateway failed to serve: %v", err)
}
return httpServer
}
func registerHomeEndpoint(mux *runtime.ServeMux) {
err := mux.HandlePath("GET", "/", func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
defer func() {
if err := recover(); err != nil {
log.Printf("failed to recover: %v", err)
http.Error(w, fmt.Sprintf("failed to recover: %v", err), http.StatusInternalServerError)
}
}()
})
if err != nil {
log.Fatalf("failed to register home endpoint: %v", err)
}
}
type logResponseWriter struct {
http.ResponseWriter
statusCode int
......@@ -103,7 +46,7 @@ func (rsp *logResponseWriter) WriteHeader(statusCode int) {
rsp.ResponseWriter.WriteHeader(statusCode)
}
func logRequests(h http.Handler) http.Handler {
func RequestLoggingMiddleware(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != RegisterFachstelleUrlPath {
h.ServeHTTP(w, r)
......@@ -133,27 +76,3 @@ func logRequests(h http.Handler) http.Handler {
}
})
}
type server struct {
pb.UnimplementedFachstelleRegistrationServiceServer
}
func (s *server) Register(ctx context.Context, in *pb.GrpcFachstelleRegistrationRequest) (*pb.GrpcFachstelleRegistrationResponse, error) {
return &pb.GrpcFachstelleRegistrationResponse{}, nil
}
func StartGrpcServer() *grpc.Server {
s := grpc.NewServer()
pb.RegisterFachstelleRegistrationServiceServer(s, &server{})
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", MockGrpcPort))
if err != nil {
log.Fatalf("gRPC server failed to listen: %v", err)
}
log.Printf("gRPC server listening on port %d", MockGrpcPort)
if err := s.Serve(lis); err != nil {
log.Fatalf("gRPC server failed to serve: %v", err)
}
return s
}
/*
* Copyright (C) 2023-2024
* Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package server
import (
"bytes"
"fmt"
"github.com/stretchr/testify/assert"
"net/http"
"testing"
)
func TestRequestLoggingMiddleware(t *testing.T) {
SetUpGrpcServer()
SetUpHttpGateway()
jsonData := []byte(`{"mukId": "TestMukId"}`)
resp, err := http.Post(fmt.Sprintf("http://localhost:8080%v", RegisterFachstelleUrlPath), "application/json", bytes.NewBuffer(jsonData))
assert.NoError(t, err)
assert.Equal(t, http.StatusOK, resp.StatusCode)
// TODO: Test Logging
}
package server
import (
"fachstellen-proxy/internal/config"
"sync"
"time"
)
var setUpHttpGatewayOnce sync.Once
func SetUpHttpGateway() {
setUpHttpGatewayOnce.Do(func() {
conf := config.Config{}
conf.Server.Port = 8080
conf.Grpc.Mock = true
go StartHttpGateway(conf)
time.Sleep(time.Second) // Wait for the server to start
})
}
var setUpGrpcServerOnce sync.Once
func SetUpGrpcServer() {
setUpGrpcServerOnce.Do(func() {
go StartGrpcServer()
time.Sleep(time.Second) // Wait for the server to start
})
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment