Merge pull request #2413 from dgquintas/interop_sniffer

Introduced InteropContextInspector 
diff --git a/include/grpc++/server_context.h b/include/grpc++/server_context.h
index 2123d03..6f094ed 100644
--- a/include/grpc++/server_context.h
+++ b/include/grpc++/server_context.h
@@ -76,6 +76,10 @@
 class CompletionQueue;
 class Server;
 
+namespace testing {
+class InteropContextInspector;
+}  // namespace testing
+
 // Interface of server side rpc context.
 class ServerContext {
  public:
@@ -93,7 +97,7 @@
   void AddInitialMetadata(const grpc::string& key, const grpc::string& value);
   void AddTrailingMetadata(const grpc::string& key, const grpc::string& value);
 
-  bool IsCancelled();
+  bool IsCancelled() const;
 
   const std::multimap<grpc::string, grpc::string>& client_metadata() {
     return client_metadata_;
@@ -102,6 +106,7 @@
   std::shared_ptr<const AuthContext> auth_context() const;
 
  private:
+  friend class ::grpc::testing::InteropContextInspector;
   friend class ::grpc::Server;
   template <class W, class R>
   friend class ::grpc::ServerAsyncReader;
diff --git a/src/cpp/server/server_context.cc b/src/cpp/server/server_context.cc
index 0be7713..3b8a026 100644
--- a/src/cpp/server/server_context.cc
+++ b/src/cpp/server/server_context.cc
@@ -144,7 +144,7 @@
   trailing_metadata_.insert(std::make_pair(key, value));
 }
 
-bool ServerContext::IsCancelled() {
+bool ServerContext::IsCancelled() const {
   return completion_op_ && completion_op_->CheckCancelled(cq_);
 }
 
diff --git a/test/cpp/interop/server_helper.cc b/test/cpp/interop/server_helper.cc
index c2e750d..30a78ff 100644
--- a/test/cpp/interop/server_helper.cc
+++ b/test/cpp/interop/server_helper.cc
@@ -58,5 +58,18 @@
   }
 }
 
+InteropContextInspector::InteropContextInspector(
+    const ::grpc::ServerContext& context)
+    : context_(context) {}
+
+std::shared_ptr<const AuthContext> InteropContextInspector::GetAuthContext()
+    const {
+  return context_.auth_context();
+}
+
+bool InteropContextInspector::IsCancelled() const {
+  return context_.IsCancelled();
+}
+
 }  // namespace testing
 }  // namespace grpc
diff --git a/test/cpp/interop/server_helper.h b/test/cpp/interop/server_helper.h
index f98e67b..ce977b4 100644
--- a/test/cpp/interop/server_helper.h
+++ b/test/cpp/interop/server_helper.h
@@ -36,6 +36,7 @@
 
 #include <memory>
 
+#include <grpc++/server_context.h>
 #include <grpc++/server_credentials.h>
 
 namespace grpc {
@@ -43,6 +44,18 @@
 
 std::shared_ptr<ServerCredentials> CreateInteropServerCredentials();
 
+class InteropContextInspector {
+ public:
+  InteropContextInspector(const ::grpc::ServerContext& context);
+
+  // Inspector methods, able to peek inside ServerContext, follow.
+  std::shared_ptr<const AuthContext> GetAuthContext() const;
+  bool IsCancelled() const;
+
+ private:
+  const ::grpc::ServerContext& context_;
+};
+
 }  // namespace testing
 }  // namespace grpc