New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support BinderChannelBuilder.forTarget. #8633
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
/* | ||
* Copyright 2021 The gRPC Authors | ||
* | ||
* 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 io.grpc.testing; | ||
|
||
import com.google.common.collect.ImmutableList; | ||
import io.grpc.EquivalentAddressGroup; | ||
import io.grpc.NameResolver; | ||
import io.grpc.NameResolverProvider; | ||
import io.grpc.NameResolverRegistry; | ||
import io.grpc.Status; | ||
import java.net.SocketAddress; | ||
import java.net.URI; | ||
|
||
/** A name resolver to always resolve the given URI into the given address. */ | ||
public final class FakeNameResolverProvider extends NameResolverProvider { | ||
|
||
/** | ||
* Register a new resolver. | ||
* | ||
* @param targetUri The URI to resolve when requested. | ||
* @param address The address to return for the target URI. | ||
*/ | ||
public static final void register(String targetUri, SocketAddress address) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we should delete this method and instead expose the constructor. This method is a bad pattern. After a test using this is over, it should really deregister the provider. Conceptually (but maybe using
I don't think this class needs to make that try-finally easier, but it shouldn't encourage being used in a register-only fashion. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good point, fixed. |
||
NameResolverRegistry.getDefaultRegistry().register( | ||
new FakeNameResolverProvider(URI.create(targetUri), address)); | ||
} | ||
|
||
private final URI targetUri; | ||
private final SocketAddress address; | ||
|
||
private FakeNameResolverProvider(URI targetUri, SocketAddress address) { | ||
this.targetUri = targetUri; | ||
this.address = address; | ||
} | ||
|
||
@Override | ||
public NameResolver newNameResolver(URI targetUri, NameResolver.Args args) { | ||
if (targetUri.equals(this.targetUri)) { | ||
return new FakeNameResolver(address); | ||
} | ||
return null; | ||
} | ||
|
||
@Override | ||
protected boolean isAvailable() { | ||
return true; | ||
} | ||
|
||
@Override | ||
protected int priority() { | ||
return 5; // Default | ||
} | ||
|
||
@Override | ||
public String getDefaultScheme() { | ||
return targetUri.getScheme(); | ||
} | ||
|
||
/** A single name resolver. */ | ||
private static final class FakeNameResolver extends NameResolver { | ||
private static final String AUTHORITY = "fake-authority"; | ||
|
||
private final SocketAddress address; | ||
private volatile boolean shutdown; | ||
|
||
private FakeNameResolver(SocketAddress address) { | ||
this.address = address; | ||
} | ||
|
||
@Override | ||
public void start(Listener2 listener) { | ||
if (shutdown) { | ||
listener.onError(Status.FAILED_PRECONDITION.withDescription("Resolver is shutdown")); | ||
} else { | ||
listener.onResult( | ||
ResolutionResult.newBuilder() | ||
.setAddresses(ImmutableList.of(new EquivalentAddressGroup(address))) | ||
.build()); | ||
} | ||
} | ||
|
||
@Override | ||
public String getServiceAuthority() { | ||
return AUTHORITY; | ||
} | ||
|
||
@Override | ||
public void shutdown() { | ||
shutdown = true; | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The testing project is actually published, so this is pubic API. Either we should mark it experimental, or move it to
io.grpc.internal.testing
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah of course, thanks. I've had cause to use something like this myself internally, so marking experimental.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We may want to discuss when you used this internally, as I expect it was probably with a grpc-maintainer hat on (e.g., when writing a transport). It wouldn't be "against the rules" to have this be internal but let some specific tests access it (I expect we're doing that already).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's a good point, on consideration moving to
io.grpc.internal.testing
.