mirror of
				https://github.com/docker/compose.git
				synced 2025-10-30 18:53:51 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			138 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /*
 | |
|    Copyright 2020 Docker, Inc.
 | |
| 
 | |
|    Licensed under the Apache License, Version 2.0 (the "License");
 | |
|    you may not use this file except in compliance with the License.
 | |
|    You may obtain a copy of the License at
 | |
| 
 | |
|        http://www.apache.org/licenses/LICENSE-2.0
 | |
| 
 | |
|    Unless required by applicable law or agreed to in writing, software
 | |
|    distributed under the License is distributed on an "AS IS" BASIS,
 | |
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|    See the License for the specific language governing permissions and
 | |
|    limitations under the License.
 | |
| */
 | |
| 
 | |
| package server
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"io/ioutil"
 | |
| 	"os"
 | |
| 	"path"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| 	"github.com/stretchr/testify/suite"
 | |
| 	"google.golang.org/grpc"
 | |
| 	"google.golang.org/grpc/metadata"
 | |
| 
 | |
| 	"github.com/docker/api/config"
 | |
| 	apicontext "github.com/docker/api/context"
 | |
| )
 | |
| 
 | |
| type interceptorSuite struct {
 | |
| 	suite.Suite
 | |
| 	dir string
 | |
| 	ctx context.Context
 | |
| }
 | |
| 
 | |
| func (is *interceptorSuite) BeforeTest(suiteName, testName string) {
 | |
| 	dir, err := ioutil.TempDir("", "example")
 | |
| 	require.Nil(is.T(), err)
 | |
| 
 | |
| 	ctx := context.Background()
 | |
| 	ctx = config.WithDir(ctx, dir)
 | |
| 	err = ioutil.WriteFile(path.Join(dir, "config.json"), []byte(`{"currentContext": "default"}`), 0644)
 | |
| 	require.Nil(is.T(), err)
 | |
| 
 | |
| 	is.dir = dir
 | |
| 	is.ctx = ctx
 | |
| }
 | |
| 
 | |
| func (is *interceptorSuite) AfterTest(suiteName, tesName string) {
 | |
| 	err := os.RemoveAll(is.dir)
 | |
| 	require.Nil(is.T(), err)
 | |
| }
 | |
| 
 | |
| func (is *interceptorSuite) TestUnaryGetCurrentContext() {
 | |
| 	interceptor := unaryServerInterceptor(is.ctx)
 | |
| 
 | |
| 	currentContext := is.callUnary(context.Background(), interceptor)
 | |
| 
 | |
| 	assert.Equal(is.T(), "default", currentContext)
 | |
| }
 | |
| 
 | |
| func (is *interceptorSuite) TestUnaryContextFromMetadata() {
 | |
| 	contextName := "test"
 | |
| 
 | |
| 	interceptor := unaryServerInterceptor(is.ctx)
 | |
| 	reqCtx := context.Background()
 | |
| 	reqCtx = metadata.NewIncomingContext(reqCtx, metadata.MD{
 | |
| 		(key): []string{contextName},
 | |
| 	})
 | |
| 
 | |
| 	currentContext := is.callUnary(reqCtx, interceptor)
 | |
| 
 | |
| 	assert.Equal(is.T(), contextName, currentContext)
 | |
| }
 | |
| 
 | |
| func (is *interceptorSuite) TestStreamGetCurrentContext() {
 | |
| 	interceptor := streamServerInterceptor(is.ctx)
 | |
| 
 | |
| 	currentContext := is.callStream(context.Background(), interceptor)
 | |
| 
 | |
| 	assert.Equal(is.T(), "default", currentContext)
 | |
| }
 | |
| 
 | |
| func (is *interceptorSuite) TestStreamContextFromMetadata() {
 | |
| 	contextName := "test"
 | |
| 
 | |
| 	interceptor := streamServerInterceptor(is.ctx)
 | |
| 	reqCtx := context.Background()
 | |
| 	reqCtx = metadata.NewIncomingContext(reqCtx, metadata.MD{
 | |
| 		(key): []string{contextName},
 | |
| 	})
 | |
| 
 | |
| 	currentContext := is.callStream(reqCtx, interceptor)
 | |
| 
 | |
| 	assert.Equal(is.T(), contextName, currentContext)
 | |
| }
 | |
| 
 | |
| func (is *interceptorSuite) callStream(ctx context.Context, interceptor grpc.StreamServerInterceptor) string {
 | |
| 	currentContext := ""
 | |
| 	err := interceptor(nil, &contextServerStream{
 | |
| 		ctx: ctx,
 | |
| 	}, &grpc.StreamServerInfo{
 | |
| 		FullMethod: "/com.docker.api.protos.context.v1.Contexts/test",
 | |
| 	}, func(srv interface{}, stream grpc.ServerStream) error {
 | |
| 		currentContext = apicontext.CurrentContext(stream.Context())
 | |
| 		return nil
 | |
| 	})
 | |
| 
 | |
| 	require.Nil(is.T(), err)
 | |
| 
 | |
| 	return currentContext
 | |
| }
 | |
| 
 | |
| func (is *interceptorSuite) callUnary(ctx context.Context, interceptor grpc.UnaryServerInterceptor) string {
 | |
| 	currentContext := ""
 | |
| 	resp, err := interceptor(ctx, nil, &grpc.UnaryServerInfo{
 | |
| 		FullMethod: "/com.docker.api.protos.context.v1.Contexts/test",
 | |
| 	}, func(ctx context.Context, req interface{}) (interface{}, error) {
 | |
| 		currentContext = apicontext.CurrentContext(ctx)
 | |
| 		return nil, nil
 | |
| 	})
 | |
| 
 | |
| 	require.Nil(is.T(), err)
 | |
| 	require.Nil(is.T(), resp)
 | |
| 
 | |
| 	return currentContext
 | |
| }
 | |
| 
 | |
| func TestInterceptor(t *testing.T) {
 | |
| 	suite.Run(t, new(interceptorSuite))
 | |
| }
 |