aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/core/client/tensor_c_api_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tensorflow/core/client/tensor_c_api_test.cc')
-rw-r--r--tensorflow/core/client/tensor_c_api_test.cc94
1 files changed, 94 insertions, 0 deletions
diff --git a/tensorflow/core/client/tensor_c_api_test.cc b/tensorflow/core/client/tensor_c_api_test.cc
new file mode 100644
index 0000000000..4afdd0c0df
--- /dev/null
+++ b/tensorflow/core/client/tensor_c_api_test.cc
@@ -0,0 +1,94 @@
+#include "tensorflow/core/public/tensor_c_api.h"
+
+#include <gtest/gtest.h>
+#include "tensorflow/core/public/tensor.h"
+
+using tensorflow::Tensor;
+using tensorflow::TensorShape;
+
+namespace tensorflow {
+bool TF_Tensor_DecodeStrings(TF_Tensor* src, Tensor* dst, TF_Status* status);
+TF_Tensor* TF_Tensor_EncodeStrings(const Tensor& src);
+} // namespace tensorflow
+
+TEST(CApi, Status) {
+ TF_Status* s = TF_NewStatus();
+ EXPECT_EQ(TF_OK, TF_GetCode(s));
+ EXPECT_EQ(tensorflow::string(), TF_Message(s));
+ TF_SetStatus(s, TF_CANCELLED, "cancel");
+ EXPECT_EQ(TF_CANCELLED, TF_GetCode(s));
+ EXPECT_EQ(tensorflow::string("cancel"), TF_Message(s));
+ TF_DeleteStatus(s);
+}
+
+static void Deallocator(void* data, size_t, void* arg) {
+ tensorflow::cpu_allocator()->DeallocateRaw(data);
+ *reinterpret_cast<bool*>(arg) = true;
+}
+
+TEST(CApi, Tensor) {
+ float* values =
+ reinterpret_cast<float*>(tensorflow::cpu_allocator()->AllocateRaw(
+ EIGEN_MAX_ALIGN_BYTES, 6 * sizeof(float)));
+ tensorflow::int64 dims[] = {2, 3};
+ bool deallocator_called = false;
+ TF_Tensor* t = TF_NewTensor(TF_FLOAT, dims, 2, values, sizeof(values),
+ &Deallocator, &deallocator_called);
+ EXPECT_FALSE(deallocator_called);
+ EXPECT_EQ(TF_FLOAT, TF_TensorType(t));
+ EXPECT_EQ(2, TF_NumDims(t));
+ EXPECT_EQ(dims[0], TF_Dim(t, 0));
+ EXPECT_EQ(dims[1], TF_Dim(t, 1));
+ EXPECT_EQ(sizeof(values), TF_TensorByteSize(t));
+ EXPECT_EQ(static_cast<void*>(values), TF_TensorData(t));
+ TF_DeleteTensor(t);
+ EXPECT_TRUE(deallocator_called);
+}
+
+static void TestEncodeDecode(int line,
+ const std::vector<tensorflow::string>& data) {
+ const tensorflow::int64 n = data.size();
+ for (std::vector<tensorflow::int64> dims :
+ std::vector<std::vector<tensorflow::int64>>{
+ {n}, {1, n}, {n, 1}, {n / 2, 2}}) {
+ // Create C++ Tensor
+ Tensor src(tensorflow::DT_STRING, TensorShape(dims));
+ for (tensorflow::int64 i = 0; i < src.NumElements(); i++) {
+ src.flat<tensorflow::string>()(i) = data[i];
+ }
+ TF_Tensor* dst = TF_Tensor_EncodeStrings(src);
+
+ // Convert back to a C++ Tensor and ensure we get expected output.
+ TF_Status* status = TF_NewStatus();
+ Tensor output;
+ ASSERT_TRUE(TF_Tensor_DecodeStrings(dst, &output, status)) << line;
+ ASSERT_EQ(TF_OK, TF_GetCode(status)) << line;
+ ASSERT_EQ(src.NumElements(), output.NumElements()) << line;
+ for (tensorflow::int64 i = 0; i < src.NumElements(); i++) {
+ ASSERT_EQ(data[i], output.flat<tensorflow::string>()(i)) << line;
+ }
+
+ TF_DeleteStatus(status);
+ TF_DeleteTensor(dst);
+ }
+}
+
+TEST(CApi, TensorEncodeDecodeStrings) {
+ TestEncodeDecode(__LINE__, {});
+ TestEncodeDecode(__LINE__, {"hello"});
+ TestEncodeDecode(__LINE__,
+ {"the", "quick", "brown", "fox", "jumped", "over"});
+
+ tensorflow::string big(1000, 'a');
+ TestEncodeDecode(__LINE__, {"small", big, "small2"});
+}
+
+TEST(CApi, SessionOptions) {
+ TF_SessionOptions* opt = TF_NewSessionOptions();
+ TF_DeleteSessionOptions(opt);
+}
+
+// TODO(jeff,sanjay): Session tests
+// . Create and delete
+// . Extend graph
+// . Run