Partially test bl1_fwu

Add tests for bl1_fwu_add_loaded_id and bl1_fwu_remove_loaded_id.
c-picker was used for isolating these two functions from the rest of
the code.

Change-Id: I39259c6b845547e112385806e334733c986d56d3
Signed-off-by: Imre Kis <imre.kis@arm.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3ad62d2..d7c20b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -111,5 +111,6 @@
 # Project level include directory
 include_directories(${CMAKE_CURRENT_LIST_DIR}/include)
 
+include(tests/bl1/test_bl1_fwu.cmake)
 include(tests/lib/libc/test_libc.cmake)
 include(tests/lib/object_pool/test_object_pool.cmake)
diff --git a/tests/bl1/bl1_fwu_add_loaded_id.yml b/tests/bl1/bl1_fwu_add_loaded_id.yml
new file mode 100644
index 0000000..08b700c
--- /dev/null
+++ b/tests/bl1/bl1_fwu_add_loaded_id.yml
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2019-2020, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+elements:
+- file: bl1/bl1_fwu.c
+  type: variable
+  name: bl1_fwu_loaded_ids
+  options: [remove_static]
+- file: bl1/bl1_fwu.c
+  type: function
+  name: bl1_fwu_add_loaded_id
+  options: [remove_static]
+- file: bl1/bl1_fwu.c
+  type: function
+  name: bl1_fwu_remove_loaded_id
+  options: [remove_static]
diff --git a/tests/bl1/test_bl1_fwu.cmake b/tests/bl1/test_bl1_fwu.cmake
new file mode 100644
index 0000000..af84530
--- /dev/null
+++ b/tests/bl1/test_bl1_fwu.cmake
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2019-2020, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+include(UnitTest)
+
+unit_test_add_suite(
+	NAME bl1_fwu
+	SOURCES
+		${CMAKE_CURRENT_LIST_DIR}/test_bl1_fwu.cpp
+		${CMAKE_CURRENT_LIST_DIR}/bl1_fwu_add_loaded_id.yml
+	COMPILE_DEFINITIONS
+		-DFWU_MAX_SIMULTANEOUS_IMAGES=10
+		-DINVALID_IMAGE_ID=0xffffffff
+)
diff --git a/tests/bl1/test_bl1_fwu.cpp b/tests/bl1/test_bl1_fwu.cpp
new file mode 100644
index 0000000..4185b7a
--- /dev/null
+++ b/tests/bl1/test_bl1_fwu.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "CppUTest/TestHarness.h"
+
+#define IMAGE_ID0	(0)
+#define IMAGE_ID1	(1)
+
+extern "C" {
+extern unsigned int bl1_fwu_loaded_ids[FWU_MAX_SIMULTANEOUS_IMAGES];
+
+extern int bl1_fwu_add_loaded_id(unsigned int image_id);
+extern int bl1_fwu_remove_loaded_id(unsigned int image_id);
+}
+
+TEST_GROUP(bl1_fwu) {
+	TEST_SETUP() {
+		for (int i = 0; i < FWU_MAX_SIMULTANEOUS_IMAGES; i++) {
+			bl1_fwu_loaded_ids[i] = INVALID_IMAGE_ID;
+		}
+	}
+};
+
+TEST(bl1_fwu, add_one) {
+	LONGS_EQUAL(0, bl1_fwu_add_loaded_id(IMAGE_ID0));
+	UNSIGNED_LONGS_EQUAL(IMAGE_ID0, bl1_fwu_loaded_ids[0]);
+}
+
+TEST(bl1_fwu, add_two_different) {
+	LONGS_EQUAL(0, bl1_fwu_add_loaded_id(IMAGE_ID0));
+	LONGS_EQUAL(0, bl1_fwu_add_loaded_id(IMAGE_ID1));
+	UNSIGNED_LONGS_EQUAL(IMAGE_ID0, bl1_fwu_loaded_ids[0]);
+	UNSIGNED_LONGS_EQUAL(IMAGE_ID1, bl1_fwu_loaded_ids[1]);
+}
+
+TEST(bl1_fwu, add_two_identical) {
+	for (int i = 0; i < 2; i++) {
+		LONGS_EQUAL(0, bl1_fwu_add_loaded_id(IMAGE_ID0));
+	}
+	UNSIGNED_LONGS_EQUAL(IMAGE_ID0, bl1_fwu_loaded_ids[0]);
+	UNSIGNED_LONGS_EQUAL(INVALID_IMAGE_ID, bl1_fwu_loaded_ids[1]);
+}
+
+TEST(bl1_fwu, add_until_overflow) {
+	for (unsigned int i = 0; i < FWU_MAX_SIMULTANEOUS_IMAGES; i++) {
+		LONGS_EQUAL(0, bl1_fwu_add_loaded_id(i));
+		UNSIGNED_LONGS_EQUAL(i, bl1_fwu_loaded_ids[i]);
+	}
+
+	LONGS_EQUAL(1, bl1_fwu_add_loaded_id(FWU_MAX_SIMULTANEOUS_IMAGES));
+}
+
+TEST(bl1_fwu, remove_from_empty_array) {
+	LONGS_EQUAL(1, bl1_fwu_remove_loaded_id(IMAGE_ID0));
+}
+
+TEST(bl1_fwu, add_one_and_remove_one) {
+	LONGS_EQUAL(0, bl1_fwu_add_loaded_id(IMAGE_ID0));
+	LONGS_EQUAL(0, bl1_fwu_remove_loaded_id(IMAGE_ID0));
+	UNSIGNED_LONGS_EQUAL(INVALID_IMAGE_ID, bl1_fwu_loaded_ids[0]);
+}
+
+TEST(bl1_fwu, add_two_and_remove_first) {
+	LONGS_EQUAL(0, bl1_fwu_add_loaded_id(IMAGE_ID0));
+	LONGS_EQUAL(0, bl1_fwu_add_loaded_id(IMAGE_ID1));
+	LONGS_EQUAL(0, bl1_fwu_remove_loaded_id(IMAGE_ID0));
+	UNSIGNED_LONGS_EQUAL(INVALID_IMAGE_ID, bl1_fwu_loaded_ids[0]);
+	UNSIGNED_LONGS_EQUAL(IMAGE_ID1, bl1_fwu_loaded_ids[1]);
+}