From f9c1de577976cb1952a0469ded602987cd6c1284 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 11 Aug 2018 14:49:49 +0700 Subject: [PATCH] make it possible to generate mocks of private internal interfaces --- internal/mockgen_internal.sh | 36 ++++++++++++++++++++++++++++++ internal/mocks/gen.go | 11 --------- internal/mocks/mockgen.go | 10 +++++++++ internal/mocks/mockgen_internal.sh | 21 ----------------- 4 files changed, 46 insertions(+), 32 deletions(-) create mode 100755 internal/mockgen_internal.sh delete mode 100644 internal/mocks/gen.go create mode 100644 internal/mocks/mockgen.go delete mode 100755 internal/mocks/mockgen_internal.sh diff --git a/internal/mockgen_internal.sh b/internal/mockgen_internal.sh new file mode 100755 index 000000000..a0f9112b7 --- /dev/null +++ b/internal/mockgen_internal.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# Mockgen refuses to generate mocks for internal packages. +# This script copies the internal directory and renames it to internalpackage. +# It also creages a public alias for private types. +# It then creates a mock for this public (alias) type. +# Afterwards, it corrects the import paths (replaces internalpackage back to internal). + +TEMP_DIR=$(mktemp -d) +mkdir -p $TEMP_DIR/src/github.com/lucas-clemente/quic-go/internalpackage + +# uppercase the name of the interface (only has an effect for private interfaces) +INTERFACE_NAME="$(tr '[:lower:]' '[:upper:]' <<< ${4:0:1})${4:1}" +PACKAGE_NAME=`echo $3 | sed 's/.*\///'` + +cp -r $GOPATH/src/github.com/lucas-clemente/quic-go/internal/* $TEMP_DIR/src/github.com/lucas-clemente/quic-go/internalpackage +find $TEMP_DIR -type f -name "*.go" -exec sed -i '' 's/internal/internalpackage/g' {} \; + +export GOPATH="$TEMP_DIR:$GOPATH" +PACKAGE_PATH=${3/internal/internalpackage} + +# if we're mocking a private interface, we need to add a public alias +if [ "$INTERFACE_NAME" != "$4" ]; then + # create a public alias for the interface, so that mockgen can process it + echo -e "package $PACKAGE_NAME\n" > $TEMP_DIR/src/$PACKAGE_PATH/mockgen_interface.go + echo "type $INTERFACE_NAME = $4" >> $TEMP_DIR/src/$PACKAGE_PATH/mockgen_interface.go +fi + +mockgen -package $1 -self_package $1 -destination $2 $PACKAGE_PATH $INTERFACE_NAME +sed -i '' 's/internalpackage/internal/g' $2 + +# mockgen imports the package we're generating a mock for +sed -i '' "s/$1\.//g" $2 +goimports -w $2 + +rm -r "$TEMP_DIR" diff --git a/internal/mocks/gen.go b/internal/mocks/gen.go deleted file mode 100644 index bd33e7d01..000000000 --- a/internal/mocks/gen.go +++ /dev/null @@ -1,11 +0,0 @@ -package mocks - -//go:generate sh -c "./mockgen_internal.sh mockhandshake handshake/mint_tls.go github.com/lucas-clemente/quic-go/internal/handshake MintTLS" -//go:generate sh -c "./mockgen_internal.sh mocks tls_extension_handler.go github.com/lucas-clemente/quic-go/internal/handshake TLSExtensionHandler" -//go:generate sh -c "./mockgen_internal.sh mocks stream_flow_controller.go github.com/lucas-clemente/quic-go/internal/flowcontrol StreamFlowController" -//go:generate sh -c "./mockgen_internal.sh mockackhandler ackhandler/sent_packet_handler.go github.com/lucas-clemente/quic-go/internal/ackhandler SentPacketHandler" -//go:generate sh -c "./mockgen_internal.sh mockackhandler ackhandler/received_packet_handler.go github.com/lucas-clemente/quic-go/internal/ackhandler ReceivedPacketHandler" -//go:generate sh -c "./mockgen_internal.sh mocks congestion.go github.com/lucas-clemente/quic-go/internal/congestion SendAlgorithm" -//go:generate sh -c "./mockgen_internal.sh mocks connection_flow_controller.go github.com/lucas-clemente/quic-go/internal/flowcontrol ConnectionFlowController" -//go:generate sh -c "./mockgen_internal.sh mockcrypto crypto/aead.go github.com/lucas-clemente/quic-go/internal/crypto AEAD" -//go:generate sh -c "goimports -w ." diff --git a/internal/mocks/mockgen.go b/internal/mocks/mockgen.go new file mode 100644 index 000000000..8de8235c6 --- /dev/null +++ b/internal/mocks/mockgen.go @@ -0,0 +1,10 @@ +package mocks + +//go:generate sh -c "../mockgen_internal.sh mockhandshake handshake/mint_tls.go github.com/lucas-clemente/quic-go/internal/handshake MintTLS" +//go:generate sh -c "../mockgen_internal.sh mocks tls_extension_handler.go github.com/lucas-clemente/quic-go/internal/handshake TLSExtensionHandler" +//go:generate sh -c "../mockgen_internal.sh mocks stream_flow_controller.go github.com/lucas-clemente/quic-go/internal/flowcontrol StreamFlowController" +//go:generate sh -c "../mockgen_internal.sh mockackhandler ackhandler/sent_packet_handler.go github.com/lucas-clemente/quic-go/internal/ackhandler SentPacketHandler" +//go:generate sh -c "../mockgen_internal.sh mockackhandler ackhandler/received_packet_handler.go github.com/lucas-clemente/quic-go/internal/ackhandler ReceivedPacketHandler" +//go:generate sh -c "../mockgen_internal.sh mocks congestion.go github.com/lucas-clemente/quic-go/internal/congestion SendAlgorithm" +//go:generate sh -c "../mockgen_internal.sh mocks connection_flow_controller.go github.com/lucas-clemente/quic-go/internal/flowcontrol ConnectionFlowController" +//go:generate sh -c "../mockgen_internal.sh mockcrypto crypto/aead.go github.com/lucas-clemente/quic-go/internal/crypto AEAD" diff --git a/internal/mocks/mockgen_internal.sh b/internal/mocks/mockgen_internal.sh deleted file mode 100755 index c45e4563b..000000000 --- a/internal/mocks/mockgen_internal.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -# Mockgen refuses to generate mocks for internal packages. -# This script copies the internal directory and renames it to internalpackage. -# That way, mockgen can generate the mock. -# Afterwards, it corrects the import paths (replaces internalpackage back to internal). - -TEMP_DIR=$(mktemp -d) -mkdir -p $TEMP_DIR/src/github.com/lucas-clemente/quic-go/internalpackage - -cp -r $GOPATH/src/github.com/lucas-clemente/quic-go/internal/* $TEMP_DIR/src/github.com/lucas-clemente/quic-go/internalpackage -find $TEMP_DIR -type f -name "*.go" -exec sed -i '' 's/internal/internalpackage/g' {} \; - -export GOPATH="$TEMP_DIR:$GOPATH" -PACKAGE_PATH=${3/internal/internalpackage} - - -mockgen -package $1 -self_package $1 -destination $2 $PACKAGE_PATH $4 -sed -i '' 's/internalpackage/internal/g' $2 - -rm -r "$TEMP_DIR"