zotregistry.dev/zot@v1.4.4-0.20240314164342-eec277e14d20/pkg/compliance/v1_0_0/check_test.go (about)

     1  package v1_0_0_test
     2  
     3  import (
     4  	"context"
     5  	"net/http"
     6  	"os"
     7  	"testing"
     8  	"time"
     9  
    10  	"gopkg.in/resty.v1"
    11  
    12  	"zotregistry.dev/zot/pkg/api"
    13  	"zotregistry.dev/zot/pkg/api/config"
    14  	"zotregistry.dev/zot/pkg/compliance"
    15  	"zotregistry.dev/zot/pkg/compliance/v1_0_0"
    16  	. "zotregistry.dev/zot/pkg/test/common"
    17  )
    18  
    19  //nolint:gochecknoglobals
    20  var (
    21  	listenAddress = "127.0.0.1"
    22  	defaultDir    = ""
    23  	firstDir      = ""
    24  	secondDir     = ""
    25  )
    26  
    27  func TestWorkflows(t *testing.T) {
    28  	ctrl, randomPort := startServer(t)
    29  	defer stopServer(ctrl)
    30  
    31  	storageInfo := []string{defaultDir, firstDir, secondDir}
    32  
    33  	v1_0_0.CheckWorkflows(t, &compliance.Config{
    34  		Address:     listenAddress,
    35  		Port:        randomPort,
    36  		StorageInfo: storageInfo,
    37  	})
    38  }
    39  
    40  func TestWorkflowsOutputJSON(t *testing.T) {
    41  	ctrl, randomPort := startServer(t)
    42  	defer stopServer(ctrl)
    43  
    44  	storageInfo := []string{defaultDir, firstDir, secondDir}
    45  
    46  	v1_0_0.CheckWorkflows(t, &compliance.Config{
    47  		Address:     listenAddress,
    48  		Port:        randomPort,
    49  		OutputJSON:  true,
    50  		StorageInfo: storageInfo,
    51  	})
    52  }
    53  
    54  // start local server on random open port.
    55  func startServer(t *testing.T) (*api.Controller, string) {
    56  	t.Helper()
    57  
    58  	port := GetFreePort()
    59  	baseURL := GetBaseURL(port)
    60  	conf := config.New()
    61  	conf.HTTP.Address = listenAddress
    62  	conf.HTTP.Port = port
    63  	ctrl := api.NewController(conf)
    64  
    65  	dir := t.TempDir()
    66  	defaultDir = dir
    67  
    68  	firstSubDir := t.TempDir()
    69  	firstDir = firstSubDir
    70  
    71  	secondSubDir := t.TempDir()
    72  	secondDir = secondSubDir
    73  
    74  	subPaths := make(map[string]config.StorageConfig)
    75  
    76  	subPaths["/firsttest"] = config.StorageConfig{RootDirectory: firstSubDir}
    77  	subPaths["/secondtest"] = config.StorageConfig{RootDirectory: secondSubDir}
    78  
    79  	ctrl.Config.Storage.RootDirectory = dir
    80  
    81  	ctrl.Config.Storage.SubPaths = subPaths
    82  
    83  	go func() {
    84  		if err := ctrl.Init(); err != nil {
    85  			return
    86  		}
    87  
    88  		// this blocks
    89  		if err := ctrl.Run(); err != nil {
    90  			return
    91  		}
    92  	}()
    93  
    94  	for {
    95  		// poll until ready
    96  		resp, _ := resty.R().Get(baseURL)
    97  		if resp.StatusCode() == http.StatusNotFound {
    98  			break
    99  		}
   100  
   101  		time.Sleep(100 * time.Millisecond)
   102  	}
   103  
   104  	return ctrl, port
   105  }
   106  
   107  func stopServer(ctrl *api.Controller) {
   108  	err := ctrl.Server.Shutdown(context.Background())
   109  	if err != nil {
   110  		panic(err)
   111  	}
   112  
   113  	err = os.RemoveAll(ctrl.Config.Storage.RootDirectory)
   114  	if err != nil {
   115  		panic(err)
   116  	}
   117  }