Skip to content
Snippets Groups Projects
identity_service_test.cc 4.98 KiB
Newer Older
  • Learn to ignore specific revisions
  • Daniel Lyubomirov's avatar
    Daniel Lyubomirov committed
    #include <vereign/service/identity_service.hh>
    
    #include <vereign/client_library/common_types.pb.h>
    #include <vereign/client_library/identity_types.pb.h>
    #include <vereign/client_library/types.gen.pb.h>
    #include <vereign/service/gen/passport_service.hh>
    #include <vereign/restapi/client_session.hh>
    #include <vereign/identity/provider.hh>
    #include <vereign/test/device.hh>
    #include <vereign/test/service_context.hh>
    #include <vereign/core/temp.hh>
    
    #include <vereign/core/fs.hh>
    
    Daniel Lyubomirov's avatar
    Daniel Lyubomirov committed
    
    #include <util/env.hh>
    #include <util/protobuf.hh>
    
    #include <catch2/catch.hpp>
    
    using namespace vereign;
    
    TEST_CASE("service::IdentityService::LoginWithNewDevice", "[vereign/service][.integration]") {
      auto public_key = test::RequireEnv("TEST_VEREIGN_PUB_KEY");
      auto host = test::RequireEnv("TEST_VEREIGN_API_HOST");
      auto port = test::GetEnv("TEST_VEREIGN_API_PORT", "https");
    
      // the old device is used later for new device confirmation and authorization
    
      auto old_storage_path = core::TempFilePath("test_db_");
      auto rm_old_storage_path = core::RemoveFileGuard{old_storage_path};
      auto old_device_ctx = test::ServiceContext{host, port, old_storage_path};
    
    Daniel Lyubomirov's avatar
    Daniel Lyubomirov committed
      auto old_device = test::Device{old_device_ctx};
      old_device.Login(public_key);
    
    
      auto storage_path = core::TempFilePath("test_db_");
      auto rm_storage_path = core::RemoveFileGuard{storage_path};
      auto service_context = test::ServiceContext{host, port, storage_path};
    
    Daniel Lyubomirov's avatar
    Daniel Lyubomirov committed
      auto service = service::IdentityService{
        service_context.IdentityProvider(),
        service_context.ClientSession()
      };
    
      // register new device
      auto req = std::make_unique<vereign::client_library::LoginFormNewDevice>();
      auto resp = std::make_unique<vereign::client_library::LoginFormNewDeviceResponse>();
      req->set_pin("foo");
    
      service.LoginWithNewDevice(req.get(), resp.get());
    
      CHECK(resp->error() == "");
      CHECK(resp->status() == "OK");
      REQUIRE(resp->code() == "200");
      REQUIRE(resp->has_data() == true);
    
      // confirm and authorize the new device using an old device
      old_device.ConfirmNewDevice(resp->data().qrcode(), resp->data().actionid());
      old_device.AuthorizeDevice(service_context.IdentityProvider().GetDeviceHash());
    
      // list passports with the new device
      auto list_req = std::make_unique<vereign::client_library::ListPassportsForm>();
      auto list_resp = std::make_unique<vereign::client_library::ListPassportsFormResponse>();
    
      auto passport_service = service::gen::PassportService{service_context.ClientSession()};
      auto list_result = passport_service.ListPassports(list_req.get(), list_resp.get());
    
      auto result = list_result.get();
    
      // std::cout << vereign::test::ProtobufToJson(*result.Response) << std::endl;
    
      auto& list = result.Response;
      CHECK(list->error() == "");
      CHECK(list->status() == "OK");
      REQUIRE(list->code() == "200");
      CHECK(list->data().size() > 0);
    
      for (const auto& passport : list->data()) {
    
    Daniel Lyubomirov's avatar
    Daniel Lyubomirov committed
        CHECK(passport.uuid().size() == 36);
      }
    }
    
    TEST_CASE("service::IdentityService::LoginWithPreviouslyAddedDevice", "[vereign/service][.integration]") {
      auto public_key = test::RequireEnv("TEST_VEREIGN_PUB_KEY");
      auto host = test::RequireEnv("TEST_VEREIGN_API_HOST");
      auto port = test::GetEnv("TEST_VEREIGN_API_PORT", "https");
    
      auto storage_path = core::TempFilePath("test_db_");
    
      auto rm_storage_path = core::RemoveFileGuard{storage_path};
    
      // prepare new device
      auto old_storage_path = core::TempFilePath("test_db_");
      auto rm_old_storage_path = core::RemoveFileGuard{old_storage_path};
      auto old_device_ctx = test::ServiceContext{host, port, old_storage_path};
    
    Daniel Lyubomirov's avatar
    Daniel Lyubomirov committed
      auto old_device = test::Device{old_device_ctx};
      old_device.Login(public_key);
      auto old_service_context = test::ServiceContext{host, port, storage_path};
      old_device.CreateNewDevice(old_service_context, "pin");
    
      auto service_context = test::ServiceContext{host, port, storage_path};
      auto service = service::IdentityService{
        service_context.IdentityProvider(),
        service_context.ClientSession()
      };
    
      auto req = std::make_unique<vereign::client_library::LoginFormPreviousAddedDevice>();
      req->set_pin("pin");
      auto resp = std::make_unique<vereign::client_library::EmptyResponse>();
    
      service.LoginWithPreviouslyAddedDevice(req.get(), resp.get());
    
      CHECK(resp->error() == "");
      CHECK(resp->status() == "OK");
      REQUIRE(resp->code() == "200");
    
      // list passports with the logged device
      auto list_req = std::make_unique<vereign::client_library::ListPassportsForm>();
      auto list_resp = std::make_unique<vereign::client_library::ListPassportsFormResponse>();
    
      auto passport_service = service::gen::PassportService{service_context.ClientSession()};
      auto list_result = passport_service.ListPassports(list_req.get(), list_resp.get());
    
      auto result = list_result.get();
    
      // std::cout << vereign::test::ProtobufToJson(*result.Response) << std::endl;
    
      auto& list = result.Response;
      CHECK(list->error() == "");
      CHECK(list->status() == "OK");
      REQUIRE(list->code() == "200");
      CHECK(list->data().size() > 0);
    
      for (const auto& passport : list->data()) {
    
    Daniel Lyubomirov's avatar
    Daniel Lyubomirov committed
        CHECK(passport.uuid().size() == 36);
      }
    }