Specify PEL callout priority and sort callouts.

Allow the priority to be passed in at creation time by calling the
CALLOUT_PRIORITY keyword. When creating a PEL, callouts will always
be sorted by priority instead of creation time, the order is as follows:
H,M,A,B,C,L.

Signed-off-by: Miguel Gomez <mgomez@mx1.ibm.com>
Change-Id: I84345aaf3fad7b2e4958b698ab761966f499986b
diff --git a/test/openpower-pels/src_callouts_test.cpp b/test/openpower-pels/src_callouts_test.cpp
index b1fe9c4..69c26b8 100644
--- a/test/openpower-pels/src_callouts_test.cpp
+++ b/test/openpower-pels/src_callouts_test.cpp
@@ -120,3 +120,83 @@
 
     EXPECT_EQ(callouts.callouts().size(), maxNumberOfCallouts);
 }
+
+TEST(CalloutsTest, TestSortCallouts)
+{
+    Callouts callouts;
+
+    // Add  callouts with different priorities to test sorting in descending
+    // order
+
+    auto c0 = std::make_unique<Callout>(CalloutPriority::high, "U1-P1",
+                                        "1234567", "ABC", "123456789ABC");
+
+    callouts.addCallout(std::move(c0));
+
+    auto c1 = std::make_unique<Callout>(CalloutPriority::medium, "U1-P2",
+                                        "1234567", "ABCD", "123456789ABC");
+
+    callouts.addCallout(std::move(c1));
+
+    auto c2 = std::make_unique<Callout>(CalloutPriority::low, "U1-P3",
+                                        "1234567", "ABCDE", "123456789ABC");
+
+    callouts.addCallout(std::move(c2));
+
+    auto c3 = std::make_unique<Callout>(CalloutPriority::high, "U1-P4",
+                                        "1234567", "ABCDE1", "123456789ABC");
+
+    callouts.addCallout(std::move(c3));
+
+    auto c4 = std::make_unique<Callout>(CalloutPriority::high, "U1-P5",
+                                        "1234567", "ABCDE2", "123456789ABC");
+
+    callouts.addCallout(std::move(c4));
+
+    auto c5 = std::make_unique<Callout>(CalloutPriority::low, "U1-P6",
+                                        "1234567", "ABCDE2", "123456789ABC");
+
+    callouts.addCallout(std::move(c5));
+
+    auto c6 = std::make_unique<Callout>(CalloutPriority::medium, "U1-P7",
+                                        "1234567", "ABCD2", "123456789ABC");
+
+    callouts.addCallout(std::move(c6));
+
+    auto c7 = std::make_unique<Callout>(CalloutPriority::mediumGroupA, "U1-P8",
+                                        "1234567", "ABCDE3", "123456789ABC");
+
+    callouts.addCallout(std::move(c7));
+
+    auto c8 = std::make_unique<Callout>(CalloutPriority::mediumGroupC, "U1-P9",
+                                        "1234567", "ABCDE4", "123456789ABC");
+
+    callouts.addCallout(std::move(c8));
+
+    auto c9 = std::make_unique<Callout>(CalloutPriority::low, "U1-P10",
+                                        "1234567", "ABCDE3", "123456789ABC");
+
+    callouts.addCallout(std::move(c9));
+
+    const auto& calloutObjects = callouts.callouts();
+    EXPECT_EQ(calloutObjects[0]->locationCode(), "U1-P1");
+    EXPECT_EQ(calloutObjects[0]->priority(), 'H');
+    EXPECT_EQ(calloutObjects[1]->locationCode(), "U1-P4");
+    EXPECT_EQ(calloutObjects[1]->priority(), 'H');
+    EXPECT_EQ(calloutObjects[2]->locationCode(), "U1-P5");
+    EXPECT_EQ(calloutObjects[2]->priority(), 'H');
+    EXPECT_EQ(calloutObjects[3]->locationCode(), "U1-P2");
+    EXPECT_EQ(calloutObjects[3]->priority(), 'M');
+    EXPECT_EQ(calloutObjects[4]->locationCode(), "U1-P7");
+    EXPECT_EQ(calloutObjects[4]->priority(), 'M');
+    EXPECT_EQ(calloutObjects[5]->locationCode(), "U1-P8");
+    EXPECT_EQ(calloutObjects[5]->priority(), 'A');
+    EXPECT_EQ(calloutObjects[6]->locationCode(), "U1-P9");
+    EXPECT_EQ(calloutObjects[6]->priority(), 'C');
+    EXPECT_EQ(calloutObjects[7]->locationCode(), "U1-P3");
+    EXPECT_EQ(calloutObjects[7]->priority(), 'L');
+    EXPECT_EQ(calloutObjects[8]->locationCode(), "U1-P6");
+    EXPECT_EQ(calloutObjects[8]->priority(), 'L');
+    EXPECT_EQ(calloutObjects[9]->locationCode(), "U1-P10");
+    EXPECT_EQ(calloutObjects[9]->priority(), 'L');
+}