code: def test_read_undone_from_datastore_same_shards(self):
      self.reset_work_pieces()
      self.work1["shard_id"] = 1
      self.work_pieces.work["w10"] = self.work1
      self.work2["shard_id"] = 2
      self.work_pieces.work["w20"] = self.work2
      self.work_pieces.write_all_to_datastore()
      self.reset_work_pieces()
      # return value is ID of the shard with undone work
      self.assertEqual(
          2,
          self.work_pieces.read_undone_from_datastore(
              shard_id=2, num_shards=3
          ),
      )
      # Only work with ID 'w20' is undone
      self.assertDictEqual({"w20": self.work2}, self.work_pieces.work)
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import copy
  import unittest
  from six import assertCountEqual
  from six import itervalues
  from eval_lib import work_data
  from eval_lib.tests import fake_cloud_client
label_desc: Use image node_id 8 for calling the WorkPiecesBaseTest obj's underlying member method code with example usage: obj.test_read_undone_from_datastore_same_shards() without return types