github.com/choria-io/go-choria@v0.28.1-0.20240416190746-b3bf9c7d5a45/providers/provtarget/builddefaults/default_test.go (about)

     1  // Copyright (c) 2021, R.I. Pienaar and the Choria Project contributors
     2  //
     3  // SPDX-License-Identifier: Apache-2.0
     4  
     5  package builddefaults
     6  
     7  import (
     8  	"os"
     9  	"path/filepath"
    10  	"testing"
    11  
    12  	"github.com/choria-io/go-choria/build"
    13  	"github.com/choria-io/tokens"
    14  	. "github.com/onsi/ginkgo/v2"
    15  	. "github.com/onsi/gomega"
    16  )
    17  
    18  func TestDefault(t *testing.T) {
    19  	RegisterFailHandler(Fail)
    20  	RunSpecs(t, "Providers/Provtarget/Default")
    21  }
    22  
    23  var _ = Describe("Default", func() {
    24  	var (
    25  		td  string
    26  		err error
    27  		bi  build.Info
    28  	)
    29  
    30  	createToken := func(claims *tokens.ProvisioningClaims, td string) string {
    31  		t, err := tokens.SignTokenWithKeyFile(claims, "testdata/signer-key.pem")
    32  		Expect(err).ToNot(HaveOccurred())
    33  
    34  		out := filepath.Join(td, "token.jwt")
    35  		err = os.WriteFile(out, []byte(t), 0600)
    36  		Expect(err).ToNot(HaveOccurred())
    37  
    38  		return out
    39  	}
    40  
    41  	BeforeEach(func() {
    42  		td, err = os.MkdirTemp("", "")
    43  		Expect(err).ToNot(HaveOccurred())
    44  	})
    45  
    46  	AfterEach(func() {
    47  		os.RemoveAll(td)
    48  	})
    49  
    50  	Describe("Configure", func() {
    51  		It("Should handle malformed jwt", func() {
    52  			build.ProvisionJWTFile = "testdata/invalid.jwt"
    53  			reader, _ := os.Open(build.ProvisionJWTFile)
    54  			defer reader.Close()
    55  			_, err := SetBuildBasedOnJWT(reader, &bi)
    56  			Expect(err).To(MatchError("token contains an invalid number of segments"))
    57  		})
    58  
    59  		It("Should detect missing auth token", func() {
    60  			build.ProvisionJWTFile = createToken(&tokens.ProvisioningClaims{
    61  				StandardClaims: tokens.StandardClaims{
    62  					Purpose: tokens.ProvisioningPurpose,
    63  				},
    64  			}, td)
    65  			reader, _ := os.Open(build.ProvisionJWTFile)
    66  			defer reader.Close()
    67  			_, err := SetBuildBasedOnJWT(reader, &bi)
    68  			Expect(err).To(MatchError("no auth token"))
    69  		})
    70  
    71  		It("Should detect missing url and srv domain", func() {
    72  			build.ProvisionJWTFile = createToken(&tokens.ProvisioningClaims{
    73  				Token: "x",
    74  				StandardClaims: tokens.StandardClaims{
    75  					Purpose: tokens.ProvisioningPurpose,
    76  				},
    77  			}, td)
    78  			reader, _ := os.Open(build.ProvisionJWTFile)
    79  			defer reader.Close()
    80  			_, err := SetBuildBasedOnJWT(reader, &bi)
    81  			Expect(err).To(MatchError("no srv domain or urls"))
    82  
    83  		})
    84  
    85  		It("Should detect both url and srv domain supplied", func() {
    86  			build.ProvisionJWTFile = createToken(&tokens.ProvisioningClaims{
    87  				Token:     "x",
    88  				URLs:      "nats://example.net:4222",
    89  				SRVDomain: "example.net",
    90  				StandardClaims: tokens.StandardClaims{
    91  					Purpose: tokens.ProvisioningPurpose,
    92  				},
    93  			}, td)
    94  			reader, _ := os.Open(build.ProvisionJWTFile)
    95  			defer reader.Close()
    96  			_, err := SetBuildBasedOnJWT(reader, &bi)
    97  			Expect(err).To(MatchError("both srv domain and URLs supplied"))
    98  		})
    99  
   100  		It("Should set build properties for specific URL", func() {
   101  			build.ProvisionJWTFile = createToken(&tokens.ProvisioningClaims{
   102  				Token:  "secret",
   103  				URLs:   "prov.example.net:4222",
   104  				Secure: true,
   105  				StandardClaims: tokens.StandardClaims{
   106  					Purpose: tokens.ProvisioningPurpose,
   107  				},
   108  			}, td)
   109  			reader, _ := os.Open(build.ProvisionJWTFile)
   110  			defer reader.Close()
   111  			_, err := SetBuildBasedOnJWT(reader, &bi)
   112  			Expect(err).ToNot(HaveOccurred())
   113  			Expect(build.ProvisionBrokerURLs).To(Equal("prov.example.net:4222"))
   114  			Expect(build.ProvisionBrokerSRVDomain).To(Equal(""))
   115  			Expect(build.ProvisionToken).To(Equal("secret"))
   116  			Expect(build.ProvisionSecure).To(Equal("true"))
   117  			Expect(build.ProvisionModeDefault).To(Equal("false"))
   118  		})
   119  
   120  		It("Should set build properties for specific SRV domain", func() {
   121  			build.ProvisionJWTFile = createToken(&tokens.ProvisioningClaims{
   122  				Token:     "secret",
   123  				SRVDomain: "example.net",
   124  				Secure:    true,
   125  				StandardClaims: tokens.StandardClaims{
   126  					Purpose: tokens.ProvisioningPurpose,
   127  				},
   128  			}, td)
   129  			reader, _ := os.Open(build.ProvisionJWTFile)
   130  			defer reader.Close()
   131  			_, err := SetBuildBasedOnJWT(reader, &bi)
   132  			Expect(err).ToNot(HaveOccurred())
   133  			Expect(build.ProvisionBrokerURLs).To(Equal(""))
   134  			Expect(build.ProvisionBrokerSRVDomain).To(Equal("example.net"))
   135  			Expect(build.ProvisionToken).To(Equal("secret"))
   136  			Expect(build.ProvisionSecure).To(Equal("true"))
   137  			Expect(build.ProvisionModeDefault).To(Equal("false"))
   138  		})
   139  
   140  		It("Should set provision mode default", func() {
   141  			build.ProvisionJWTFile = createToken(&tokens.ProvisioningClaims{
   142  				Token:       "secret",
   143  				URLs:        "prov.example.net:4222",
   144  				Secure:      true,
   145  				ProvDefault: true,
   146  				StandardClaims: tokens.StandardClaims{
   147  					Purpose: tokens.ProvisioningPurpose,
   148  				},
   149  			}, td)
   150  			reader, _ := os.Open(build.ProvisionJWTFile)
   151  			defer reader.Close()
   152  			_, err := SetBuildBasedOnJWT(reader, &bi)
   153  			Expect(err).ToNot(HaveOccurred())
   154  			Expect(build.ProvisionBrokerURLs).To(Equal("prov.example.net:4222"))
   155  			Expect(build.ProvisionBrokerSRVDomain).To(Equal(""))
   156  			Expect(build.ProvisionToken).To(Equal("secret"))
   157  			Expect(build.ProvisionSecure).To(Equal("true"))
   158  			Expect(build.ProvisionModeDefault).To(Equal("true"))
   159  		})
   160  	})
   161  })