1#!/usr/bin/env python
2
3# Copyright 2018 gRPC authors.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#     http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17from __future__ import print_function
18
19import os
20import sys
21
22os.chdir(os.path.join(os.path.dirname(sys.argv[0]), '../../..'))
23
24expected_files = [
25    "include/grpc++/create_channel_posix.h", "include/grpc++/server_builder.h",
26    "include/grpc++/resource_quota.h", "include/grpc++/create_channel.h",
27    "include/grpc++/alarm.h", "include/grpc++/server.h",
28    "include/grpc++/server_context.h", "include/grpc++/client_context.h",
29    "include/grpc++/server_posix.h", "include/grpc++/grpc++.h",
30    "include/grpc++/health_check_service_interface.h",
31    "include/grpc++/completion_queue.h", "include/grpc++/channel.h",
32    "include/grpc++/support/sync_stream.h", "include/grpc++/support/status.h",
33    "include/grpc++/support/config.h",
34    "include/grpc++/support/status_code_enum.h",
35    "include/grpc++/support/byte_buffer.h",
36    "include/grpc++/support/error_details.h",
37    "include/grpc++/support/async_unary_call.h",
38    "include/grpc++/support/channel_arguments.h",
39    "include/grpc++/support/async_stream.h", "include/grpc++/support/slice.h",
40    "include/grpc++/support/stub_options.h",
41    "include/grpc++/support/string_ref.h", "include/grpc++/support/time.h",
42    "include/grpc++/security/auth_metadata_processor.h",
43    "include/grpc++/security/credentials.h",
44    "include/grpc++/security/server_credentials.h",
45    "include/grpc++/security/auth_context.h",
46    "include/grpc++/impl/rpc_method.h",
47    "include/grpc++/impl/server_builder_option.h", "include/grpc++/impl/call.h",
48    "include/grpc++/impl/service_type.h", "include/grpc++/impl/grpc_library.h",
49    "include/grpc++/impl/client_unary_call.h",
50    "include/grpc++/impl/channel_argument_option.h",
51    "include/grpc++/impl/rpc_service_method.h",
52    "include/grpc++/impl/method_handler_impl.h",
53    "include/grpc++/impl/server_builder_plugin.h",
54    "include/grpc++/impl/sync_cxx11.h",
55    "include/grpc++/impl/server_initializer.h",
56    "include/grpc++/impl/serialization_traits.h",
57    "include/grpc++/impl/sync_no_cxx11.h",
58    "include/grpc++/impl/codegen/sync_stream.h",
59    "include/grpc++/impl/codegen/channel_interface.h",
60    "include/grpc++/impl/codegen/config_protobuf.h",
61    "include/grpc++/impl/codegen/status.h",
62    "include/grpc++/impl/codegen/core_codegen.h",
63    "include/grpc++/impl/codegen/config.h",
64    "include/grpc++/impl/codegen/core_codegen_interface.h",
65    "include/grpc++/impl/codegen/status_code_enum.h",
66    "include/grpc++/impl/codegen/metadata_map.h",
67    "include/grpc++/impl/codegen/rpc_method.h",
68    "include/grpc++/impl/codegen/server_context.h",
69    "include/grpc++/impl/codegen/byte_buffer.h",
70    "include/grpc++/impl/codegen/async_unary_call.h",
71    "include/grpc++/impl/codegen/server_interface.h",
72    "include/grpc++/impl/codegen/call.h",
73    "include/grpc++/impl/codegen/client_context.h",
74    "include/grpc++/impl/codegen/service_type.h",
75    "include/grpc++/impl/codegen/grpc_library.h",
76    "include/grpc++/impl/codegen/async_stream.h",
77    "include/grpc++/impl/codegen/slice.h",
78    "include/grpc++/impl/codegen/client_unary_call.h",
79    "include/grpc++/impl/codegen/proto_utils.h",
80    "include/grpc++/impl/codegen/stub_options.h",
81    "include/grpc++/impl/codegen/rpc_service_method.h",
82    "include/grpc++/impl/codegen/method_handler_impl.h",
83    "include/grpc++/impl/codegen/string_ref.h",
84    "include/grpc++/impl/codegen/completion_queue_tag.h",
85    "include/grpc++/impl/codegen/call_hook.h",
86    "include/grpc++/impl/codegen/completion_queue.h",
87    "include/grpc++/impl/codegen/serialization_traits.h",
88    "include/grpc++/impl/codegen/create_auth_context.h",
89    "include/grpc++/impl/codegen/time.h",
90    "include/grpc++/impl/codegen/security/auth_context.h",
91    "include/grpc++/ext/health_check_service_server_builder_option.h",
92    "include/grpc++/ext/proto_server_reflection_plugin.h",
93    "include/grpc++/generic/async_generic_service.h",
94    "include/grpc++/generic/generic_stub.h",
95    "include/grpc++/test/mock_stream.h",
96    "include/grpc++/test/server_context_test_spouse.h"
97]
98
99file_template = '''/*
100 *
101 * Copyright 2018 gRPC authors.
102 *
103 * Licensed under the Apache License, Version 2.0 (the "License");
104 * you may not use this file except in compliance with the License.
105 * You may obtain a copy of the License at
106 *
107 *     http://www.apache.org/licenses/LICENSE-2.0
108 *
109 * Unless required by applicable law or agreed to in writing, software
110 * distributed under the License is distributed on an "AS IS" BASIS,
111 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
112 * See the License for the specific language governing permissions and
113 * limitations under the License.
114 *
115 */
116
117// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the
118// headers in include/grpcpp instead. This header exists only for backwards
119// compatibility.
120
121#ifndef GRPCXX_FILE_PATH_NAME_UPPER
122#define GRPCXX_FILE_PATH_NAME_UPPER
123
124#include <grpcpp/FILE_PATH_NAME_LOWER>
125
126#endif  // GRPCXX_FILE_PATH_NAME_UPPER
127'''
128
129errors = 0
130
131path_files = []
132for root, dirs, files in os.walk('include/grpc++'):
133    for filename in files:
134        path_file = os.path.join(root, filename)
135        path_files.append(path_file)
136
137if path_files.sort() != expected_files.sort():
138    diff_plus = [file for file in path_files if file not in expected_files]
139    diff_minus = [file for file in expected_files if file not in path_files]
140    for file in diff_minus:
141        print('- ', file)
142    for file in diff_plus:
143        print('+ ', file)
144    errors += 1
145
146if errors > 0:
147    sys.exit(errors)
148
149for path_file in expected_files:
150    relative_path_file = path_file.split('/', 2)[2]
151
152    replace_lower = relative_path_file.replace('+', 'p')
153
154    replace_upper = relative_path_file.replace('/', '_')
155    replace_upper = replace_upper.replace('.', '_')
156    replace_upper = replace_upper.upper().replace('+', 'X')
157
158    expected_content = file_template.replace('FILE_PATH_NAME_LOWER',
159                                             replace_lower)
160    expected_content = expected_content.replace('FILE_PATH_NAME_UPPER',
161                                                replace_upper)
162
163    path_file_expected = path_file + '.expected'
164    with open(path_file_expected, "w") as fo:
165        fo.write(expected_content)
166
167    if 0 != os.system('diff %s %s' % (path_file_expected, path_file)):
168        print('Difference found in file:', path_file)
169        errors += 1
170
171    os.remove(path_file_expected)
172
173check_extensions = [".h", ".cc", ".c", ".m"]
174
175for root, dirs, files in os.walk('src'):
176    for filename in files:
177        path_file = os.path.join(root, filename)
178        for ext in check_extensions:
179            if path_file.endswith(ext):
180                try:
181                    with open(path_file, "r") as fi:
182                        content = fi.read()
183                        if '#include <grpc++/' in content:
184                            print(
185                                'Failed: invalid include of deprecated headers in include/grpc++ in %s'
186                                % path_file)
187                            errors += 1
188                except IOError:
189                    pass
190
191sys.exit(errors)
192