github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/acceptance/suite_manager.go (about)

     1  //go:build acceptance
     2  // +build acceptance
     3  
     4  package acceptance
     5  
     6  type SuiteManager struct {
     7  	out          func(format string, args ...interface{})
     8  	results      map[string]interface{}
     9  	cleanUpTasks map[string]func() error
    10  }
    11  
    12  func (s *SuiteManager) CleanUp() error {
    13  	for key, cleanUp := range s.cleanUpTasks {
    14  		s.out("Running cleanup task '%s'\n", key)
    15  		if err := cleanUp(); err != nil {
    16  			return err
    17  		}
    18  	}
    19  
    20  	return nil
    21  }
    22  
    23  func (s *SuiteManager) RegisterCleanUp(key string, cleanUp func() error) {
    24  	if s.cleanUpTasks == nil {
    25  		s.cleanUpTasks = map[string]func() error{}
    26  	}
    27  
    28  	s.cleanUpTasks[key] = cleanUp
    29  }
    30  
    31  func (s *SuiteManager) RunTaskOnceString(key string, run func() (string, error)) (string, error) {
    32  	v, err := s.runTaskOnce(key, func() (interface{}, error) {
    33  		return run()
    34  	})
    35  	if err != nil {
    36  		return "", err
    37  	}
    38  
    39  	return v.(string), nil
    40  }
    41  
    42  func (s *SuiteManager) runTaskOnce(key string, run func() (interface{}, error)) (interface{}, error) {
    43  	if s.results == nil {
    44  		s.results = map[string]interface{}{}
    45  	}
    46  
    47  	value, found := s.results[key]
    48  	if !found {
    49  		s.out("Running task '%s'\n", key)
    50  		v, err := run()
    51  		if err != nil {
    52  			return nil, err
    53  		}
    54  
    55  		s.results[key] = v
    56  
    57  		return v, nil
    58  	}
    59  
    60  	return value, nil
    61  }