diff --git a/cartofacade/capi.go b/cartofacade/capi.go index 65e2eb110..3f260140f 100644 --- a/cartofacade/capi.go +++ b/cartofacade/capi.go @@ -259,15 +259,14 @@ func (vc *Carto) getInternalState() ([]byte, error) { return nil, err } + interalState := bstringToByteSlice(value.internal_state) + status = C.viam_carto_get_internal_state_response_destroy(&value) if err := toError(status); err != nil { return nil, err } - if value.internal_state != nil { - return bstringToByteSlice(value.internal_state), nil - } - return nil, errors.New("nil internal state") + return interalState, nil } // this function is only used for testing purposes, but needs to be in this file as CGo is not supported in go test files diff --git a/viam-cartographer/src/carto_facade/carto_facade.cc b/viam-cartographer/src/carto_facade/carto_facade.cc index f35283bbe..47f9c29bc 100644 --- a/viam-cartographer/src/carto_facade/carto_facade.cc +++ b/viam-cartographer/src/carto_facade/carto_facade.cc @@ -605,7 +605,8 @@ void CartoFacade::GetPointCloudMap(viam_carto_get_point_cloud_map_response *r) { // https://viam.atlassian.net/browse/RSDK-3878 void CartoFacade::GetInternalState(viam_carto_get_internal_state_response *r) { boost::uuids::uuid uuid = boost::uuids::random_generator()(); - std::string filename = path_to_internal_state + "/" + "temp_internal_state_" + + std::string filename = path_to_internal_state + "/" + + "temp_internal_state_" + boost::uuids::to_string(uuid) + ".pbstream"; { std::lock_guard lk(map_builder_mutex); diff --git a/viam-cartographer/src/carto_facade/carto_facade_test.cc b/viam-cartographer/src/carto_facade/carto_facade_test.cc index bfd05b75a..cd36d6ac3 100644 --- a/viam-cartographer/src/carto_facade/carto_facade_test.cc +++ b/viam-cartographer/src/carto_facade/carto_facade_test.cc @@ -616,6 +616,28 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { VIAM_CARTO_POINTCLOUD_MAP_EMPTY); } + // GetInternalState + // Every call to AddSensorReading after the first one (for some + // unknown reason) should be persisted in the the internal state. + int last_internal_state_response_size = 0; + { + BOOST_TEST(viam_carto_get_internal_state_response_destroy(nullptr) == + VIAM_CARTO_GET_INTERNAL_STATE_RESPONSE_INVLALID); + BOOST_TEST(viam_carto_get_internal_state(nullptr, nullptr) == + VIAM_CARTO_VC_INVALID); + BOOST_TEST(viam_carto_get_internal_state(vc, nullptr) == + VIAM_CARTO_GET_INTERNAL_STATE_RESPONSE_INVLALID); + + viam_carto_get_internal_state_response isr; + BOOST_TEST(viam_carto_get_internal_state(vc, &isr) == + VIAM_CARTO_SUCCESS); + BOOST_TEST(blength(isr.internal_state) > + last_internal_state_response_size); + last_internal_state_response_size = blength(isr.internal_state); + BOOST_TEST(viam_carto_get_internal_state_response_destroy(&isr) == + VIAM_CARTO_SUCCESS); + } + // GetPosition unchanged from failed AddSensorReading requests { viam_carto_get_position_response pr; @@ -678,6 +700,19 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { VIAM_CARTO_POINTCLOUD_MAP_EMPTY); } + { + viam_carto_get_internal_state_response isr; + BOOST_TEST(viam_carto_get_internal_state(vc, &isr) == + VIAM_CARTO_SUCCESS); + // special case: apparently the first call to AddSensorReading doesn't + // change the internal state, but subsequent calls do. + BOOST_TEST(blength(isr.internal_state) == + last_internal_state_response_size); + last_internal_state_response_size = blength(isr.internal_state); + BOOST_TEST(viam_carto_get_internal_state_response_destroy(&isr) == + VIAM_CARTO_SUCCESS); + } + // second sensor reading { VLOG(1) << "viam_carto_add_sensor_reading 2"; @@ -725,6 +760,17 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { VIAM_CARTO_SUCCESS); } + { + viam_carto_get_internal_state_response isr; + BOOST_TEST(viam_carto_get_internal_state(vc, &isr) == + VIAM_CARTO_SUCCESS); + BOOST_TEST(blength(isr.internal_state) > + last_internal_state_response_size); + last_internal_state_response_size = blength(isr.internal_state); + BOOST_TEST(viam_carto_get_internal_state_response_destroy(&isr) == + VIAM_CARTO_SUCCESS); + } + // third sensor reading { VLOG(1) << "viam_carto_add_sensor_reading 3"; @@ -754,12 +800,16 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { VIAM_CARTO_SUCCESS); } - // GetInternalState - viam_carto_get_internal_state_response isr; - BOOST_TEST(viam_carto_get_internal_state(vc, &isr) == VIAM_CARTO_SUCCESS); - - BOOST_TEST(viam_carto_get_internal_state_response_destroy(&isr) == - VIAM_CARTO_SUCCESS); + { + viam_carto_get_internal_state_response isr; + BOOST_TEST(viam_carto_get_internal_state(vc, &isr) == + VIAM_CARTO_SUCCESS); + BOOST_TEST(blength(isr.internal_state) > + last_internal_state_response_size); + last_internal_state_response_size = blength(isr.internal_state); + BOOST_TEST(viam_carto_get_internal_state_response_destroy(&isr) == + VIAM_CARTO_SUCCESS); + } // Stop BOOST_TEST(viam_carto_stop(vc) == VIAM_CARTO_SUCCESS);