github.com/craicoverflow/tyk@v2.9.6-rc3+incompatible/gateway/mw_version_check_test.go (about)

     1  package gateway
     2  
     3  import (
     4  	"net/http"
     5  	"sync"
     6  	"testing"
     7  
     8  	"github.com/TykTechnologies/tyk/apidef"
     9  	"github.com/TykTechnologies/tyk/test"
    10  	"github.com/TykTechnologies/tyk/user"
    11  )
    12  
    13  func testPrepareVersioning() (string, string) {
    14  	BuildAndLoadAPI(func(spec *APISpec) {
    15  		spec.UseKeylessAccess = false
    16  		spec.VersionData.NotVersioned = false
    17  		spec.VersionDefinition.Location = "header"
    18  		spec.VersionDefinition.Key = "version"
    19  		spec.Proxy.ListenPath = "/"
    20  		spec.VersionData.Versions["expired"] = apidef.VersionInfo{
    21  			Name:    "expired",
    22  			Expires: "2006-01-02 15:04",
    23  		}
    24  		spec.VersionData.Versions["v2"] = apidef.VersionInfo{
    25  			Name:             "v2",
    26  			UseExtendedPaths: true,
    27  			ExtendedPaths: apidef.ExtendedPathsSet{
    28  				WhiteList: []apidef.EndPointMeta{
    29  					{
    30  						Path: "/mock",
    31  						MethodActions: map[string]apidef.EndpointMethodMeta{
    32  							http.MethodGet: {
    33  								Action:  apidef.Reply,
    34  								Code:    http.StatusOK,
    35  								Data:    "testbody",
    36  								Headers: map[string]string{"testheader": "testvalue"},
    37  							},
    38  						},
    39  					},
    40  				},
    41  				URLRewrite: []apidef.URLRewriteMeta{
    42  					{
    43  						Path:         "/a",
    44  						Method:       http.MethodGet,
    45  						MatchPattern: "/a(.*)",
    46  						RewriteTo:    "/b",
    47  					},
    48  					{
    49  						Path:         "/c",
    50  						Method:       http.MethodPost,
    51  						MatchPattern: "/c(.*)",
    52  						RewriteTo:    "/d",
    53  					},
    54  				},
    55  				Ignored: []apidef.EndPointMeta{
    56  					{
    57  						Path: "/ignore",
    58  					},
    59  				},
    60  			},
    61  		}
    62  	})
    63  
    64  	keyWrongVersion := CreateSession(func(s *user.SessionState) {
    65  		s.AccessRights = map[string]user.AccessDefinition{"test": {
    66  			APIID: "test", Versions: []string{"v3"},
    67  		}}
    68  		s.Mutex = &sync.RWMutex{}
    69  	})
    70  
    71  	keyKnownVersion := CreateSession(func(s *user.SessionState) {
    72  		s.AccessRights = map[string]user.AccessDefinition{"test": {
    73  			APIID: "test", Versions: []string{"v1", "v2", "expired"},
    74  		}}
    75  		s.Mutex = &sync.RWMutex{}
    76  	})
    77  
    78  	return keyWrongVersion, keyKnownVersion
    79  }
    80  
    81  func TestVersioning(t *testing.T) {
    82  	ts := StartTest()
    83  	defer ts.Close()
    84  
    85  	keyWrongVersion, keyKnownVersion := testPrepareVersioning()
    86  
    87  	wrongVersionHeaders := map[string]string{
    88  		"authorization": keyWrongVersion,
    89  		"version":       "v3",
    90  	}
    91  
    92  	disallowedAccessHeaders := map[string]string{
    93  		"authorization": keyWrongVersion,
    94  		"version":       "v1",
    95  	}
    96  
    97  	knownVersionHeaders := map[string]string{
    98  		"authorization": keyKnownVersion,
    99  		"version":       "v1",
   100  	}
   101  
   102  	expiredVersionHeaders := map[string]string{
   103  		"authorization": keyKnownVersion,
   104  		"version":       "expired",
   105  	}
   106  
   107  	mockVersionHeaders := map[string]string{
   108  		"authorization": keyKnownVersion,
   109  		"version":       "v2",
   110  	}
   111  
   112  	ts.Run(t, []test.TestCase{
   113  		{Path: "/", Code: 403, Headers: wrongVersionHeaders, BodyMatch: "This API version does not seem to exist"},
   114  		{Path: "/", Code: 403, Headers: disallowedAccessHeaders, BodyMatch: "Access to this API has been disallowed"},
   115  		{Path: "/", Code: 200, Headers: knownVersionHeaders},
   116  		{Path: "/", Code: 403, Headers: expiredVersionHeaders, BodyMatch: string(VersionExpired)},
   117  		{Path: "/mock", Code: 200, Headers: mockVersionHeaders, BodyMatch: "testbody", HeadersMatch: map[string]string{"testheader": "testvalue"}},
   118  		{Path: "/ignore", Code: 200, Headers: mockVersionHeaders},
   119  	}...)
   120  }
   121  
   122  func BenchmarkVersioning(b *testing.B) {
   123  	b.ReportAllocs()
   124  
   125  	ts := StartTest()
   126  	defer ts.Close()
   127  
   128  	keyWrongVersion, keyKnownVersion := testPrepareVersioning()
   129  	wrongVersionHeaders := map[string]string{
   130  		"authorization": keyWrongVersion,
   131  		"version":       "v3",
   132  	}
   133  
   134  	disallowedAccessHeaders := map[string]string{
   135  		"authorization": keyWrongVersion,
   136  		"version":       "v1",
   137  	}
   138  
   139  	knownVersionHeaders := map[string]string{
   140  		"authorization": keyKnownVersion,
   141  		"version":       "v1",
   142  	}
   143  
   144  	expiredVersionHeaders := map[string]string{
   145  		"authorization": keyKnownVersion,
   146  		"version":       "expired",
   147  	}
   148  	mockVersionHeaders := map[string]string{
   149  		"authorization": keyKnownVersion,
   150  		"version":       "v2",
   151  	}
   152  
   153  	for i := 0; i < b.N; i++ {
   154  		ts.Run(b, []test.TestCase{
   155  			{Path: "/", Code: 403, Headers: wrongVersionHeaders, BodyMatch: "This API version does not seem to exist"},
   156  			{Path: "/", Code: 403, Headers: disallowedAccessHeaders, BodyMatch: "Access to this API has been disallowed"},
   157  			{Path: "/", Code: 200, Headers: knownVersionHeaders},
   158  			{Path: "/", Code: 403, Headers: expiredVersionHeaders, BodyMatch: string(VersionExpired)},
   159  			{Path: "/mock", Code: 200, Headers: mockVersionHeaders, BodyMatch: "testbody", HeadersMatch: map[string]string{"testheader": "testvalue"}},
   160  			{Path: "/ignore", Code: 200, Headers: mockVersionHeaders},
   161  		}...)
   162  	}
   163  }
   164  
   165  func TestNotVersioned(t *testing.T) {
   166  	g := StartTest()
   167  	defer g.Close()
   168  
   169  	api := BuildAPI(func(spec *APISpec) {
   170  		spec.Proxy.ListenPath = "/"
   171  		spec.VersionData.NotVersioned = false
   172  		spec.VersionData.Versions["Default"] = apidef.VersionInfo{
   173  			Name:           "Default",
   174  			OverrideTarget: "www.example.com",
   175  		}
   176  	})[0]
   177  
   178  	t.Run("Versioning enabled, override target URL", func(t *testing.T) {
   179  		LoadAPI(api)
   180  		_, _ = g.Run(t, test.TestCase{Code: http.StatusInternalServerError})
   181  	})
   182  
   183  	t.Run("Versioning disabled, use original target URL", func(t *testing.T) {
   184  		api.VersionData.NotVersioned = true
   185  		LoadAPI(api)
   186  
   187  		_, _ = g.Run(t, test.TestCase{Code: http.StatusOK})
   188  	})
   189  }