code: def testConv(
      self, input_shape, kernel_shape, padding, sharding_specs, topology
  ):
      mesh_dims = [spec for spec in sharding_specs if spec != UNSHARDED]
      mesh = self._create_mesh(mesh_dims, topology)
  
      x_in = constant_op.constant(
          np.random.random(size=input_shape), dtype=dtypes.float32
      )
      kernel_in = constant_op.constant(
          np.random.random(size=kernel_shape), dtype=dtypes.float32
      )
  
      expected_output = nn_ops.conv2d_v2(
          x_in, kernel_in, strides=[1, 1, 1, 1], padding=padding
      )
  
      input_layout = Layout(sharding_specs, mesh)
      kernel_layout = Layout.replicated(mesh, 4)
  
      d_x_in = numpy_util.pack_numpy(x_in, input_layout)
      d_kernel_in = numpy_util.pack_numpy(kernel_in, kernel_layout)
      d_output = nn_ops.conv2d_v2(
          d_x_in, d_kernel_in, strides=[1, 1, 1, 1], padding=padding
      )
  
      self.assertDTensorEqual(expected_output, input_layout, d_output)
  
imports: from absl.testing import parameterized
  import numpy
  from tensorflow.dtensor.python import layout
  from tensorflow.dtensor.python import numpy_util
  from tensorflow.dtensor.python.tests import test_util
  from tensorflow.python.eager import backprop
  from tensorflow.python.eager.polymorphic_function import polymorphic_function
  from tensorflow.python.framework import constant_op
  from tensorflow.python.framework import dtypes
  from tensorflow.python.ops import nn_ops
  from tensorflow.python.ops import special_math_ops
  from tensorflow.python.platform import test
label_desc: Use image node_id 3 for calling the SpatiallyPartitionedConvOpTest obj's underlying member method code with example usage: obj.testConv(input_shape, kernel_shape, padding, sharding_specs, topology) without return types