Browse Source

FileData tests

Jonas Pflanzer 5 năm trước cách đây
mục cha
commit
a722aef67d

+ 1 - 1
daemon/include/FileManager.h

@@ -161,7 +161,7 @@ public:
    *
    * @return next chnuk vector
    */
-  std::vector<std::string> getNextChunkFromList();
+  virtual std::vector<std::string> getNextChunkFromList();
 
   /**
    * Cancel current list command.

+ 7 - 4
daemon/src/JsonCommander.cpp

@@ -98,24 +98,27 @@ JsonCommander::executeListData(const Json::Value &message) {
   response.json["command"] = "listdata";
   Json::Value array;
 
+  const int remainingListchunks = fileManager.getRemainingListChunks();
   if (!message["chunk"].isInt() || !message["cancel"].isBool()) {
+    response.action = closeAndSend;
     response.json["cancel"] = true;
     response.json["remaining"] = -1;
     response.json["names"] = Json::arrayValue;
     response.json["error"] = "incorrect listdata command request";
-  } else if (fileManager.getRemainingListChunks() == 0) {
+  } else if (remainingListchunks == 0) {
     response.json["cancel"] = true;
     response.json["remaining"] = -1;
     response.json["names"] = Json::arrayValue;
     response.json["error"] = "there are no chunks to send";
   } else if (message["cancel"].asBool()) {
     response.json["cancel"] = true;
-    response.json["remaining"] = 0;
+    response.json["remaining"] =
+        message["chunk"].asInt(); // so it can be associated to the request
     response.json["names"] = Json::arrayValue;
     response.json["error"] = "";
     fileManager.cancelList();
-  } else if (fileManager.getRemainingListChunks() - 1 !=
-             message["chunk"].asInt()) {
+  } else if (remainingListchunks - 1 != message["chunk"].asInt()) {
+    response.action = closeAndSend;
     response.json["cancel"] = true;
     response.json["remaining"] = -1;
     response.json["names"] = Json::arrayValue;

+ 1 - 0
daemon/test/FileManagerMock.h

@@ -28,6 +28,7 @@ public:
   MOCK_METHOD(int, openList,(), (override));
   MOCK_METHOD(int, getRemainingListChunks, (), (override));
   MOCK_METHOD(int, getListSize, (), (override));
+  MOCK_METHOD(std::vector<std::string>, getNextChunkFromList, (), (override));
 };
 
 #endif

+ 205 - 0
daemon/test/JsonCommanderTest.cpp

@@ -695,4 +695,209 @@ TEST(List, EmptyList) {
   EXPECT_EQ(response.json["error"].asString(), "");
 }
 
+/* Listdata tests */
+
+void fillExampleFileList(std::vector<std::string> (&chunk)[3]) {
+  chunk[0].push_back("file01.txt");
+  chunk[0].push_back("bumdibumps");
+  chunk[0].push_back("1");
+  chunk[0].push_back("Ich habe Hunger.txt");
+  chunk[0].push_back("answerIs42");
+  chunk[0].push_back("123456789456115811");
+  chunk[0].push_back("kek");
+  chunk[1].push_back("1337");
+  chunk[1].push_back("cats.png");
+  chunk[1].push_back("more_cats.png");
+  chunk[1].push_back("ugly dog.tiff");
+  chunk[1].push_back("hello.txt");
+  chunk[1].push_back("bye.exe");
+  chunk[1].push_back("poster.pdf");
+  chunk[2].push_back("headbang.gif");
+  chunk[2].push_back("feelsbad.jpg");
+  chunk[2].push_back("hack.s");
+  chunk[2].push_back("SodiumChloride");
+  chunk[2].push_back(
+      "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst"
+      "uvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN"
+      "OPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
+}
+
+TEST(Listdata, Positive) {
+  FileManagerMock fileManager;
+
+  JsonCommander jsonCommander(fileManager);
+
+  const std::string command = "listdata";
+
+  const int chunks = 3;
+  std::vector<std::string> chunk[chunks];
+  fillExampleFileList(chunk);
+
+  int remaining = chunks - 1;
+
+  for (int k = 0; k < chunks; k++) {
+    Json::Value message;
+    message["command"] = command;
+    message["chunk"] = remaining;
+    message["cancel"] = false;
+
+    EXPECT_CALL(fileManager, getRemainingListChunks())
+        .WillOnce(testing::Return(remaining + 1));
+    EXPECT_CALL(fileManager, getNextChunkFromList())
+        .WillOnce(testing::Return(chunk[k]));
+
+    JsonCommander::Response response = jsonCommander.execute(message);
+
+    EXPECT_TRUE(response.action == JsonCommander::Action::send);
+    EXPECT_EQ(response.json["command"].asString(), command);
+    EXPECT_FALSE(response.json["cancel"].asBool());
+    EXPECT_EQ(response.json["remaining"].asInt(), remaining--);
+    EXPECT_TRUE(response.json["names"].isArray());
+    Json::Value array = response.json["names"];
+    EXPECT_EQ(array.size(), chunk[k].size());
+    for (int i = 0; i < 3; i++) {
+      EXPECT_EQ(array[i].asString(), chunk[k][i]);
+    }
+    EXPECT_EQ(response.json["error"].asString(), "");
+  }
+}
+
+TEST(Listdata, Cancel) {
+  FileManagerMock fileManager;
+
+  JsonCommander jsonCommander(fileManager);
+
+  const std::string command = "listdata";
+
+  const int chunks = 3;
+  std::vector<std::string> chunk[chunks];
+  fillExampleFileList(chunk);
+
+  int remaining = chunks - 1;
+
+  Json::Value message;
+  message["command"] = command;
+  message["chunk"] = remaining;
+  message["cancel"] = false;
+
+  EXPECT_CALL(fileManager, getRemainingListChunks())
+      .WillOnce(testing::Return(remaining + 1));
+  EXPECT_CALL(fileManager, getNextChunkFromList())
+      .WillOnce(testing::Return(chunk[0]));
+
+  JsonCommander::Response response = jsonCommander.execute(message);
+
+  EXPECT_TRUE(response.action == JsonCommander::Action::send);
+  EXPECT_EQ(response.json["command"].asString(), command);
+  EXPECT_FALSE(response.json["cancel"].asBool());
+  EXPECT_EQ(response.json["remaining"].asInt(), remaining--);
+  EXPECT_TRUE(response.json["names"].isArray());
+  Json::Value array = response.json["names"];
+  EXPECT_EQ(array.size(), chunk[0].size());
+  for (int i = 0; i < 3; i++) {
+    EXPECT_EQ(array[i].asString(), chunk[0][i]);
+  }
+  EXPECT_EQ(response.json["error"].asString(), "");
+
+  message = Json::Value();
+  message["command"] = command;
+  message["chunk"] = remaining;
+  message["cancel"] = true;
+
+  EXPECT_CALL(fileManager, getRemainingListChunks())
+      .WillOnce(testing::Return(remaining + 1));
+
+  response = jsonCommander.execute(message);
+  EXPECT_TRUE(response.action == JsonCommander::Action::send);
+  EXPECT_EQ(response.json["command"].asString(), command);
+  EXPECT_TRUE(response.json["cancel"].asBool());
+  EXPECT_EQ(response.json["remaining"].asInt(), remaining--);
+  EXPECT_TRUE(response.json["names"].isArray());
+  EXPECT_EQ(response.json["error"].asString(), "");
+}
+
+TEST(Listdata, WrongChunkNumber) {
+  FileManagerMock fileManager;
+
+  JsonCommander jsonCommander(fileManager);
+
+  const std::string command = "listdata";
+
+  const int chunks = 3;
+  int remaining = chunks - 1;
+
+  Json::Value message;
+  message["command"] = command;
+  message["chunk"] = remaining;
+  message["cancel"] = false;
+
+  // return smaller remaining
+  EXPECT_CALL(fileManager, getRemainingListChunks())
+      .WillOnce(testing::Return(remaining));
+
+  JsonCommander::Response response = jsonCommander.execute(message);
+
+  EXPECT_TRUE(response.action == JsonCommander::Action::closeAndSend);
+  EXPECT_EQ(response.json["command"].asString(), command);
+  EXPECT_TRUE(response.json["cancel"].asBool());
+  EXPECT_EQ(response.json["remaining"].asInt(), -1);
+  EXPECT_TRUE(response.json["names"].isArray());
+  EXPECT_TRUE(response.json["error"].asString().compare("") != 0);
+}
+
+TEST(Listdata, NoChunksToBeSend) {
+  FileManagerMock fileManager;
+
+  JsonCommander jsonCommander(fileManager);
+
+  const std::string command = "listdata";
+
+  const int chunks = 0;
+
+  Json::Value message;
+  message["command"] = command;
+  message["chunk"] = 1;
+  message["cancel"] = false;
+
+  // return smaller remaining
+  EXPECT_CALL(fileManager, getRemainingListChunks())
+      .WillOnce(testing::Return(chunks));
+
+  JsonCommander::Response response = jsonCommander.execute(message);
+
+  EXPECT_TRUE(response.action == JsonCommander::Action::send);
+  EXPECT_EQ(response.json["command"].asString(), command);
+  EXPECT_TRUE(response.json["cancel"].asBool());
+  EXPECT_EQ(response.json["remaining"].asInt(), -1);
+  EXPECT_TRUE(response.json["names"].isArray());
+  EXPECT_TRUE(response.json["error"].asString().compare("") != 0);
+}
+
+TEST(Listdata, InvalidRequest) {
+  FileManagerMock fileManager;
+
+  JsonCommander jsonCommander(fileManager);
+
+  const std::string command = "listdata";
+
+  const int chunks = 3;
+
+  Json::Value message;
+  message["command"] = command;
+  message["chunk"] = 1;
+
+  // return smaller remaining
+  EXPECT_CALL(fileManager, getRemainingListChunks())
+      .WillOnce(testing::Return(chunks));
+
+  JsonCommander::Response response = jsonCommander.execute(message);
+
+  EXPECT_TRUE(response.action == JsonCommander::Action::closeAndSend);
+  EXPECT_EQ(response.json["command"].asString(), command);
+  EXPECT_TRUE(response.json["cancel"].asBool());
+  EXPECT_EQ(response.json["remaining"].asInt(), -1);
+  EXPECT_TRUE(response.json["names"].isArray());
+  EXPECT_TRUE(response.json["error"].asString().compare("") != 0);
+}
+
 } // namespace