diff --git a/fs_mgr/libsnapshot/tools/Android.bp b/fs_mgr/libsnapshot/tools/Android.bp index cfa0cefe7..0f0828699 100644 --- a/fs_mgr/libsnapshot/tools/Android.bp +++ b/fs_mgr/libsnapshot/tools/Android.bp @@ -20,3 +20,26 @@ cc_binary { cflags: ["-Werror"], } + + +cc_binary { + name: "basic_v2_cow_writer", + host_supported: true, + defaults: [ + "fs_mgr_defaults", + "libsnapshot_cow_defaults", + ], + + srcs: ["basic_v2_cow_writer.cpp"], + + static_libs: [ + "libsnapshot_cow", + ], + + shared_libs: [ + "libbase", + "liblog", + ], + + cflags: ["-Werror"], +} diff --git a/fs_mgr/libsnapshot/tools/basic_v2_cow_writer.cpp b/fs_mgr/libsnapshot/tools/basic_v2_cow_writer.cpp new file mode 100644 index 000000000..59d35399a --- /dev/null +++ b/fs_mgr/libsnapshot/tools/basic_v2_cow_writer.cpp @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include +#include + +#include "android-base/unique_fd.h" + +using namespace android::snapshot; + +// This writes a simple cow v2 file in the current directory. This file will serve as testdata for +// ensuring our v3 cow reader will be able to read a cow file created by the v2 writer. +// +// WARNING: We should not be overriding this test file, as it will serve as historic marker for what +// a device with old writer_v2 will write as a cow. +void write_cow_v2() { + CowOptions options; + options.cluster_ops = 5; + options.num_merge_ops = 1; + std::string data = "This is some data, believe it"; + data.resize(options.block_size, '\0'); + + char cwd_buffer[1024]; + size_t cwd_buffer_size = sizeof(cwd_buffer); + + // Get the current working directory path. + char* err = getcwd(cwd_buffer, cwd_buffer_size); + if (!err) { + LOG(ERROR) << "Couldn't get current directory"; + } + android::base::unique_fd fd(open(strcat(cwd_buffer, "/cow_v2"), O_CREAT | O_RDWR, 0666)); + if (fd.get() == -1) { + LOG(FATAL) << "couldn't open tmp_cow"; + } + std::unique_ptr writer = CreateCowWriter(2, options, std::move(fd)); + writer->AddCopy(0, 5); + writer->AddRawBlocks(2, data.data(), data.size()); + writer->AddLabel(1); + writer->AddXorBlocks(50, data.data(), data.size(), 24, 10); + writer->AddZeroBlocks(5, 10); + writer->AddLabel(2); + writer->Finalize(); +} + +int main() { + write_cow_v2(); +} diff --git a/fs_mgr/libsnapshot/tools/testdata/cow_v2 b/fs_mgr/libsnapshot/tools/testdata/cow_v2 new file mode 100644 index 000000000..9f37dfc50 Binary files /dev/null and b/fs_mgr/libsnapshot/tools/testdata/cow_v2 differ