Skip to content

Commit

Permalink
test: add Spanner JSON test suite (#1376)
Browse files Browse the repository at this point in the history
Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly:
- [ ] Make sure to open an issue as a [bug/issue](https://github.com/googleapis/java-spanner/issues/new/choose) before writing your code!  That way we can discuss the change, evaluate designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)

Fixes #<issue_number_goes_here> ☕️
  • Loading branch information
zoercai committed Sep 1, 2021
1 parent c320f47 commit 7efa796
Show file tree
Hide file tree
Showing 284 changed files with 438 additions and 0 deletions.
@@ -0,0 +1,151 @@
/*
* Copyright 2021 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.google.cloud.spanner.it;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThrows;
import static org.junit.Assume.assumeFalse;

import com.google.cloud.spanner.Database;
import com.google.cloud.spanner.DatabaseClient;
import com.google.cloud.spanner.IntegrationTestEnv;
import com.google.cloud.spanner.Mutation;
import com.google.cloud.spanner.ParallelIntegrationTest;
import com.google.cloud.spanner.ResultSet;
import com.google.cloud.spanner.SpannerException;
import com.google.cloud.spanner.Statement;
import com.google.cloud.spanner.Value;
import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
import com.google.cloud.spanner.testing.RemoteSpannerHelper;
import com.google.common.io.Resources;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

@Category(ParallelIntegrationTest.class)
@RunWith(JUnit4.class)
public class ITJsonWriteReadTest {

private static final String RESOURCES_DIR = "com/google/cloud/spanner/it/";
private static final String VALID_JSON_DIR = "valid";
private static final String INVALID_JSON_DIR = "invalid";

private static final String TABLE_NAME = "TestTable";

@ClassRule public static IntegrationTestEnv env = new IntegrationTestEnv();

private static DatabaseClient databaseClient;

@BeforeClass
public static void beforeClass() {
final RemoteSpannerHelper testHelper = env.getTestHelper();
if (!EmulatorSpannerHelper.isUsingEmulator()) {
final Database database =
testHelper.createTestDatabase(
"CREATE TABLE "
+ TABLE_NAME
+ "("
+ "Id INT64 NOT NULL,"
+ "json JSON"
+ ") PRIMARY KEY (Id)");
databaseClient = testHelper.getDatabaseClient(database);
}
}

@Test
public void testWriteValidJsonValues() throws IOException {
assumeFalse("Emulator does not yet support JSON", EmulatorSpannerHelper.isUsingEmulator());

List<String> resources = getJsonFilePaths(RESOURCES_DIR + File.separator + VALID_JSON_DIR);

long id = 0L;
List<Mutation> mutations = new ArrayList<>();
for (String resource : resources) {
String jsonStr =
Resources.toString(
Resources.getResource(this.getClass(), VALID_JSON_DIR + File.separator + resource),
StandardCharsets.UTF_8);
Mutation mutation =
Mutation.newInsertBuilder(TABLE_NAME)
.set("Id")
.to(id++)
.set("json")
.to(Value.json(jsonStr))
.build();
mutations.add(mutation);
}
databaseClient.write(mutations);

try (ResultSet resultSet =
databaseClient
.singleUse()
.executeQuery(Statement.of("SELECT COUNT(*) FROM " + TABLE_NAME))) {
resultSet.next();
assertEquals(resultSet.getLong(0), resources.size());
}
}

@Test
public void testWriteAndReadInvalidJsonValues() throws IOException {
assumeFalse("Emulator does not yet support JSON", EmulatorSpannerHelper.isUsingEmulator());

List<String> resources = getJsonFilePaths(RESOURCES_DIR + File.separator + INVALID_JSON_DIR);

AtomicLong id = new AtomicLong(100);
for (String resource : resources) {
String jsonStr =
Resources.toString(
Resources.getResource(this.getClass(), INVALID_JSON_DIR + File.separator + resource),
StandardCharsets.UTF_8);
assertThrows(
SpannerException.class,
() ->
databaseClient.write(
Collections.singletonList(
Mutation.newInsertBuilder(TABLE_NAME)
.set("Id")
.to(id.getAndIncrement())
.set("json")
.to(Value.json(jsonStr))
.build())));
}
}

private List<String> getJsonFilePaths(String folder) throws IOException {
String fixturesRoot = Resources.getResource(folder).getPath();
final Path fixturesRootPath = Paths.get(fixturesRoot);
return Files.walk(fixturesRootPath)
.filter(Files::isRegularFile)
.map(path -> fixturesRootPath.relativize(path).toString())
.filter(path -> path.endsWith(".json"))
.collect(Collectors.toList());
}
}
@@ -0,0 +1 @@
[1 true]
@@ -0,0 +1 @@
[a�]
@@ -0,0 +1 @@
["": 1]
@@ -0,0 +1 @@
[""],
@@ -0,0 +1 @@
[,1]
@@ -0,0 +1 @@
[1,,2]
@@ -0,0 +1 @@
["x",,]
@@ -0,0 +1 @@
["x"]]
@@ -0,0 +1 @@
["",]
@@ -0,0 +1 @@
["x"
@@ -0,0 +1 @@
[x
@@ -0,0 +1 @@
[3[4]]
@@ -0,0 +1 @@
[]
@@ -0,0 +1 @@
[1:2]
@@ -0,0 +1 @@
[,]
@@ -0,0 +1 @@
[-]
@@ -0,0 +1 @@
[ , ""]
@@ -0,0 +1,3 @@
["a",
4
,1,
@@ -0,0 +1 @@
[1,]
@@ -0,0 +1 @@
[1,,]
@@ -0,0 +1 @@
[" a"\f]
@@ -0,0 +1 @@
[*]
@@ -0,0 +1 @@
[""
@@ -0,0 +1 @@
[1,
@@ -0,0 +1,3 @@
[1,
1
,1
@@ -0,0 +1 @@
[{}
@@ -0,0 +1 @@
[fals]
@@ -0,0 +1 @@
[nul]
@@ -0,0 +1 @@
[tru]
@@ -0,0 +1 @@
[++1234]
@@ -0,0 +1 @@
[+1]
@@ -0,0 +1 @@
[+Inf]
@@ -0,0 +1 @@
[-01]
@@ -0,0 +1 @@
[-1.0.]
@@ -0,0 +1 @@
[-2.]
@@ -0,0 +1 @@
[-NaN]
@@ -0,0 +1 @@
[.-1]
@@ -0,0 +1 @@
[.2e-3]
@@ -0,0 +1 @@
[0.1.2]
@@ -0,0 +1 @@
[0.3e+]
@@ -0,0 +1 @@
[0.3e]
@@ -0,0 +1 @@
[0.e1]
@@ -0,0 +1 @@
[0E+]
@@ -0,0 +1 @@
[0E]
@@ -0,0 +1 @@
[0e+]
@@ -0,0 +1 @@
[0e]
@@ -0,0 +1 @@
[1.0e+]
@@ -0,0 +1 @@
[1.0e-]
@@ -0,0 +1 @@
[1.0e]
@@ -0,0 +1 @@
[1 000.0]
@@ -0,0 +1 @@
[1eE2]
@@ -0,0 +1 @@
[2.e+3]
@@ -0,0 +1 @@
[2.e-3]
@@ -0,0 +1 @@
[2.e3]
@@ -0,0 +1 @@
[9.e+]
@@ -0,0 +1 @@
[Inf]
@@ -0,0 +1 @@
[NaN]
@@ -0,0 +1 @@
[1]
@@ -0,0 +1 @@
[1+2]
@@ -0,0 +1 @@
[0x1]
@@ -0,0 +1 @@
[0x42]
@@ -0,0 +1 @@
[Infinity]
@@ -0,0 +1 @@
[0e+-1]
@@ -0,0 +1 @@
[-123.123foo]
@@ -0,0 +1 @@
[123�]
@@ -0,0 +1 @@
[1e1�]
@@ -0,0 +1 @@
[0�]
@@ -0,0 +1 @@
[-Infinity]
@@ -0,0 +1 @@
[-foo]
@@ -0,0 +1 @@
[- 1]
@@ -0,0 +1 @@
[-012]
@@ -0,0 +1 @@
[-.123]
@@ -0,0 +1 @@
[-1x]
@@ -0,0 +1 @@
[1ea]
@@ -0,0 +1 @@
[1e�]
@@ -0,0 +1 @@
[1.]
@@ -0,0 +1 @@
[.123]
@@ -0,0 +1 @@
[1.2a-3]
@@ -0,0 +1 @@
[1.8011670033376514H-308]
@@ -0,0 +1 @@
[012]
@@ -0,0 +1 @@
["x", truth]
@@ -0,0 +1 @@
{[: "x"}

0 comments on commit 7efa796

Please sign in to comment.