github.com/wtsi-hgi/go-softpack-builder@v1.8.1/internal/tests/tests.go (about)

     1  /*******************************************************************************
     2   * Copyright (c) 2023 Genome Research Ltd.
     3   *
     4   * Permission is hereby granted, free of charge, to any person obtaining
     5   * a copy of this software and associated documentation files (the
     6   * "Software"), to deal in the Software without restriction, including
     7   * without limitation the rights to use, copy, modify, merge, publish,
     8   * distribute, sublicense, and/or sell copies of the Software, and to
     9   * permit persons to whom the Software is furnished to do so, subject to
    10   * the following conditions:
    11   *
    12   * The above copyright notice and this permission notice shall be included
    13   * in all copies or substantial portions of the Software.
    14   *
    15   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    16   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    17   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
    18   * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
    19   * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
    20   * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    21   * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    22   ******************************************************************************/
    23  
    24  package tests
    25  
    26  import (
    27  	"embed"
    28  	"strings"
    29  	"sync"
    30  )
    31  
    32  //go:embed testdata
    33  var TestData embed.FS
    34  
    35  // ConcurrentStringBuilder should be used when testing slog logging:
    36  //
    37  //	var logWriter internal.ConcurrentStringBuilder
    38  //	slog.SetDefault(slog.New(slog.NewTextHandler(&logWriter, nil)))
    39  type ConcurrentStringBuilder struct {
    40  	mu sync.RWMutex
    41  	strings.Builder
    42  }
    43  
    44  // Write is for implementing io.Writer.
    45  func (c *ConcurrentStringBuilder) Write(p []byte) (int, error) {
    46  	c.mu.Lock()
    47  	defer c.mu.Unlock()
    48  
    49  	return c.Builder.Write(p)
    50  }
    51  
    52  // WriteString is for implementing io.Writer.
    53  func (c *ConcurrentStringBuilder) WriteString(str string) (int, error) {
    54  	c.mu.Lock()
    55  	defer c.mu.Unlock()
    56  
    57  	return c.Builder.WriteString(str)
    58  }
    59  
    60  // String returns the current logs messages as a string.
    61  func (c *ConcurrentStringBuilder) String() string {
    62  	c.mu.RLock()
    63  	defer c.mu.RUnlock()
    64  
    65  	return c.Builder.String()
    66  }