1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2009 The Android Open Source Project 3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License"); 5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License. 6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at 7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// http://www.apache.org/licenses/LICENSE-2.0 9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software 11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS, 12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and 14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License. 15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 160ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes 17aab50e31f0b80ed53a9b8d5dbabcf943974bd32cAlex Deymo#include "update_engine/payload_generator/graph_utils.h" 18aab50e31f0b80ed53a9b8d5dbabcf943974bd32cAlex Deymo 190ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes#include <utility> 200ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes#include <vector> 211bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes 220ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes#include <gtest/gtest.h> 231bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes 2439910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/payload_consumer/payload_constants.h" 251beda780333ce51d7872603b70712772eb2383fbAlex Deymo#include "update_engine/payload_generator/extent_ranges.h" 265c6c65570013bbdbd67f9bf6391dd295ef5b5ee6Alex Deymo#include "update_engine/payload_generator/extent_utils.h" 270ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes 280ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyesusing std::make_pair; 290ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyesusing std::vector; 300ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes 310ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyesnamespace chromeos_update_engine { 320ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes 330ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyesclass GraphUtilsTest : public ::testing::Test {}; 340ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes 350ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los ReyesTEST(GraphUtilsTest, SimpleTest) { 360ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes Graph graph(2); 3794817cb77d41d4be746a9f4f59ce0e9a0574218aDarin Petkov 380ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes graph[0].out_edges.insert(make_pair(1, EdgeProperties())); 390ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes 400ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes vector<Extent>& extents = graph[0].out_edges[1].extents; 410ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes 4280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, extents.size()); 435c6c65570013bbdbd67f9bf6391dd295ef5b5ee6Alex Deymo AppendBlockToExtents(&extents, 0); 4480f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, extents.size()); 455c6c65570013bbdbd67f9bf6391dd295ef5b5ee6Alex Deymo AppendBlockToExtents(&extents, 1); 465c6c65570013bbdbd67f9bf6391dd295ef5b5ee6Alex Deymo AppendBlockToExtents(&extents, 2); 4780f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, extents.size()); 485c6c65570013bbdbd67f9bf6391dd295ef5b5ee6Alex Deymo AppendBlockToExtents(&extents, 4); 4994817cb77d41d4be746a9f4f59ce0e9a0574218aDarin Petkov 5080f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(2U, extents.size()); 5180f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, extents[0].start_block()); 5280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(3U, extents[0].num_blocks()); 5380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(4U, extents[1].start_block()); 5480f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, extents[1].num_blocks()); 5594817cb77d41d4be746a9f4f59ce0e9a0574218aDarin Petkov 5680f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(4U, graph_utils::EdgeWeight(graph, make_pair(0, 1))); 570ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes} 580ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes 591bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes 601bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los ReyesTEST(GraphUtilsTest, DepsTest) { 611bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes Graph graph(3); 6294817cb77d41d4be746a9f4f59ce0e9a0574218aDarin Petkov 631bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes graph_utils::AddReadBeforeDep(&graph[0], 1, 3); 6480f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, graph[0].out_edges.size()); 651bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes { 661bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes Extent& extent = graph[0].out_edges[1].extents[0]; 6780f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(3U, extent.start_block()); 6880f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, extent.num_blocks()); 691bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes } 701bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes graph_utils::AddReadBeforeDep(&graph[0], 1, 4); 7180f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, graph[0].out_edges.size()); 721bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes { 731bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes Extent& extent = graph[0].out_edges[1].extents[0]; 7480f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(3U, extent.start_block()); 7580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(2U, extent.num_blocks()); 761bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes } 771bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes graph_utils::AddReadBeforeDepExtents(&graph[2], 1, 781bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes vector<Extent>(1, ExtentForRange(5, 2))); 7980f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, graph[2].out_edges.size()); 801bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes { 811bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes Extent& extent = graph[2].out_edges[1].extents[0]; 8280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(5U, extent.start_block()); 8380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(2U, extent.num_blocks()); 841bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes } 851bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes // Change most recent edge from read-before to write-before 861bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes graph[2].out_edges[1].write_extents.swap(graph[2].out_edges[1].extents); 871bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes graph_utils::DropWriteBeforeDeps(&graph[2].out_edges); 8880f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, graph[2].out_edges.size()); 8994817cb77d41d4be746a9f4f59ce0e9a0574218aDarin Petkov 9080f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, graph[0].out_edges.size()); 911bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes graph_utils::DropIncomingEdgesTo(&graph, 1); 9280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, graph[0].out_edges.size()); 931bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes} 941bc16ab20eabba1785d2b99aa90494bbe7601740Andrew de los Reyes 950ce161b06c0430de62658e1f6bcea7a4a97eddf7Andrew de los Reyes} // namespace chromeos_update_engine 96