Snap for 5636702 from 774f9ade4bb611c51f26629df23dddc1d1a19fff to qt-c2f2-release

Change-Id: I1e7e37099c177f58aab38624fd0df4456d6b9799
diff --git a/src/faceauth_tests.cc b/src/faceauth_tests.cc
index 273cd5a..cd41d98 100644
--- a/src/faceauth_tests.cc
+++ b/src/faceauth_tests.cc
@@ -51,9 +51,6 @@
 
 void FaceAuthTest::SetUpTestCase() {
   srand(time(NULL));
-  for (int i = 0; i <= MAX_NUM_PROFILES; ++i) {
-    user_ids.push_back(rand());
-  }
   uart_printer = test_harness::TestHarness::MakeUnique();
 
   client = nugget_tools::MakeNuggetClient();
@@ -115,7 +112,7 @@
 static fa_result_t MakeResult(uint64_t session_id, int32_t error,
                               uint32_t output_data1 = 0,
                               uint32_t output_data2 = 0,
-                              uint32_t lockout_event = FACEAUTH_LOCKOUT_NOP) {
+                              uint32_t output_data3 = 0) {
   fa_result_t result;
   memset(&result, 0, sizeof(fa_result_t));
   result.version = 1;
@@ -123,7 +120,7 @@
   result.error = error;
   result.output.data.first = output_data1;
   result.output.data.second = output_data2;
-  result.lockout_event = lockout_event;
+  result.output.data.third = output_data3;
   result.complete = 1;
   result.crc = CalcCrc8(reinterpret_cast<const uint8_t*>(&result),
                         offsetof(struct fa_result_t, crc));
@@ -148,11 +145,11 @@
     else
       buffer.push_back(0);
   }
-  for (size_t i = 0; i < sizeof(fa_token_t); ++i) {
-    if (token)
+
+  if (token) {
+    for (size_t i = 0; i < sizeof(fa_token_t); ++i) {
       buffer.push_back(*(reinterpret_cast<const uint8_t*>(token) + i));
-    else
-      buffer.push_back(0);
+    }
   }
 
   return buffer;
@@ -172,7 +169,7 @@
   EXPECT_EQ(r1.error, r2.error);
   EXPECT_EQ(r1.output.data.first, r2.output.data.first);
   EXPECT_EQ(r1.output.data.second, r2.output.data.second);
-  EXPECT_EQ(r1.lockout_event, r2.lockout_event);
+  EXPECT_EQ(r1.output.data.third, r2.output.data.third);
   EXPECT_EQ(r1.complete, r2.complete);
   EXPECT_EQ(r1.crc, r2.crc);
 }
@@ -181,7 +178,7 @@
                                         const fa_embedding_t* embed,
                                         const fa_token_t* token) {
   vector<uint8_t> buffer_rx;
-  buffer_rx.resize(1024);
+  buffer_rx.resize(512);
 
   vector<uint8_t> buffer_tx = Task2Buffer(task, embed, token);
   FaceAuthTest::client->CallApp(APP_ID_FACEAUTH_TEST, 1, buffer_tx, &buffer_rx);
@@ -195,6 +192,19 @@
 }
 
 void FaceAuthTest::SetUp() {
+  user_ids.clear();
+  for (int i = 0; i <= MAX_NUM_PROFILES; ++i) {
+    user_ids.push_back(rand());
+  }
+
+  fa_task_t task;
+  fa_embedding_t embed;
+  fa_token_t token;
+  memset(&task, 0, sizeof(task));
+  memset(&embed, 0, sizeof(embed));
+  memset(&token, 0, sizeof(token));
+  RunTask(task, &embed, &token);
+
   for (int profiles = 1; profiles <= MAX_NUM_PROFILES; ++profiles) {
     Run(MakeResult(0x0, FACEAUTH_SUCCESS),
         MakeTask(0x0, profiles, FACEAUTH_CMD_ERASE));
@@ -208,7 +218,7 @@
   Run(MakeResult(session_id, FACEAUTH_SUCCESS, FACEAUTH_NOMATCH),
       MakeTask(session_id, 0x1, FACEAUTH_CMD_COMP), MakeEmbedding(0x11));
   session_id++;
-  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0x1),
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0, 0, 0x1),
       MakeTask(session_id, 0x1, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x11));
   session_id++;
   Run(MakeResult(session_id, FACEAUTH_SUCCESS, FACEAUTH_MATCH),
@@ -226,12 +236,12 @@
   uint64_t session_id = 0xFACE000022220000ull;
   for (uint32_t i = 0; i < 20; ++i) {
     session_id++;
-    Run(MakeResult(session_id, FACEAUTH_SUCCESS, profile1),
+    Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0, 0, profile1),
         MakeTask(session_id, profile1, FACEAUTH_CMD_ENROLL),
         MakeEmbedding((i == slot1) ? 0x11 : 0x0));
 
     session_id++;
-    Run(MakeResult(session_id, FACEAUTH_SUCCESS, profile2),
+    Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0, 0, profile2),
         MakeTask(session_id, profile2, FACEAUTH_CMD_ENROLL),
         MakeEmbedding((i == slot2) ? 0xAA : 0x0));
   }
@@ -254,12 +264,12 @@
   uint64_t session_id = 0xFACE000033330000ull;
   for (int i = 0; i < 20; ++i) {
     session_id++;
-    Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0x1),
+    Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0, 0, 0x1),
         MakeTask(session_id, 0x1, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x0));
   }
 
   session_id++;
-  Run(MakeResult(session_id, FACEAUTH_ERR_SFS_FULL, 0x1),
+  Run(MakeResult(session_id, FACEAUTH_ERR_SFS_FULL, 0, 0, 0x1),
       MakeTask(session_id, 0x1, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x0));
 }
 
@@ -324,29 +334,21 @@
   EXPECT_EQ(IsProfileLocked(6), false);
 }
 
-TEST_F(FaceAuthTest, ValidProfileUserIDTest) {
-  fa_token_t token;
+TEST_F(FaceAuthTest, ValidProfileIDTest) {
   uint64_t session_id = 0xFACE000088880000ull;
   session_id++;
-  token = MakeToken(1);
-  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 1),
-      MakeTask(session_id, 0, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x0), &token);
+  Run(MakeResult(session_id, FACEAUTH_ERR_INVALID_ARGS),
+      MakeTask(session_id, 0, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x0));
 
-  for (int i = 1; i <= 6; ++i) {
+  for (int i = 1; i <= MAX_NUM_PROFILES; ++i) {
     session_id++;
-    token = MakeToken(i);
-    Run(MakeResult(session_id, FACEAUTH_SUCCESS, i),
-        MakeTask(session_id, (i % 2) ? i : 0, FACEAUTH_CMD_ENROLL),
-        MakeEmbedding(0x0), &token);
+    Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0, 0, i),
+        MakeTask(session_id, i, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x0));
   }
 
   session_id++;
-  token = MakeToken(2);
-  Run(MakeResult(session_id, FACEAUTH_ERR_INVALID_TOKEN),
-      MakeTask(session_id, 3, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x0), &token);
-  session_id++;
-  Run(MakeResult(session_id, FACEAUTH_ERR_SFS_FULL),
-      MakeTask(session_id, 0, FACEAUTH_CMD_ENROLL));
+  Run(MakeResult(session_id, FACEAUTH_ERR_INVALID_ARGS),
+      MakeTask(session_id, MAX_NUM_PROFILES + 1, FACEAUTH_CMD_ENROLL));
 }
 
 TEST_F(FaceAuthTest, InvalidCommandTest) {
@@ -399,7 +401,7 @@
 TEST_F(FaceAuthTest, EmbeddingVersionTest) {
   uint64_t session_id = 0xFACE0000BBBB0000ull;
   session_id++;
-  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 1),
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0, 0, 1),
       MakeTask(session_id, 0x1, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x11));
   session_id++;
   Run(MakeResult(session_id, FACEAUTH_SUCCESS, FACEAUTH_MATCH),
@@ -412,7 +414,7 @@
 TEST_F(FaceAuthTest, FirmwareVersionTest) {
   uint64_t session_id = 0xFACE0000CCCC0000ull;
   session_id++;
-  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 1),
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0, 0, 1),
       MakeTask(session_id, 0x1, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x11));
   session_id++;
   Run(MakeResult(session_id, FACEAUTH_ERR_VERSION, FACEAUTH_NOMATCH),
@@ -435,6 +437,136 @@
       MakeEmbedding(0x11));
 }
 
+TEST_F(FaceAuthTest, GetProfileInfoTest) {
+  uint64_t session_id = 0xFACE0000CCCC0000ull;
+  user_ids[1] = user_ids[4];
+  user_ids[2] = user_ids[4];
+
+  for (int i = 1; i <= MAX_NUM_PROFILES; ++i) {
+    session_id++;
+    fa_token_t token = MakeToken(i);
+    Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0, 0, i),
+        MakeTask(session_id, i, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x11),
+        &token);
+  }
+
+  union {
+    uint8_t map[8];
+    struct {
+      uint32_t first;
+      uint32_t second;
+    };
+  } expected = {0};
+
+  for (int i = 0; i < MAX_NUM_PROFILES; ++i) {
+    for (int j = 0; j < MAX_NUM_PROFILES; ++j) {
+      expected.map[i] |= ((user_ids[i + 1] == user_ids[j + 1]) << j);
+    }
+  }
+
+  for (int i = 1; i <= MAX_NUM_PROFILES; ++i) {
+    session_id++;
+    fa_token_t token = MakeToken(i);
+    expected.map[MAX_NUM_PROFILES] = expected.map[i - 1];
+    Run(MakeResult(session_id, FACEAUTH_SUCCESS, expected.first,
+                   expected.second),
+        MakeTask(session_id, 1, FACEAUTH_CMD_GET_PROFILE_INFO),
+        MakeEmbedding(0x11), &token);
+  }
+
+  for (int i = 1; i <= MAX_NUM_PROFILES; ++i) {
+    session_id++;
+    Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0, 0, expected.map[i - 1]),
+        MakeTask(session_id, i, FACEAUTH_CMD_GET_USER_INFO),
+        MakeEmbedding(0x11));
+  }
+}
+
+TEST_F(FaceAuthTest, EnrollShouldOnlyAcceptSameUser) {
+  uint64_t session_id = 0xFACE0000DDDD0000ull;
+  session_id++;
+
+  session_id++;
+  fa_token_t token = MakeToken(1);
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0, 0, 0x1),
+      MakeTask(session_id, 0x1, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x11),
+      &token);
+  session_id++;
+  token = MakeToken(2);
+  Run(MakeResult(session_id, FACEAUTH_ERR_INVALID_TOKEN),
+      MakeTask(session_id, 0x1, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x11),
+      &token);
+  session_id++;
+  token = MakeToken(1);
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0, 0, 0x1),
+      MakeTask(session_id, 0x1, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x11),
+      &token);
+}
+
+TEST_F(FaceAuthTest, MigrateShouldOnlyAcceptSameUser) {
+  uint64_t session_id = 0xFACE0000DDDD0000ull;
+  session_id++;
+
+  session_id++;
+  fa_token_t token = MakeToken(1);
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0x1),
+      MakeTask(session_id, 0x1, FACEAUTH_CMD_MIGRATE), MakeEmbedding(0x11),
+      &token);
+  session_id++;
+  token = MakeToken(2);
+  Run(MakeResult(session_id, FACEAUTH_ERR_INVALID_TOKEN),
+      MakeTask(session_id, 0x1, FACEAUTH_CMD_MIGRATE), MakeEmbedding(0x11),
+      &token);
+  session_id++;
+  token = MakeToken(1);
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0x1),
+      MakeTask(session_id, 0x1, FACEAUTH_CMD_MIGRATE), MakeEmbedding(0x11),
+      &token);
+}
+
+TEST_F(FaceAuthTest, SimpleAuthenticateMigrateFlow) {
+  uint64_t session_id = 0xFACE0000EEEE0000ull;
+  session_id++;
+
+  session_id++;
+  fa_token_t token = MakeToken(1);
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0, 0, 0x1),
+      MakeTask(session_id, 0x1, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x11),
+      &token);
+  session_id++;
+  token = MakeToken(2);
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 0, 0, 0x2),
+      MakeTask(session_id, 0x2, FACEAUTH_CMD_ENROLL), MakeEmbedding(0x11),
+      &token);
+
+  session_id++;
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, FACEAUTH_MATCH),
+      MakeTask(session_id, 0x1, FACEAUTH_CMD_COMP), MakeEmbedding(0x11));
+  session_id++;
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 3, 0, FACEAUTH_NOMATCH),
+      MakeTask(session_id, 0x3, FACEAUTH_CMD_MIGRATE), MakeEmbedding(0x11));
+
+  session_id++;
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, FACEAUTH_MATCH),
+      MakeTask(session_id, 0x2, FACEAUTH_CMD_COMP), MakeEmbedding(0x11));
+  session_id++;
+  Run(MakeResult(session_id, FACEAUTH_ERR_INVALID_TOKEN),
+      MakeTask(session_id, 0x3, FACEAUTH_CMD_MIGRATE), MakeEmbedding(0x11));
+  session_id++;
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 4, 1, FACEAUTH_MATCH),
+      MakeTask(session_id, 0x4, FACEAUTH_CMD_MIGRATE, 1), MakeEmbedding(0x11));
+  session_id++;
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, 4, 2, FACEAUTH_MATCH),
+      MakeTask(session_id, 0x4, FACEAUTH_CMD_MIGRATE, 1), MakeEmbedding(0x11));
+
+  session_id++;
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, FACEAUTH_NOMATCH),
+      MakeTask(session_id, 0x3, FACEAUTH_CMD_COMP), MakeEmbedding(0x11));
+  session_id++;
+  Run(MakeResult(session_id, FACEAUTH_SUCCESS, FACEAUTH_MATCH),
+      MakeTask(session_id, 0x4, FACEAUTH_CMD_COMP), MakeEmbedding(0x11));
+}
+
 TEST_F(FaceAuthTest, ExhaustiveMatchMismatchTest) {
   FullMatchMismatchTest(1, 6, 0, 19);
   FullMatchMismatchTest(2, 5, 1, 18);