I am writing a service where data will be stored on bigtable. I want to use bigtable emulator run the test. In setup when trying to start the emulator I get following error
java.lang.IllegalAccessError: class com.google.iam.v1.TestIamPermissionsRequest tried to access method 'com.google.protobuf.LazyStringArrayList com.google.protobuf.LazyStringArrayList.emptyList()' (com.google.iam.v1.TestIamPermissionsRequest and com.google.protobuf.LazyStringArrayList are in unnamed module of loader 'app')
at com.google.iam.v1.TestIamPermissionsRequest.<init>(TestIamPermissionsRequest.java:127)
at com.google.iam.v1.TestIamPermissionsRequest.<clinit>(TestIamPermissionsRequest.java:918)
at com.google.cloud.bigtable.admin.v2.stub.GrpcBigtableTableAdminStub.<clinit>(GrpcBigtableTableAdminStub.java:314)
at com.google.cloud.bigtable.admin.v2.BigtableTableAdminClient.create(BigtableTableAdminClient.java:150)
at com.ce.table.UserTableTest.setUp(UserTableTest.java:37)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at com.google.testing.junit.runner.internal.junit4.CancellableRequestFactory$CancellableRunner.run(CancellableRequestFactory.java:108)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at com.google.testing.junit.runner.junit4.JUnit4Runner.run(JUnit4Runner.java:116)
at com.google.testing.junit.runner.BazelTestRunner.runTestsInSuite(BazelTestRunner.java:145)
at com.google.testing.junit.runner.BazelTestRunner.main(BazelTestRunner.java:76)
I have tried to different combination of the versions of bigtable and io_grpc library. But I am not able to make any progress. I am not sure which version combination should work here.
Attaching my WORKSPACE, BUILD and Java test file for reference.
Java code:
package com.ce.table;
import com.ce.proto.v1.User;
import com.ce.util.Util;
import com.google.cloud.bigtable.admin.v2.BigtableTableAdminClient;
import com.google.cloud.bigtable.admin.v2.BigtableTableAdminSettings;
import com.google.cloud.bigtable.admin.v2.models.CreateTableRequest;
import com.google.cloud.bigtable.admin.v2.models.GCRules;
import com.google.cloud.bigtable.data.v2.BigtableDataClient;
import com.google.cloud.bigtable.data.v2.BigtableDataSettings;
import com.google.cloud.bigtable.emulator.v2.BigtableEmulatorRule;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import static org.junit.Assert.assertEquals;
public class UserTableTest {
@Rule
public final BigtableEmulatorRule bigtableEmulator = BigtableEmulatorRule.create();
private final String orgId = "test-org";
private final String projectId = "test-project";
private final String instanceId = "test-instance";
private Table userTable;
private BigtableDataClient dataClient;
@Before
public void setUp() throws IOException {
BigtableTableAdminSettings.Builder tableAdminSettings = BigtableTableAdminSettings.newBuilderForEmulator(
bigtableEmulator.getPort()).setProjectId(projectId).setInstanceId(instanceId);
BigtableTableAdminClient tableAdminClient = BigtableTableAdminClient.create(
tableAdminSettings.build());
tableAdminClient.createTable(CreateTableRequest.of(UserTable.TABLE_ID)
.addFamily(UserTable.COLUMN_FAMILY, GCRules.GCRULES.maxVersions(1)));
// Create Bigtable data client
BigtableDataSettings.Builder dataSettings = BigtableDataSettings.newBuilderForEmulator(
bigtableEmulator.getPort()).setProjectId(projectId).setInstanceId(instanceId);
dataClient = BigtableDataClient.create(dataSettings.build());
userTable = new UserTable(dataClient);
}
@Test
public void testSave() {
Map<String, String> data = new HashMap<>();
data.put("device", "android");
data.put("name", "test-user");
User user = User.newBuilder()
.setOrganizationId(orgId)
.setProjectId(projectId)
.setId("test-user-save")
.putAllData(data)
.build();
boolean savedUser = userTable.save(user);
assertEquals(true, savedUser);
}
@Test
public void testGet() {
String userId = "test-user-get";
String deviceKey = "device";
String deviceValue = "android";
String nameKey = "name";
String nameValue = "test-user";
Map<String, String> data = new HashMap<>();
data.put(deviceKey, deviceValue);
data.put(nameKey, nameValue);
User user = User.newBuilder()
.setOrganizationId(orgId)
.setProjectId(projectId)
.setId(userId)
.putAllData(data)
.build();
boolean savedUser = userTable.save(user);
assertEquals(true, savedUser);
Optional<User> getUserOpt = userTable.get(Util.createRowKey(orgId, projectId, userId));
User getUser = getUserOpt.get();
assertEquals(orgId, getUser.getOrganizationId());
assertEquals(projectId, getUser.getProjectId());
assertEquals(userId, getUser.getId());
Map<String, String> getUserDataMap = getUser.getDataMap();
assertEquals(getUserDataMap.get(deviceKey), data.get(deviceKey));
assertEquals(getUserDataMap.get(nameKey), data.get(nameKey));
}
}
My WORKSPACE file:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "rules_proto_grpc",
sha256 = "9ba7299c5eb6ec45b6b9a0ceb9916d0ab96789ac8218269322f0124c0c0d24e2",
strip_prefix = "rules_proto_grpc-4.5.0",
urls = ["https://github.com/rules-proto-grpc/rules_proto_grpc/releases/download/4.5.0/rules_proto_grpc-4.5.0.tar.gz"],
)
http_archive(
name = "com_google_googleapis",
sha256 = "0744d1a1834ab350126b12ebe2b4bb1c8feb5883bd1ba0a6e876cb741d569994",
strip_prefix = "googleapis-bcc476396e799806d3355e87246c6becf6250a70",
urls = ["https://github.com/googleapis/googleapis/archive/bcc476396e799806d3355e87246c6becf6250a70.tar.gz"],
)
load("@com_google_googleapis//:repository_rules.bzl", "switched_rules_by_language")
switched_rules_by_language(
name = "com_google_googleapis_imports",
java = True,
grpc = True,
)
load("@rules_proto_grpc//:repositories.bzl", "rules_proto_grpc_toolchains", "rules_proto_grpc_repos")
rules_proto_grpc_toolchains()
rules_proto_grpc_repos()
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains")
rules_proto_dependencies()
rules_proto_toolchains()
load("@rules_proto_grpc//java:repositories.bzl", rules_proto_grpc_java_repos = "java_repos")
rules_proto_grpc_java_repos()
load("@rules_jvm_external//:defs.bzl", "maven_install")
load("@io_grpc_grpc_java//:repositories.bzl", "IO_GRPC_GRPC_JAVA_ARTIFACTS", "IO_GRPC_GRPC_JAVA_OVERRIDE_TARGETS", "grpc_java_repositories")
maven_install(
artifacts = [
"net.devh:grpc-server-spring-boot-starter:2.15.0.RELEASE",
"io.grpc:grpc-stub:1.59.0",
"com.google.cloud:google-cloud-bigtable:2.29.1",
"com.google.cloud:google-cloud-bigtable-emulator:0.160.1",
] + IO_GRPC_GRPC_JAVA_ARTIFACTS,
generate_compat_repositories = True,
# override_targets = IO_GRPC_GRPC_JAVA_OVERRIDE_TARGETS,
fetch_sources = True,
repositories = [
"https://repo.maven.apache.org/maven2/",
],
)
load("@maven//:compat.bzl", "compat_repositories")
compat_repositories()
grpc_java_repositories()
BUILD File:
java_binary(
name = "datastore",
srcs = glob(["src/main/**/*.java"]),
main_class = "com.ce.Server",
resources = ["src/main/resources/application.properties"],
deps = [
"//protos/v1:java_lib_protos",
"//protos/v1:service_java_grpc",
"@maven//:com_google_auth_google_auth_library_oauth2_http",
"@maven//:com_google_cloud_google_cloud_bigtable",
"@maven//:com_google_protobuf_protobuf_java",
"@maven//:io_grpc_grpc_core",
"@maven//:net_devh_grpc_server_spring_boot_autoconfigure",
"@maven//:net_devh_grpc_server_spring_boot_starter",
"@maven//:org_springframework_boot_spring_boot",
"@maven//:org_springframework_boot_spring_boot_autoconfigure",
"@maven//:org_springframework_boot_spring_boot_starter",
"@maven//:org_springframework_spring_beans",
"@maven//:org_springframework_spring_context",
],
)
java_test(
name = "all_tests",
size = "small",
srcs = glob(["src/test/**/*.java"]),
test_class = "com.ce.AllTest",
deps = [
":datastore",
"//protos/v1:java_lib_protos",
"//protos/v1:service_java_grpc",
"@maven//:com_google_cloud_google_cloud_bigtable",
"@maven//:com_google_cloud_google_cloud_bigtable_emulator",
"@maven//:junit_junit",
],
)