xref: /aosp_15_r20/external/protobuf/benchmarks/util/proto3_data_stripper.cc (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker #include "benchmarks.pb.h"
2*1b3f573fSAndroid Build Coastguard Worker #include "datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
3*1b3f573fSAndroid Build Coastguard Worker #include "datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
4*1b3f573fSAndroid Build Coastguard Worker #include "datasets/google_message2/benchmark_message2.pb.h"
5*1b3f573fSAndroid Build Coastguard Worker #include "datasets/google_message3/benchmark_message3.pb.h"
6*1b3f573fSAndroid Build Coastguard Worker #include "datasets/google_message4/benchmark_message4.pb.h"
7*1b3f573fSAndroid Build Coastguard Worker #include "data_proto2_to_proto3_util.h"
8*1b3f573fSAndroid Build Coastguard Worker 
9*1b3f573fSAndroid Build Coastguard Worker #include <fstream>
10*1b3f573fSAndroid Build Coastguard Worker 
11*1b3f573fSAndroid Build Coastguard Worker using google::protobuf::util::Proto3DataStripper;
12*1b3f573fSAndroid Build Coastguard Worker 
ReadFile(const std::string & name)13*1b3f573fSAndroid Build Coastguard Worker std::string ReadFile(const std::string& name) {
14*1b3f573fSAndroid Build Coastguard Worker   std::ifstream file(name.c_str());
15*1b3f573fSAndroid Build Coastguard Worker   GOOGLE_CHECK(file.is_open()) << "Couldn't find file '"
16*1b3f573fSAndroid Build Coastguard Worker       << name
17*1b3f573fSAndroid Build Coastguard Worker       << "', please make sure you are running this command from the benchmarks"
18*1b3f573fSAndroid Build Coastguard Worker       << " directory.\n";
19*1b3f573fSAndroid Build Coastguard Worker   return std::string((std::istreambuf_iterator<char>(file)),
20*1b3f573fSAndroid Build Coastguard Worker                      std::istreambuf_iterator<char>());
21*1b3f573fSAndroid Build Coastguard Worker }
22*1b3f573fSAndroid Build Coastguard Worker 
main(int argc,char * argv[])23*1b3f573fSAndroid Build Coastguard Worker int main(int argc, char *argv[]) {
24*1b3f573fSAndroid Build Coastguard Worker   if (argc % 2 == 0 || argc == 1) {
25*1b3f573fSAndroid Build Coastguard Worker     std::cerr << "Usage: [input_files] [output_file_names] where " <<
26*1b3f573fSAndroid Build Coastguard Worker         "input_files are one to one mapping to output_file_names." <<
27*1b3f573fSAndroid Build Coastguard Worker         std::endl;
28*1b3f573fSAndroid Build Coastguard Worker     return 1;
29*1b3f573fSAndroid Build Coastguard Worker   }
30*1b3f573fSAndroid Build Coastguard Worker 
31*1b3f573fSAndroid Build Coastguard Worker   for (int i = argc / 2; i > 0; i--) {
32*1b3f573fSAndroid Build Coastguard Worker     const std::string &input_file = argv[i];
33*1b3f573fSAndroid Build Coastguard Worker     const std::string &output_file = argv[i + argc / 2];
34*1b3f573fSAndroid Build Coastguard Worker 
35*1b3f573fSAndroid Build Coastguard Worker     std::cerr << "Generating " << input_file
36*1b3f573fSAndroid Build Coastguard Worker         << " to " << output_file << std::endl;
37*1b3f573fSAndroid Build Coastguard Worker     benchmarks::BenchmarkDataset dataset;
38*1b3f573fSAndroid Build Coastguard Worker     Message* message;
39*1b3f573fSAndroid Build Coastguard Worker     std::string dataset_payload = ReadFile(input_file);
40*1b3f573fSAndroid Build Coastguard Worker     GOOGLE_CHECK(dataset.ParseFromString(dataset_payload))
41*1b3f573fSAndroid Build Coastguard Worker       << "Can' t parse data file " << input_file;
42*1b3f573fSAndroid Build Coastguard Worker 
43*1b3f573fSAndroid Build Coastguard Worker     if (dataset.message_name() == "benchmarks.proto3.GoogleMessage1") {
44*1b3f573fSAndroid Build Coastguard Worker       message = new benchmarks::proto3::GoogleMessage1;
45*1b3f573fSAndroid Build Coastguard Worker     } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage1") {
46*1b3f573fSAndroid Build Coastguard Worker       message = new benchmarks::proto2::GoogleMessage1;
47*1b3f573fSAndroid Build Coastguard Worker     } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage2") {
48*1b3f573fSAndroid Build Coastguard Worker       message = new benchmarks::proto2::GoogleMessage2;
49*1b3f573fSAndroid Build Coastguard Worker     } else if (dataset.message_name() ==
50*1b3f573fSAndroid Build Coastguard Worker         "benchmarks.google_message3.GoogleMessage3") {
51*1b3f573fSAndroid Build Coastguard Worker       message = new benchmarks::google_message3::GoogleMessage3;
52*1b3f573fSAndroid Build Coastguard Worker     } else if (dataset.message_name() ==
53*1b3f573fSAndroid Build Coastguard Worker         "benchmarks.google_message4.GoogleMessage4") {
54*1b3f573fSAndroid Build Coastguard Worker       message = new benchmarks::google_message4::GoogleMessage4;
55*1b3f573fSAndroid Build Coastguard Worker     } else {
56*1b3f573fSAndroid Build Coastguard Worker       std::cerr << "Unknown message type: " << dataset.message_name();
57*1b3f573fSAndroid Build Coastguard Worker       exit(1);
58*1b3f573fSAndroid Build Coastguard Worker     }
59*1b3f573fSAndroid Build Coastguard Worker 
60*1b3f573fSAndroid Build Coastguard Worker     for (int i = 0; i < dataset.payload_size(); i++) {
61*1b3f573fSAndroid Build Coastguard Worker       message->ParseFromString(dataset.payload(i));
62*1b3f573fSAndroid Build Coastguard Worker       Proto3DataStripper stripper;
63*1b3f573fSAndroid Build Coastguard Worker       stripper.StripMessage(message);
64*1b3f573fSAndroid Build Coastguard Worker       dataset.set_payload(i, message->SerializeAsString());
65*1b3f573fSAndroid Build Coastguard Worker     }
66*1b3f573fSAndroid Build Coastguard Worker 
67*1b3f573fSAndroid Build Coastguard Worker     std::ofstream ofs(output_file);
68*1b3f573fSAndroid Build Coastguard Worker     ofs << dataset.SerializeAsString();
69*1b3f573fSAndroid Build Coastguard Worker     ofs.close();
70*1b3f573fSAndroid Build Coastguard Worker   }
71*1b3f573fSAndroid Build Coastguard Worker 
72*1b3f573fSAndroid Build Coastguard Worker 
73*1b3f573fSAndroid Build Coastguard Worker   return 0;
74*1b3f573fSAndroid Build Coastguard Worker }
75