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