Skip to content

Commit

Permalink
refactor: move run into internal/app
Browse files Browse the repository at this point in the history
  • Loading branch information
gi8lino committed Feb 12, 2025
1 parent e31717c commit c133393
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 67 deletions.
61 changes: 2 additions & 59 deletions cmd/portpatrol/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,76 +2,19 @@ package main

import (
"context"
"errors"
"fmt"
"io"
"os"
"os/signal"
"syscall"

"github.com/containeroo/portpatrol/internal/config"
"github.com/containeroo/portpatrol/internal/factory"
"github.com/containeroo/portpatrol/internal/logging"
"github.com/containeroo/portpatrol/internal/wait"
"golang.org/x/sync/errgroup"
"github.com/containeroo/portpatrol/internal/app"
)

const version string = "v0.5.8"

// run is the main function of the application.
func run(ctx context.Context, args []string, output io.Writer) error {
// Create a new context that listens for interrupt signals
ctx, cancel := signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM)
defer cancel()

// Parse command-line flags
parsedFlags, err := config.ParseFlags(args, version, output)
if err != nil {
if errors.Is(err, &config.HelpRequested{}) {
fmt.Fprint(output, err.Error())
return nil
}
return fmt.Errorf("configuration error: %w", err)
}

// Initialize target checkers
checkers, err := factory.BuildCheckers(parsedFlags.DynFlags, parsedFlags.DefaultCheckInterval)
if err != nil {
return fmt.Errorf("failed to initialize target checkers: %w", err)
}

if len(checkers) == 0 {
return errors.New("configuration error: no checkers configured")
}

logger := logging.SetupLogger(version, output)

// Run checkers concurrently
eg, ctx := errgroup.WithContext(ctx)
for _, chk := range checkers {
checker := chk // Capture loop variable
eg.Go(func() error {
err := wait.WaitUntilReady(ctx, checker.Interval, checker.Checker, logger)
if err != nil {
return fmt.Errorf("checker '%s' failed: %w", checker.Checker.GetName(), err)
}
return nil
})
}

// Wait for all checkers to finish or return error
if err := eg.Wait(); err != nil {
return err
}

return nil
}

func main() {
// Create a root context
ctx := context.Background()

if err := run(ctx, os.Args[1:], os.Stdout); err != nil {
if err := app.Run(ctx, version, os.Args[1:], os.Stdout); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
Expand Down
66 changes: 66 additions & 0 deletions internal/app/run.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package app

import (
"context"
"errors"
"fmt"
"io"
"os"
"os/signal"
"syscall"

"github.com/containeroo/portpatrol/internal/config"
"github.com/containeroo/portpatrol/internal/factory"
"github.com/containeroo/portpatrol/internal/logging"
"github.com/containeroo/portpatrol/internal/wait"
"golang.org/x/sync/errgroup"
)

// Run is the main function of the application.
func Run(ctx context.Context, version string, args []string, output io.Writer) error {
// Create a new context that listens for interrupt signals
ctx, cancel := signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM)
defer cancel()

// Parse command-line flags
parsedFlags, err := config.ParseFlags(args, version, output)
if err != nil {
if errors.Is(err, &config.HelpRequested{}) {
fmt.Fprint(output, err.Error())
return nil
}
return fmt.Errorf("configuration error: %w", err)
}

// Initialize target checkers
checkers, err := factory.BuildCheckers(parsedFlags.DynFlags, parsedFlags.DefaultCheckInterval)
if err != nil {
return fmt.Errorf("failed to initialize target checkers: %w", err)
}

if len(checkers) == 0 {
return errors.New("configuration error: no checkers configured")
}

logger := logging.SetupLogger(version, output)

// Run checkers concurrently
eg, ctx := errgroup.WithContext(ctx)
for _, chk := range checkers {
checker := chk // Capture loop variable
eg.Go(func() error {
err := wait.WaitUntilReady(ctx, checker.Interval, checker.Checker, logger)
if err != nil {
return fmt.Errorf("checker '%s' failed: %w", checker.Checker.GetName(), err)
}
return nil
})
}

// Wait for all checkers to finish or return error
if err := eg.Wait(); err != nil {
return err
}

return nil
}
30 changes: 22 additions & 8 deletions cmd/portpatrol/main_test.go → internal/app/run_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package main
package app

import (
"bytes"
Expand Down Expand Up @@ -34,7 +34,9 @@ func TestRunHTTPReady(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()

err := run(ctx, args, &output)
version := "0.0.0"

err := Run(ctx, version, args, &output)
assert.NoError(t, err)

outputEntries := strings.Split(strings.TrimSpace(output.String()), "\n")
Expand All @@ -61,7 +63,9 @@ func TestRunTCPReady(t *testing.T) {
defer cancel()

var output strings.Builder
err = run(ctx, args, &output)
version := "0.0.0"

err = Run(ctx, version, args, &output)
assert.NoError(t, err)

outputEntries := strings.Split(strings.TrimSpace(output.String()), "\n")
Expand All @@ -79,7 +83,9 @@ func TestRunConfigErrorMissingTarget(t *testing.T) {
defer cancel()

var output bytes.Buffer
err := run(ctx, args, &output)
version := "0.0.0"

err := Run(ctx, version, args, &output)

assert.Error(t, err)
assert.EqualError(t, err, "configuration error: no checkers configured")
Expand All @@ -99,7 +105,9 @@ func TestRunConfigErrorUnsupportedCheckType(t *testing.T) {
defer cancel()

var output bytes.Buffer
err := run(ctx, args, &output)
version := "0.0.0"

err := Run(ctx, version, args, &output)

assert.Error(t, err)
assert.EqualError(t, err, "configuration error: Flag parsing error: unknown flag: --target.unsupported.name")
Expand All @@ -120,7 +128,9 @@ func TestRunConfigErrorInvalidHeaders(t *testing.T) {
defer cancel()

var output bytes.Buffer
err := run(ctx, args, &output)
version := "0.0.0"

err := Run(ctx, version, args, &output)

assert.Error(t, err)
assert.EqualError(t, err, "failed to initialize target checkers: invalid \"--http.invalidheaders.header\": invalid header format: \"InvalidHeader\"")
Expand All @@ -138,7 +148,9 @@ func TestRunParseError(t *testing.T) {
defer cancel()

var output bytes.Buffer
err := run(ctx, args, &output)
version := "0.0.0"

err := Run(ctx, version, args, &output)

assert.Error(t, err)
assert.EqualError(t, err, "configuration error: Flag parsing error: unknown flag: --invalid")
Expand All @@ -157,7 +169,9 @@ func TestRunShowVersion(t *testing.T) {
defer cancel()

var output bytes.Buffer
err := run(ctx, args, &output)
version := "0.0.0"

err := Run(ctx, version, args, &output)

assert.NoError(t, err)
}

0 comments on commit c133393

Please sign in to comment.