Movatterモバイル変換


[0]ホーム

URL:


testutils

package
v1.77.0Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 17, 2025 License:Apache-2.0Imports:31Imported by:0

Details

Repository

github.com/grpc/grpc-go

Links

Documentation

Overview

Package testutils contains testing helpers.

Index

Constants

View Source
const DefaultChanBufferSize = 1

DefaultChanBufferSize is the default buffer size of the underlying channel.

View Source
const DefaultHTTPRequestTimeout = 1 *time.Second

DefaultHTTPRequestTimeout is the default timeout value for the amount of timethis client waits for a response to be pushed on RespChan before it fails theDo() call.

Variables

View Source
var ErrTestConstPicker =fmt.Errorf("const picker error")

ErrTestConstPicker is error returned by test const picker.

Functions

funcAwaitNoStateChangeadded inv1.58.0

func AwaitNoStateChange(ctxcontext.Context, t *testing.T, scStateChanger, currStateconnectivity.State)

AwaitNoStateChange expects ctx to be canceled before sc's state leavescurrState, and fatal errors otherwise.

funcAwaitNotStateadded inv1.58.0

func AwaitNotState(ctxcontext.Context, t *testing.T, scStateChanger, stateDoNotWantconnectivity.State)

AwaitNotState waits for sc to leave stateDoNotWant or fatal errors if itdoesn't happen before ctx expires.

funcAwaitStateadded inv1.58.0

func AwaitState(ctxcontext.Context, t *testing.T, scStateChanger, stateWantconnectivity.State)

AwaitState waits for sc to enter stateWant or fatal errors if it doesn'thappen before ctx expires.

funcCreateBootstrapFileForTestingadded inv1.66.0

func CreateBootstrapFileForTesting(t *testing.T, bootstrapContents []byte)

CreateBootstrapFileForTesting creates a temporary file with the providedbootstrap contents, and updates the bootstrap environment variable to pointto this file.

Registers a cleanup function on the provided testing.T, that deletes thetemporary file and resets the bootstrap environment variable.

funcCreateClientTLSCredentialsadded inv1.66.0

func CreateClientTLSCredentials(t *testing.T)credentials.TransportCredentials

CreateClientTLSCredentials creates client-side TLS transport credentialsusing certificate and key files from testdata/x509 directory.

funcCreateServerTLSCredentialsadded inv1.66.0

func CreateServerTLSCredentials(t *testing.T, clientAuthtls.ClientAuthType)credentials.TransportCredentials

CreateServerTLSCredentials creates server-side TLS transport credentialsusing certificate and key files from testdata/x509 directory.

funcCreateServerTLSCredentialsCompatibleWithSPIFFEadded inv1.73.0

func CreateServerTLSCredentialsCompatibleWithSPIFFE(t *testing.T, clientAuthtls.ClientAuthType)credentials.TransportCredentials

CreateServerTLSCredentialsCompatibleWithSPIFFE creates server-side TLStransport credentials using certificate and key files from thetestdata/spiffe_end2end directory. These credentials are compatible with theSPIFFE trust bundles used on the client side.

funcCreateServerTLSCredentialsCompatibleWithSPIFFEChainadded inv1.73.0

func CreateServerTLSCredentialsCompatibleWithSPIFFEChain(t *testing.T, clientAuthtls.ClientAuthType)credentials.TransportCredentials

CreateServerTLSCredentialsCompatibleWithSPIFFEChain creates server-side TLStransport credentials using a certificate chain and key files from thetestdata/spiffe_end2end directory. These credentials are compatible with theSPIFFE trust bundles used on the client side.

funcCreateServerTLSCredentialsValidSPIFFEButWrongCAadded inv1.73.0

func CreateServerTLSCredentialsValidSPIFFEButWrongCA(t *testing.T, clientAuthtls.ClientAuthType)credentials.TransportCredentials

CreateServerTLSCredentialsValidSPIFFEButWrongCA creates server-side TLStransport credentials using certificate and key files from thetestdata/spiffe directory rather than the testdata/spiffe_end2end directory.These credentials have the expected trust domains and SPIFFE IDs that arecompatible with testdata/spiffe_end2end client files, but they are signed bya different CA and will thus fail the connection.

funcIsRoundRobinadded inv1.43.0

func IsRoundRobin(want []balancer.SubConn, f func()balancer.SubConn)error

IsRoundRobin checks whether f's return value is roundrobin of elements fromwant. But it doesn't check for the order. Note that want can containduplicate items, which makes it weight-round-robin.

Step 1. the return values of f should form a permutation of all elements inwant, but not necessary in the same order. E.g. if want is {a,a,b}, the checkfails if f returns:

  • {a,a,a}: third a is returned before b
  • {a,b,b}: second b is returned before the second a

If error is found in this step, the returned error contains only the firstiteration until where it goes wrong.

Step 2. the return values of f should be repetitions of the same permutation.E.g. if want is {a,a,b}, the check fails if f returns:

  • {a,b,a,b,a,a}: though it satisfies step 1, the second iteration is notrepeating the first iteration.

If error is found in this step, the returned error contains the firstiteration + the second iteration until where it goes wrong.

funcLocalTCPListeneradded inv1.43.0

func LocalTCPListener() (net.Listener,error)

LocalTCPListener returns a net.Listener listening on local address and port.

funcMarshalAnyadded inv1.38.0

func MarshalAny(t *testing.T, mproto.Message) *anypb.Any

MarshalAny is a convenience function to marshal protobuf messages into anyprotos. function will fail the test with a fatal error if the marshaling fails.

funcMustParseURLadded inv1.53.0

func MustParseURL(targetstring) *url.URL

MustParseURL attempts to parse the provided target using url.Parse()and panics if parsing fails.

funcNewTestWRRadded inv1.43.0

func NewTestWRR()wrr.WRR

NewTestWRR return a WRR for testing. It's deterministic instead of random.

funcParsePortadded inv1.55.0

func ParsePort(t *testing.T, addrstring)uint32

ParsePort returns the port from the given address string, as a unit32.

funcSetEnvConfigadded inv1.72.0

func SetEnvConfig[Tany](t *testing.T, variable *T, value T)

SetEnvConfig sets the value of the given variable to the specified value,taking care of restoring the original value after the test completes.

funcStatusErrEqualadded inv1.22.0

func StatusErrEqual(err1, err2error)bool

StatusErrEqual returns true iff both err1 and err2 wrap status.Status errorsand their underlying status protos are equal.

funcStayConnectedadded inv1.58.0

func StayConnected(ctxcontext.Context, scStateChanger)

StayConnected makes sc stay connected by repeatedly calling sc.Connect()until the state becomes Shutdown or until the context expires.

funcSubConnFromPickeradded inv1.51.0

func SubConnFromPicker(pbalancer.Picker) func()balancer.SubConn

SubConnFromPicker returns a function which returns a SubConn by calling thePick() method of the provided picker. There is no caching of SubConns here.Every invocation of the returned function results in a new pick.

Types

typeBalancerClientConnadded inv1.60.0

type BalancerClientConn struct {internal.EnforceClientConnEmbeddingNewSubConnAddrsCh      chan []resolver.Address// the last 10 []Address to create subconn.NewSubConnCh           chan *TestSubConn// the last 10 subconn created.ShutdownSubConnCh      chan *TestSubConn// the last 10 subconn removed.UpdateAddressesAddrsCh chan []resolver.Address// last updated address via UpdateAddresses().NewPickerCh  chanbalancer.Picker// the last picker updated.NewStateCh   chanconnectivity.State// the last state.ResolveNowCh chanresolver.ResolveNowOptions// the last ResolveNow().// contains filtered or unexported fields}

BalancerClientConn is a mock balancer.ClientConn used in tests.

funcNewBalancerClientConnadded inv1.60.0

func NewBalancerClientConn(t *testing.T) *BalancerClientConn

NewBalancerClientConn creates a BalancerClientConn.

func (*BalancerClientConn)MetricsRecorderadded inv1.71.0

func (*BalancerClientConn) MetricsRecorder()stats.MetricsRecorder

MetricsRecorder returns an empty MetricsRecorderList.

func (*BalancerClientConn)NewSubConnadded inv1.60.0

NewSubConn creates a new SubConn.

func (*BalancerClientConn)RemoveSubConnadded inv1.60.0

func (tcc *BalancerClientConn) RemoveSubConn(scbalancer.SubConn)

RemoveSubConn is a nop; tests should all be updated to use sc.Shutdown()instead.

func (*BalancerClientConn)ResolveNowadded inv1.60.0

ResolveNow panics.

func (*BalancerClientConn)Targetadded inv1.60.0

func (tcc *BalancerClientConn) Target()string

Target panics.

func (*BalancerClientConn)UpdateAddressesadded inv1.60.0

func (tcc *BalancerClientConn) UpdateAddresses(scbalancer.SubConn, addrs []resolver.Address)

UpdateAddresses updates the addresses on the SubConn.

func (*BalancerClientConn)UpdateStateadded inv1.60.0

func (tcc *BalancerClientConn) UpdateState(bsbalancer.State)

UpdateState updates connectivity state and picker.

func (*BalancerClientConn)WaitForConnectivityStateadded inv1.60.0

func (tcc *BalancerClientConn) WaitForConnectivityState(ctxcontext.Context, wantconnectivity.State)error

WaitForConnectivityState waits until the state pushed to this ClientConnmatches the wanted state. Returns an error if the provided context expires,including the last received state (if any).

func (*BalancerClientConn)WaitForErrPickeradded inv1.60.0

func (tcc *BalancerClientConn) WaitForErrPicker(ctxcontext.Context)error

WaitForErrPicker waits until an error picker is pushed to this ClientConn.Returns error if the provided context expires or a non-error picker is pushedto the ClientConn.

func (*BalancerClientConn)WaitForPickeradded inv1.60.0

func (tcc *BalancerClientConn) WaitForPicker(ctxcontext.Context, f func(balancer.Picker)error)error

WaitForPicker waits for a picker that results in f returning nil. If thecontext expires, returns the last error returned by f (if any).

func (*BalancerClientConn)WaitForPickerWithErradded inv1.60.0

func (tcc *BalancerClientConn) WaitForPickerWithErr(ctxcontext.Context, wanterror)error

WaitForPickerWithErr waits until an error picker is pushed to thisClientConn with the error matching the wanted error. Returns an error ifthe provided context expires, including the last received picker error (ifany).

func (*BalancerClientConn)WaitForRoundRobinPickeradded inv1.60.0

func (tcc *BalancerClientConn) WaitForRoundRobinPicker(ctxcontext.Context, want ...balancer.SubConn)error

WaitForRoundRobinPicker waits for a picker that passes IsRoundRobin. Alsodrains the matching state channel and requires it to be READY (if an entryis pending) to be considered. Returns an error if the provided contextexpires, including the last received error from IsRoundRobin or the picker(if any).

typeBlockingDialeradded inv1.66.0

type BlockingDialer struct {// contains filtered or unexported fields}

BlockingDialer is a dialer that waits for Resume() to be called beforedialing.

funcNewBlockingDialeradded inv1.66.0

func NewBlockingDialer() *BlockingDialer

NewBlockingDialer returns a dialer that waits for Resume() to be calledbefore dialing.

func (*BlockingDialer)DialContextadded inv1.66.0

func (d *BlockingDialer) DialContext(ctxcontext.Context, addrstring) (net.Conn,error)

DialContext implements a context dialer for use with grpc.WithContextDialerdial option for a BlockingDialer.

func (*BlockingDialer)Holdadded inv1.66.0

func (d *BlockingDialer) Hold(addrstring) *Hold

Hold blocks the dialer when a connection attempt is made to the given addr.A hold is valid for exactly one connection attempt. Multiple holds for anaddr can be added, and they will apply in the order that the connections areattempted.

typeChanneladded inv1.30.0

type Channel struct {// C is the underlying channel on which values sent using the SendXxx()// methods are delivered. Tests which cannot use ReceiveXxx() for whatever// reasons can use C to read the values.C chanany}

Channel wraps a generic channel and provides a timed receive operation.

funcNewChanneladded inv1.30.0

func NewChannel() *Channel

NewChannel returns a new Channel.

funcNewChannelWithSizeadded inv1.30.0

func NewChannelWithSize(bufSizeint) *Channel

NewChannelWithSize returns a new Channel with a buffer of bufSize.

func (*Channel)Drainadded inv1.70.0

func (c *Channel) Drain()

Drain drains the channel by repeatedly reading from it until it is empty.

func (*Channel)Receiveadded inv1.30.0

func (c *Channel) Receive(ctxcontext.Context) (any,error)

Receive returns the value received on the underlying channel, or the errorreturned by ctx if it is closed or cancelled.

func (*Channel)ReceiveOrFailadded inv1.34.0

func (c *Channel) ReceiveOrFail() (any,bool)

ReceiveOrFail returns the value on the underlying channel and true, or niland false if the channel was empty.

func (*Channel)Replaceadded inv1.33.0

func (c *Channel) Replace(valueany)

Replace clears the value on the underlying channel, and sends the new value.

It's expected to be used with a size-1 channel, to only keep the mostup-to-date item. This method is inherently racy when invoked concurrentlyfrom multiple goroutines.

func (*Channel)Sendadded inv1.30.0

func (c *Channel) Send(valueany)

Send sends value on the underlying channel.

func (*Channel)SendContextadded inv1.34.0

func (c *Channel) SendContext(ctxcontext.Context, valueany)error

SendContext sends value on the underlying channel, or returns an error ifthe context expires.

func (*Channel)SendOrFailadded inv1.34.0

func (c *Channel) SendOrFail(valueany)bool

SendOrFail attempts to send value on the underlying channel. Returns trueif successful or false if the channel was full.

typeConnWrapperadded inv1.46.0

type ConnWrapper struct {net.ConnCloseCh *Channel}

ConnWrapper wraps a net.Conn and pushes on a channel when closed.

func (*ConnWrapper)Closeadded inv1.46.0

func (cw *ConnWrapper) Close()error

Close closes the connection and sends a value on the close channel.

typeFakeHTTPClientadded inv1.33.0

type FakeHTTPClient struct {// ReqChan exposes the HTTP.Request made by the code under test.ReqChan *Channel// RespChan is a channel on which this fake client accepts responses to be// sent to the code under test.RespChan *Channel// Err, if set, is returned by Do().Errerror// RecvTimeout is the amount of the time this client waits for a response to// be pushed on RespChan before it fails the Do() call. If this field is// left unspecified, DefaultHTTPRequestTimeout is used.RecvTimeouttime.Duration}

FakeHTTPClient helps mock out HTTP calls made by the code under test. Itmakes HTTP requests made by the code under test available through a channel,and makes it possible to inject various responses.

func (*FakeHTTPClient)Doadded inv1.33.0

func (fc *FakeHTTPClient) Do(req *http.Request) (*http.Response,error)

Do pushes req on ReqChan and returns the response available on RespChan.

typeHoldadded inv1.66.0

type Hold struct {// contains filtered or unexported fields}

Hold is a handle to a single connection attempt. It can be used to block,fail and succeed connection attempts.

func (*Hold)Failadded inv1.66.0

func (h *Hold) Fail(errerror)

Fail fails the connection attempt. Either Resume or Fail must becalled at most once on a hold. Otherwise, Resume panics.

func (*Hold)IsStartedadded inv1.67.0

func (h *Hold) IsStarted()bool

IsStarted returns true if this hold has received a connection attempt.

func (*Hold)Resumeadded inv1.66.0

func (h *Hold) Resume()

Resume unblocks the dialer for the given addr. Either Resume or Fail must becalled at most once on a hold. Otherwise, Resume panics.

func (*Hold)Waitadded inv1.66.0

func (h *Hold) Wait(ctxcontext.Context)bool

Wait blocks until there is a connection attempt on this Hold, or the contextexpires. Return false if the context has expired, true otherwise.

typeListenerWrapperadded inv1.46.0

type ListenerWrapper struct {net.ListenerNewConnCh *Channel}

ListenerWrapper wraps a net.Listener and the returned net.Conn.

It pushes on a channel whenever it accepts a new connection.

funcNewListenerWrapperadded inv1.46.0

func NewListenerWrapper(t *testing.T, lisnet.Listener) *ListenerWrapper

NewListenerWrapper returns a ListenerWrapper.

func (*ListenerWrapper)Acceptadded inv1.46.0

func (l *ListenerWrapper) Accept() (net.Conn,error)

Accept wraps the Listener Accept and sends the accepted connection on achannel.

typeLoggeradded inv1.60.0

type Logger interface {Log(args ...any)Logf(formatstring, args ...any)Errorf(formatstring, args ...any)}

Logger wraps the logging methods from testing.T.

typePipeListener

type PipeListener struct {// contains filtered or unexported fields}

PipeListener is a listener with an unbuffered pipe. Each write will complete only once the other side reads. Itshould only be created using NewPipeListener.

funcNewPipeListener

func NewPipeListener() *PipeListener

NewPipeListener creates a new pipe listener.

func (*PipeListener)Accept

func (p *PipeListener) Accept() (net.Conn,error)

Accept accepts a connection.

func (*PipeListener)Addr

func (p *PipeListener) Addr()net.Addr

Addr returns a pipe addr.

func (*PipeListener)Close

func (p *PipeListener) Close()error

Close closes the listener.

func (*PipeListener)Dialer

func (p *PipeListener) Dialer() func(string,time.Duration) (net.Conn,error)

Dialer dials a connection.

typeResolverClientConnadded inv1.60.0

type ResolverClientConn struct {resolver.ClientConn// Embedding the interface to avoid implementing deprecated methods.LoggerLogger// Tests should pass testing.T for this.UpdateStateF func(resolver.State)error// Invoked when resolver pushes a state update.ReportErrorF func(errerror)// Invoked when resolver pushes an error.}

ResolverClientConn is a fake implementation of the resolver.ClientConninterface to be used in tests.

func (*ResolverClientConn)ParseServiceConfigadded inv1.60.0

func (t *ResolverClientConn) ParseServiceConfig(jsonSCstring) *serviceconfig.ParseResult

ParseServiceConfig parses the provided service by delegating the work to theimplementation in the grpc package.

func (*ResolverClientConn)ReportErroradded inv1.60.0

func (t *ResolverClientConn) ReportError(errerror)

ReportError pushes the error received from the resolver on to ErrorCh.

func (*ResolverClientConn)UpdateStateadded inv1.60.0

func (t *ResolverClientConn) UpdateState(sresolver.State)error

UpdateState invokes the test specified callback with the update received fromthe resolver. If the callback returns a non-nil error, the same will bepropagated to the resolver.

typeRestartableListeneradded inv1.43.0

type RestartableListener struct {// contains filtered or unexported fields}

RestartableListener wraps a net.Listener and supports stopping and restartingthe latter.

funcNewRestartableListeneradded inv1.43.0

func NewRestartableListener(lnet.Listener) *RestartableListener

NewRestartableListener returns a new RestartableListener wrapping l.

func (*RestartableListener)Acceptadded inv1.43.0

func (l *RestartableListener) Accept() (net.Conn,error)

Accept waits for and returns the next connection to the listener.

If the listener is currently not accepting new connections, because `Stop`was called on it, the connection is immediately closed after acceptingwithout any bytes being sent on it.

func (*RestartableListener)Addradded inv1.43.0

func (l *RestartableListener) Addr()net.Addr

Addr returns the listener's network address.

func (*RestartableListener)Closeadded inv1.43.0

func (l *RestartableListener) Close()error

Close closes the listener.

func (*RestartableListener)Restartadded inv1.43.0

func (l *RestartableListener) Restart()

Restart gets a previously stopped listener to start accepting connections.

func (*RestartableListener)Stopadded inv1.43.0

func (l *RestartableListener) Stop()

Stop closes existing connections on the listener and prevents new connectionsfrom being accepted.

typeStateChangeradded inv1.58.0

type StateChanger interface {// Connect begins connecting the StateChanger.Connect()// GetState returns the current state of the StateChanger.GetState()connectivity.State// WaitForStateChange returns true when the state becomes s, or returns// false if ctx is canceled first.WaitForStateChange(ctxcontext.Context, sconnectivity.State)bool}

A StateChanger reports state changes, e.g. a grpc.ClientConn.

typeStubStatsHandleradded inv1.60.0

type StubStatsHandler struct {TagRPCF     func(ctxcontext.Context, info *stats.RPCTagInfo)context.ContextHandleRPCF  func(ctxcontext.Context, infostats.RPCStats)TagConnF    func(ctxcontext.Context, info *stats.ConnTagInfo)context.ContextHandleConnF func(ctxcontext.Context, infostats.ConnStats)}

StubStatsHandler is a stats handler that is easy to customize withinindividual test cases. It is a stubbable implementation ofgoogle.golang.org/grpc/stats.Handler for testing purposes.

func (*StubStatsHandler)HandleConnadded inv1.60.0

func (ssh *StubStatsHandler) HandleConn(ctxcontext.Context, csstats.ConnStats)

HandleConn calls the StubStatsHandler's HandleConnF, if set.

func (*StubStatsHandler)HandleRPCadded inv1.60.0

func (ssh *StubStatsHandler) HandleRPC(ctxcontext.Context, rsstats.RPCStats)

HandleRPC calls the StubStatsHandler's HandleRPCF, if set.

func (*StubStatsHandler)TagConnadded inv1.60.0

TagConn calls the StubStatsHandler's TagConnF, if set.

func (*StubStatsHandler)TagRPCadded inv1.60.0

TagRPC calls the StubStatsHandler's TagRPCF, if set.

typeTestConstPickeradded inv1.43.0

type TestConstPicker struct {ErrerrorSCbalancer.SubConn}

TestConstPicker is a const picker for tests.

func (*TestConstPicker)Pickadded inv1.43.0

Pick returns the const SubConn or the error.

typeTestSubConnadded inv1.43.0

type TestSubConn struct {balancer.SubConnConnectCh chan struct{}Addresses []resolver.Address// contains filtered or unexported fields}

TestSubConn implements the SubConn interface, to be used in tests.

funcNewTestSubConnadded inv1.58.0

func NewTestSubConn(idstring) *TestSubConn

NewTestSubConn returns a newly initialized SubConn. Typically, subconnsshould be created via TestClientConn.NewSubConn instead, but can be usefulfor some tests.

func (*TestSubConn)Connectadded inv1.43.0

func (tsc *TestSubConn) Connect()

Connect is a no-op.

func (*TestSubConn)GetOrBuildProduceradded inv1.51.0

func (tsc *TestSubConn) GetOrBuildProducer(balancer.ProducerBuilder) (balancer.Producer, func())

GetOrBuildProducer is a no-op.

func (*TestSubConn)RegisterHealthListeneradded inv1.69.0

func (tsc *TestSubConn) RegisterHealthListener(lis func(balancer.SubConnState))

RegisterHealthListener sends a READY update to mock a situation when nohealth checking mechanisms are configured.

func (*TestSubConn)Shutdownadded inv1.58.0

func (tsc *TestSubConn) Shutdown()

Shutdown pushes the SubConn to the ShutdownSubConn channel in the parentTestClientConn.

func (*TestSubConn)Stringadded inv1.43.0

func (tsc *TestSubConn) String()string

String implements stringer to print human friendly error message.

func (*TestSubConn)UpdateAddressesadded inv1.43.0

func (tsc *TestSubConn) UpdateAddresses([]resolver.Address)

UpdateAddresses is a no-op.

func (*TestSubConn)UpdateStateadded inv1.58.0

func (tsc *TestSubConn) UpdateState(statebalancer.SubConnState)

UpdateState pushes the state to the listener, if one is registered.

Source Files

View all Source files

Directories

PathSynopsis
Package fakegrpclb provides a fake implementation of the grpclb server.
Package fakegrpclb provides a fake implementation of the grpclb server.
Package pickfirst contains helper functions to check for pickfirst load balancing of RPCs in tests.
Package pickfirst contains helper functions to check for pickfirst load balancing of RPCs in tests.
Package proxyserver provides an implementation of a proxy server for testing purposes.
Package proxyserver provides an implementation of a proxy server for testing purposes.
Package rls contains utilities for RouteLookupService e2e tests.
Package rls contains utilities for RouteLookupService e2e tests.
Package roundrobin contains helper functions to check for roundrobin and weighted-roundrobin load balancing of RPCs in tests.
Package roundrobin contains helper functions to check for roundrobin and weighted-roundrobin load balancing of RPCs in tests.
Package stats implements a TestMetricsRecorder utility.
Package stats implements a TestMetricsRecorder utility.
xds
e2e
Package e2e provides utilities for end2end testing of xDS functionality.
Package e2e provides utilities for end2end testing of xDS functionality.
e2e/setup
Package setup implements setup helpers for xDS e2e tests.
Package setup implements setup helpers for xDS e2e tests.
fakeserver
Package fakeserver provides a fake implementation of the management server.
Package fakeserver provides a fake implementation of the management server.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f orF : Jump to
y orY : Canonical URL
go.dev uses cookies from Google to deliver and enhance the quality of its services and to analyze traffic.Learn more.

[8]ページ先頭

©2009-2025 Movatter.jp