blob: c1176172c08d7ec23ea5211a7e42b5116d61314f [file] [log] [blame]
/*
* Copyright (C) 2025 The Android Open Source Project
*
* 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.
*/
#ifndef SRC_PROTOVM_TEST_SAMPLE_PACKETS_H_
#define SRC_PROTOVM_TEST_SAMPLE_PACKETS_H_
#include "perfetto/protozero/message.h"
#include "perfetto/protozero/scattered_heap_buffer.h"
#include "src/protovm/test/protos/incremental_trace.pb.h"
namespace perfetto {
namespace protovm {
namespace test {
class SamplePackets {
public:
static protos::TraceEntry TraceEntryWithOneElement() {
protos::TraceEntry entry;
auto* element0 = entry.add_elements();
element0->set_id(0);
element0->set_value(10);
element0->set_value_fixed32(32);
element0->set_value_fixed64(64);
return entry;
}
static protos::TraceEntry TraceEntryWithTwoElements() {
protos::TraceEntry entry;
auto* element0 = entry.add_elements();
*element0 = TraceEntryWithOneElement().elements(0);
auto* element1 = entry.add_elements();
element1->set_id(1);
element1->set_value(11);
return entry;
}
static protos::Patch PatchWithInitialState() {
protos::Patch patch;
auto* element10 = patch.add_elements_to_set();
element10->set_id(0);
element10->set_value(10);
auto* element11 = patch.add_elements_to_set();
element11->set_id(1);
element11->set_value(11);
return patch;
}
static protos::Patch PatchWithDelOperation() {
protos::Patch patch;
patch.add_elements_to_delete(0);
return patch;
}
static protos::Patch PatchWithMergeOperation1() {
protos::Patch patch;
auto* element0 = patch.add_elements_to_merge();
element0->set_id(0);
element0->set_value(10);
return patch;
}
static protos::Patch PatchWithMergeOperation2() {
protos::Patch patch;
auto* element0 = patch.add_elements_to_merge();
element0->set_id(0);
element0->set_value(100);
auto* element1 = patch.add_elements_to_merge();
element1->set_id(1);
element1->set_value(101);
return patch;
}
static protos::Patch PatchWithSetOperation() {
protos::Patch patch;
auto* element0 = patch.add_elements_to_set();
element0->set_id(0);
auto* element1 = patch.add_elements_to_set();
element1->set_id(1);
element1->set_value(101);
return patch;
}
static std::string PatchInconsistentWithIncrementalTraceProgram() {
protozero::HeapBuffered<protozero::Message> proto;
auto* element_to_set = proto.get()->BeginNestedMessage<protozero::Message>(
protos::Patch::kElementsToSetFieldNumber);
// The VM program will access the field elements_to_set[0].id expecting to
// find a scalar but here we are setting it as a length-delimited field
// (incompatible wire type), thus causing an abort.
std::string_view random_invalid_data = "random invalid data";
element_to_set->AppendBytes(protos::Element::kIdFieldNumber,
random_invalid_data.data(),
random_invalid_data.size());
return proto.SerializeAsString();
}
};
} // namespace test
} // namespace protovm
} // namespace perfetto
#endif // SRC_PROTOVM_TEST_SAMPLE_PACKETS_H_